復元に失敗した XML バックアップのトラブルシューティング
XML サイト バックアップは、新しいデータベースに移行する場合にのみ必要です。Confluence のアップグレード、テスト サーバーの設定または本番環境のバックアップ戦略については、SQL ダンプで行うほうが適切です。
サイトまたはスペースのバックアップの作成またはインポート時にエラーが発生する場合
問題 | ソリューション |
---|---|
バックアップ作成時の例外 | |
バックアップ インポート時の例外 | 下記の手順参照 |
一般的な問題
小規模サイトをアップロードし、インポートするには、
- [管理] > [一般設定] > [バックアップとリストア] に移動します。
- [サイトまたはスペースのエクスポート ファイルのアップロード] で、[ファイルの選択] をクリックし、スペース エクスポート ファイルを参照します。
- あとのステージでインデックスを作成する場合、インデックス作成 のチェックを外します。
- [アップロードとインポート] を選択します。
ホーム ディレクトリからサイトをインポートするには、次の手順を実行します。
- エクスポート ファイルを
<confluence-home>/restore.
にコピーします。
(このディレクトリが置かれている場所がわからない場合は、バックアップと復元 画面にパスが一覧表示されています) - [管理] > [一般設定] > [バックアップとリストア] に移動します。
- [ホーム ディレクトリからインポート] で、サイト エクスポート ファイルを選択します。
- あとのステージでインデックスを作成する場合、インデックス作成 のチェックを外します。
- インポートを選択します。
XML バックアップの復元の試行時のエラーの解決
データベースのわずかな破損によってエラーが発生する場合があります。DB ルールに違反している XML バックアップ ファイルのエントリーを見つけて、そのエントリーを修正し、XML バックアップを再作成する必要があります。
- 復元されたインスタンスで、バッチ アップデート(単純なデバック用)、SQL クエリのログ記録、「詳細な SQL ログの有効化」のパラメータ付き SQL クエリのログ記録を無効化する手順を実施します。
- 3つの変更が完了したら、Confluence を再起動します。
- 別の復元を試します。
- 復元が失敗したら、application log ファイルと (インストール ディレクトリにある)
catalina.<datestamp>.log
を確認して、XML 形式に変換できなかったオブジェクトを確認します。 ファイルの一番下までスクロールし、データベース制約の違反に関する最後のエラーを特定します。例:
2006-07-13 09:32:33,372 ERROR [confluence.importexport.impl.ReverseDatabinder] endElement net.sf.hibernate.exception.ConstraintViolationException: could not insert: [com.atlassian.confluence.pages.Attachment#38] net.sf.hibernate.exception.ConstraintViolationException: could not insert: [com.atlassian.confluence.pages.Attachment#38] ... Caused by: java.sql.SQLException: ORA-01400: cannot insert NULL into ("CONFUSER"."ATTACHMENTS"."TITLE") at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
この例では、attachment テーブルの ID = 38 の行でタイトルが null になっていることを示しています。
- 作成されたバックアップのあるサーバーに移動します。作成されたバックアップからコピーを取得する必要があります。これを行わないと、DBA ツールを使用してデータベースの手動バックアップを復元することができません。
- DBA ツールを開いて、元のデータベース インスタンスに接続し、スキーマのテーブル名をスキャンします。これらのテーブルのいずれかの行を編集する必要があります。
- テーブルを特定するには、ログ ファイルを開き、例外の最初の行を確認します。以下は、データベースでのオブジェクトとテーブル間のマッピングを確認するための概要です。
- ページ、ブログ投稿、コメント --> CONTENT テーブル
- 添付ファイル --> ATTACHMENTS テーブル
- 上記の例のエラーを修正するには、attachment テーブルに移動し、id が 38 の attachment オブジェクトを見つけます。このオブジェクトのタイトルは null です。ガイドとして他の添付ファイルのタイトルを使用してタイトルを指定します。異なるエラーの場合も、適切にデータベースを修正してください。
- エントリーを修正したら、XML バックアップを再作成します。
- バックアップを新しいバージョンにインポートします。
- インポートが成功したら、SQL ログに関する変更を元に戻し、無効化したバッチ アップデートを再度有効化し、SQL クエリのログ記録と、パラメータ付き SQL クエリのログ記録をオフにします。
- Confluence を再起動します。
キー「cp_」または「cps_」についての「重複エントリー」のトラブルシューティング
以下のようなエラーメッセージが発生した場合
com.atlassian.confluence.importexport.ImportExportException: Unable to complete import because the data does not match the constraints in the Confluence schema. Cause: MySQLIntegrityConstraintViolationException: Duplicate entry '1475804-Edit' for key 'cps_unique_type'
これは、XML エクスポートが 3rd パーティ製プラグインによって破損した権限データベースを持つ Confluence のバージョンからエクスポートされたものであることを示しています。これは、CONF-22123 が Confluence 3.5.2 で修正されたときの問題です。最も単純な回避策は、インスタンスを 3.5.2 以上にアップグレードした後に再度スペースをエクスポートすることです。これができない場合、エクスポートを手動で編集して、重複した権限エントリーを削除するか、ソース インスタンスで不都合なエントリーを削除する必要があります。このようなエントリーを検索するため、以下の SQL クエリを使用することができます。
SELECT * FROM CONTENT_PERM WHERE USERNAME IS NULL AND GROUPNAME IS NULL;
SELECT cp.ID, cp.CP_TYPE, cp.USERNAME, cp.GROUPNAME, cp.CPS_ID, cp.CREATOR,
cp.CREATIONDATE, cp.LASTMODIFIER, cp.LASTMODDATE
FROM CONTENT_PERM cp
WHERE cp.USERNAME IS NOT NULL AND cp.GROUPNAME IS NOT NULL;
SELECT cps1.ID, cps1.CONTENT_ID, cps1.CONT_PERM_TYPE FROM CONTENT_PERM_SET cps1, CONTENT_PERM_SET cps2
WHERE cps1.ID <> cps2.ID AND
cps1.CONTENT_ID = cps2.CONTENT_ID AND
cps1.CONT_PERM_TYPE = cps2.CONT_PERM_TYPE
ORDER BY cps1.CONTENT_ID, cps1.CONT_PERM_TYPE, cps1.CREATIONDATE ASC;
SELECT cp.ID, cp.CP_TYPE, cps.CONTENT_ID,
(SELECT scps.ID FROM CONTENT_PERM_SET scps WHERE scps.CONTENT_ID = cps.CONTENT_ID AND scps.CONT_PERM_TYPE = cp.CP_TYPE) AS suggested_cps_id
FROM CONTENT_PERM cp, CONTENT_PERM_SET cps
WHERE cp.CPS_ID = cps.ID AND
cp.CP_TYPE <> cps.CONT_PERM_TYPE;
SELECT DISTINCT cp1.ID, cp1.CP_TYPE, cp1.USERNAME, cp1.GROUPNAME, cp1.CPS_ID,
cp1.CREATOR, cp1.CREATIONDATE, cp1.LASTMODIFIER, cp1.LASTMODDATE
FROM CONTENT_PERM cp1, CONTENT_PERM_SET cps1, CONTENT_PERM cp2, CONTENT_PERM_SET cps2
WHERE
cp1.CPS_ID = cps1.ID AND
cp2.CPS_ID = cps2.ID AND
cp1.ID <> cp2.ID AND
cps1.CONTENT_ID = cps2.CONTENT_ID AND
cp1.CP_TYPE = cp2.CP_TYPE AND
cp1.USERNAME = cp2.USERNAME
ORDER BY cp1.CPS_ID, cp1.CP_TYPE, cp1.USERNAME, cp1.CREATIONDATE;
SELECT DISTINCT cp1.ID, cp1.CP_TYPE, cp1.USERNAME, cp1.GROUPNAME, cp1.CPS_ID,
cp1.CREATOR, cp1.CREATIONDATE, cp1.LASTMODIFIER, cp1.LASTMODDATE
FROM CONTENT_PERM cp1, CONTENT_PERM_SET cps1, CONTENT_PERM cp2, CONTENT_PERM_SET cps2
WHERE
cp1.CPS_ID = cps1.ID AND
cp2.CPS_ID = cps2.ID AND
cp1.ID <> cp2.ID AND
cps1.CONTENT_ID = cps2.CONTENT_ID AND
cp1.CP_TYPE = cp2.CP_TYPE AND
cp1.GROUPNAME = cp2.GROUPNAME
ORDER BY cp1.CPS_ID, cp1.CP_TYPE, cp1.GROUPNAME, cp1.CREATIONDATE;
SELECT * FROM CONTENT_PERM_SET
WHERE ID NOT IN (SELECT DISTINCT CPS_ID FROM CONTENT_PERM);
すべての一致するエントリーを削除し、再度エクスポートを実施します。
「重複キー」に関連する問題のトラブルシューティング
以下のようなエラーメッセージが発生した場合
could not insert: [bucket.user.propertyset.BucketPropertySetItem#bucket.user.propertyset.BucketPropertySetItem@a70067d3]; SQL []; Violation of PRIMARY KEY constraint 'PK_OS_PROPERTYENTRY314D4EA8'. Cannot insert duplicate key in object 'OS_PROPERTYENTRY'.; nested exception is java.sql.SQLException: Violation of PRIMARY KEY constraint 'PKOS_PROPERTYENTRY_314D4EA8'. Cannot insert duplicate key in object 'OS_PROPERTYENTRY'.
これは、主キー制約「PK_OS_PROPERTYENTRY_314D4EA8」がテーブル「OS_PROPERTYENTRY」内で重複するエントリーを持つことを示しています。
テーブル「OS_PROPERTYENTRY」内の「PK_OS_PROPERTYENTRY_314D4EA8」を参照する制約キーを見つけ、重複している値を探し、削除することで、「主キー」を一意にします。「OS_PROPERTYENTRY」テーブル内の重複エントリーを一覧表示するクエリの例は以下のとおりです。
SELECT ENTITY_NAME,ENTITY_ID,ENTITY_KEY,COUNT(*) FROM OS_PROPERTYENTRY GROUP BY ENTITY_NAME,ENTITY_ID,ENTITY_KEY HAVING COUNT(*)>1
「net.sf.hibernate.PropertyValueException: not-null」に関連する問題のトラブルシューティング
以下のようなメッセージが表示された場合
ERROR [Importing data task] [confluence.importexport.impl.ReverseDatabinder] endElement net.sf.hibernate.PropertyValueException: not-null property references a null or transient value: com.atlassian.user.impl.hibernate.DefaultHibernateUser.name
これは、テーブル内に予期せぬ null の値があることを意味しています。上記の例では、エラーは USERS テーブルの名前にあります。ATTACHMENTS テーブルでもこれらがありました。
null の値を含む行を削除し、xml エクスポートをやり直し、再度インポートします。
この問題の再発を防ぐ方法
- 組み込みデータベースを使用している場合、これは評価用にバンドルされており、突然停電が発生した場合、完全なトランザクションの整合性を提供しないため、本番環境での使用には外部データベースを推奨していることに注意してください。外部データベースに移行する必要があります。
- 最新より前のバージョンの Confluence を使用している場合、この時点でアップグレードを検討する必要があります。
大文字と小文字の区別に関するさまざまな設定の問題は、データベース間で変化します。データベースの大文字と小文字の区別は通常、使用する照合によって設定されます。既存の問題に投票してください。