ServiceDesk Plus オンプレミス版 ナレッジベース

【既知の不具合】リストアに失敗する


確認ビルド

ServiceDesk Plusビルド11144、11204、11208

問題

リストアに失敗します。

原因

現行の仕様のリストアは、一度データベースのすべてのテーブルのすべてのデータを削除し、その後、新しいデータのリストアが行われますが、一部の環境では、データの削除クエリがすべて同じトランザクション内で実行されるため、共有メモリ不足による障害が発生します。

本不具合の見分け方

<インストールディレクトリ>\ManageEngine\ServiceDeskの「SDPRestore.log」に以下が記載されていることを確認してください。

Deleting all tables...
Error occurred while deletion of all the table,
Note: Reinitialize, start and stop the application and perform the restore
Error Tables : wordmap,wordoccurrences,errorlog,softwarelist,softwaremanufacturer
SB_Applications
Reason For failure: バッチ 0 INSERT INTO SB_Applications (appl_id,appl_name,appl_desc,template_meta_handler,dc_type) VALUES(1, 'MetaPersistence', NULL, NULL, NULL) はアボートしました: ERROR: duplicate key value violates unique constraint "sb_applications_pk"
詳細: Key (appl_id)=(1) already exists. このバッチの他のエラーは getNextException を呼び出すことで確認できます。java.sql.BatchUpdateException: バッチ 0 INSERT INTO SB_Applications (appl_id,appl_name,appl_desc,template_meta_handler,dc_type) VALUES(1, 'MetaPersistence', NULL, NULL, NULL) はアボートしました: ERROR: duplicate key value violates unique constraint "sb_applications_pk"
詳細: Key (appl_id)=(1) already exists. このバッチの他のエラーは getNextException を呼び出すことで確認できます。
at org.postgresql.jdbc.BatchResultHandler.handleError(BatchResultHandler.java:169)
at org.postgresql.core.ResultHandlerDelegate.handleError(ResultHandlerDelegate.java:52)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2286)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:521)
at org.postgresql.jdbc.PgStatement.internalExecuteBatch(PgStatement.java:870)
at org.postgresql.jdbc.PgStatement.executeBatch(PgStatement.java:893)
at com.adventnet.servicedesk.tools.RestoreSDBackup.restoreTableData(RestoreSDBackup.java:992)
at com.adventnet.servicedesk.tools.RestoreSDBackup.restoreDatabase(RestoreSDBackup.java:459)
at com.adventnet.servicedesk.tools.RestoreSDBackup.main(RestoreSDBackup.java:144)
at com.adventnet.servicedesk.tools.RestoreDialog$5.run(RestoreDialog.java:188)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "sb_applications_pk"
詳細: Key (appl_id)=(1) already exists.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2285)
... 8 more

上記と同様のトレースが記載されていない場合、他の要因が原因でリストアに失敗している可能性があります。その際は本手順を実施せず、技術サポートへお問い合わせください。
解決策

手順は以下の通りです。

  1. <インストールディレクトリ>\ManageEngine\ServiceDesk\pgsql\dataにある「postgresql.conf」をメモ帳で開きます。
  2. 「#max_locks_per_transaction = 64」を探します。
  3. 上記を「max_locks_per_transaction = 2512」に変更し、保存します。
  4. リストア処理を実行します。
  5. リストアが成功後、「postgresql.conf」の「max_locks_per_transaction = 2512」を「#max_locks_per_transaction = 64」に変更し、保存します。
  6. ServiceDesk Plusを再起動します。

上記手順より、共有メモリを増強し、リストアが正常に完了します。

「max_locks_per_transaction」は、各トランザクションに割り当てられるオブジェクトロック数を制御しています。つまり、このパラメーターはトランザクションでロックできるオブジェクトの数を指しています。デフォルトの設定値は「64」で、通常であればリストア処理が動作するためには十分な値ですが、回避策としてトランザクションごとにロックできるオブジェクト数の値を増やすことで不具合を回避しています。

修正予定ビルド

バージョン11.3のリリースで修正予定です。