1 つのスペース エクスポートに複数のオブジェクトが含まれ、別のサーバーまたはクラウド インスタンスへのインポート時にエラーが発生して失敗する
プラットフォームについて: Server および Data Center のみ。この記事は、Server および Data Center プラットフォームのアトラシアン製品にのみ適用されます。
Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Fisheye および Crucible は除く
要約
Confluence Server または Cloud インスタンスにスペース エクスポート ファイルをインポートしようとすると "Could not execute statement" or "Duplicate key"
" エラーで失敗する。スペース エクスポートは別の Confluence Server または Cloud インスタンスである。
atlassian-confluence.log ファイル内では、スペース キーの制約違反についての例が確認できる。
ERROR: duplicate key value violates unique constraint "uk_jp1ad5yufsih5r7lqrygakpug"
OR
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Violation of UNIQUE KEY constraint 'UK_jp1ad5yufsih5r7lqrygakpug'
環境
この問題は Confluence Server および Data Center 6.x 以降で確認されています。
原因
この問題の原因にはさまざまな問題が考えられます。
サーバー ベースのインスタンス
スペース エクスポートがサーバー インスタンスから取得されている場合、 - CONFSERVER-45278Getting issue details... STATUS のデータベースの不一致によって発生している可能性があります。別の既知の問題としてページの移動に関連するものがあります。この問題の完全な説明については - CONFSERVER-77826Getting issue details... STATUS をご確認ください。ここには、スペースのエクスポート前に問題をプロアクティブに確認して解決するために利用できるクエリも含まれています。
クラウド ベースのインスタンス
クラウドのスペース エクスポートに別のスペースのコンテンツまたはスペースのメタデータが含まれている可能性があることがわかっています。
- CONFCLOUD-62976Getting issue details... STATUS
- CONFCLOUD-64563Getting issue details... STATUS
- CONFDEV-62751Getting issue details... STATUS
- CONFCLOUD-72415Getting issue details... STATUS
診断
サーバー ベースのインスタンス
スペース エクスポートがサーバー インスタンスで作られたものの場合は次のクエリを使い、サーバー インスタンスのデータベースがこの問題の影響を受けているかどうかを確認できます。
SELECT COUNT(*)
FROM CONTENT
JOIN CONTENT xpage ON CONTENT.PAGEID = xpage.CONTENTID
WHERE CONTENT.SPACEID != xpage.SPACEID
UNION ALL
SELECT COUNT(*)
FROM CONTENT
JOIN CONTENT xpage ON CONTENT.PARENTID = xpage.CONTENTID
WHERE CONTENT.SPACEID != xpage.SPACEID
UNION ALL
SELECT COUNT(*)
FROM CONTENT
JOIN CONTENT xpage ON CONTENT.PREVVER = xpage.CONTENTID
WHERE CONTENT.SPACEID != xpage.SPACEID;
クエリでゼロのみが返される場合、ご利用のデータベースはこの問題の影響を受けていません。この場合はエクスポート/インポートの問題のトラブルシューティング支援についてアトラシアン サポートにお問い合わせください。クエリでゼロ以外の値が返される場合、ご利用のデータベースは影響を受けています。
このクエリはスペースのインポート先ではなくエクスポート元の Confluence データベースに対して実行する必要があります。
クラウド ベースのインスタンス
Confluence Cloud インスタンスから取得した単一のスペースをインポートする場合、エクスポート ファイルには 1 つのスペースのオブジェクトのみが含まれる必要があります。複数のスペースのオブジェクトが含まれているかどうかを確認するには、entities.xml ファイルに対して次のコマンドを実行します。このファイルはスペースのエクスポート ファイルから抽出できます。
|
複数の結果が返される場合、エクスポート ファイルに余分なスペース オブジェクトが含まれ、Confluence インスタンスへのインポート前に修正が必要です。
ソリューション
エクスポート元の Confluence データベースで見つかった問題
エクスポート元のインスタンスのデータベースがこの問題を影響を受けていることがわかったら (上記の診断を参照)、不一致を修正する必要があります。
- ご利用のデータベースの完全なバックアップを作成します。この修正を本番環境に適用する前にステージングまたはテスト環境に適用することを強く推奨します。ここでは PostgreSQL および MySQL を利用していますが、これらの SQL ステートメントはサポート対象の任意のデータベースで動作します。
Confluence を停止します。
ご利用のデータベースで次の SQL ステートメントを実行します。
ゼロ以外の値が返される場合はこの手順を繰り返してステートメントを再度実行します。ゼロのみが返される場合は問題が修正済みであるため、次の手順に進めます。
- Confluence を再起動します。
- > [一般設定] > [キャッシュ管理] に移動して Content Objects のキャッシュをフラッシュします。
これで、Confluence Server サイトからスペースを再度エクスポートし、別の Confluence サイトにインポートできます。
データベースの変更を行う場合は必ず事前にバックアップを取得してください。可能な場合は、まずステージング サーバーで SQL コマンドの変更、挿入、更新、または削除を行うようにします。
データベースの変更を行う場合は必ず事前にバックアップを取得してください。可能な場合は、まずステージング サーバーで SQL コマンドの変更、挿入、更新、または削除を行うようにします。
クラウド製品のスペース エクスポートで見つかった問題
この挙動を軽減するにはいくつかの方法があります。
オプション 1: SED コマンドによるリネーム
1 つめのオプションでは、entities.xml
ファイルに含まれる余分な不要のスペース キーを、宛先インスタンスに存在しないスペース キーにリネームします。管理者は、宛先インスタンスに存在しないスペース キーを選択する必要があります。重複すると結果として同じ挙動になります。また、この方法では、インポートの完了後、インポートの結果発生した余分なスペースを管理者が削除する必要があります。このため、あとから削除できるよう、インポートされる余分なスペースの一覧を保持しておくことが非常に重要です。
この例には、大文字と小文字の値両方のための sed コマンドが含まれます。破損を防ぐため、記載された例に従って大文字と小文字を利用してください。
- 安全のため、
entities.xml
ファイルのバックアップ コピーを作成します ファイルを編集し、OLDKEY と NEWKEY それぞれの値を置き換えて次のコマンドを実行します。
sed -i -e
's/\[OLDKEY\]/\[NEWKEY\]/g'
entities.xml
sed -i -e
's/spaceKey=OLDKEY/spaceKey=NEWKEY/g'
entities.xml
sed -i -e
's/\[OLDKEY:/\[NEWKEY:/g'
entities.xml
sed -i -e
's/key=OLDKEY\]/key=NEWKEY\]/g'
entities.xml
sed -i -e
's/<spaceKey>OLDKEY<\/spaceKey>/<spaceKey>NEWKEY<\/spaceKey>/g'
entities.xml
sed -i -e
's/ri:space-key="OLDKEY"/ri:space-key="NEWKEY"/g'
entities.xml
sed -i -e
's/ri:space-key=OLDKEY/ri:space-key=NEWKEY/g'
entities.xml
sed -i -e
's/<ac:parameter ac:name="spaces">OLDKEY<\/ac:parameter>/<ac:parameter ac:name="spaces">NEWKEY<\/ac:parameter>/g'
entities.xml
sed -i -e
's/<ac:parameter ac:name="spaceKey">OLDKEY<\/ac:parameter>/<ac:parameter ac:name="spaceKey">NEWKEY<\/ac:parameter>/g'
entities.xml
sed -i -e
's/<property name="lowerDestinationSpaceKey"><!\[CDATA\[NEWKEY\]\]><\/property>/<property name="lowerDestinationSpaceKey"><!\[CDATA\[newkey\]\]><\/property>/g'
entities.xml
sed -i -e
's/<property name="lowerKey"><!\[CDATA\[NEWKEY\]\]><\/property>/<property name="lowerKey"><!\[CDATA\[newkey\]\]><\/property>/g'
entities.xml
sed -i -e
's/<property name="lowerKey"><!\[CDATA\[oldkey\]\]><\/property>/<property name="lowerKey"><!\[CDATA\[newkey\]\]><\/property>/g'
entities.xml
sed -i -e
's/spaceKey=OLDKEY/spaceKey=NEWKEY/g'
entities.xml
sed -i -e
's/spacekey=oldkey/spacekey=newkey/g'
entities.xml
- クラウドのエクスポートされた zip ファイルから
exportDescriptor.properties
ファイルを見つけ、スペース キーの値のリネームがそこでも行われるようにします。 - ファイルの編集が完了したらディレクトリ全体を再度圧縮します。
- インポートを再度行う前に、次のドキュメントに従ってデータベース内の余分なデータをクリーンアップするようにします。スペース インポートの失敗後、スペース データが残っているために再インポートが行えない
オプション 2: 新しい Confluence サーバー環境から新しいエクスポート ファイルを再生成する
In this method, rather than clean up the export file itself, we can import the file as is into a clean Confluence instance which will ensure that a duplicate space key error will be not be thrown on import. From there, we can generate a new export of the singular intended space key which will not contain any references to the extra space.
宛先インスタンスと同じバージョンのクリーンな Confluence インスタンスを用意するようにします。
- 新しい Confluence インスタンスを立ち上げます。
- Import the Cloud export file as is and make sure it completes successfully.
Run the following SQL queries to check if the Confluence server instance is impacted as well:
SELECT COUNT(*) FROM CONTENT JOIN CONTENT xpage ON CONTENT.PAGEID = xpage.CONTENTID WHERE CONTENT.SPACEID != xpage.SPACEID UNION ALL SELECT COUNT(*) FROM CONTENT JOIN CONTENT xpage ON CONTENT.PARENTID = xpage.CONTENTID WHERE CONTENT.SPACEID != xpage.SPACEID UNION ALL SELECT COUNT(*) FROM CONTENT JOIN CONTENT xpage ON CONTENT.PREVVER = xpage.CONTENTID WHERE CONTENT.SPACEID != xpage.SPACEID;
If any non-zero values are returned, follow resolution detailed under "For Issues Found within the Source Confluence Database"
- Head to Content Tools > Export of the desired space. Select XML > Full Export and create the new export file.
- 宛先インスタンスへのインポートを再度行う前に、次のドキュメントに従ってデータベース内の余分なデータをクリーンアップするようにします。スペース インポートの失敗後、スペース データが残っているために再インポートが行えない