Microsoft SQL Server の Confluence データベースの照合を修正する方法
プラットフォームについて: Data Center - この記事は、Data Center プラットフォームのアトラシアン製品に適用されます。
このナレッジベース記事は製品の Data Center バージョン用に作成されています。Data Center 固有ではない機能の Data Center ナレッジベースは、製品のサーバー バージョンでも動作する可能性はありますが、テストは行われていません。サーバー*製品のサポートは 2024 年 2 月 15 日に終了しました。サーバー製品を利用している場合は、アトラシアンのサーバー製品のサポート終了のお知らせページにて移行オプションをご確認ください。
*Fisheye および Crucible は除く
目的
Confluence の新しいバージョンではデータベース要件が厳重になっています。これは、ユーザーがコンテンツで作業する際に、データベース内のコンテンツにかかわらず最高に一貫したエクスペリエンスを提供できるようにするためです。
Microsoft SQL Server では、次のレベルで異なる照合セットがあるため、照合が複雑になる場合があります。
- データベース レベル
- カラム レベル
ご利用の Microsoft SQL Server データベースで推奨される照合を使用していない場合、この手順を使用して弊社のドキュメント「SQL Server の推奨されるデータベース セットアップ」に合わせることができます。
この手順は、2 つのサーバー間で適切な照合を保持しながら SQL Server データベースを移動するためにも使用できます。
ソリューション
はじめる前に
データベースの変更を行う場合は必ず事前にバックアップを取得してください。可能な場合は、まずステージング サーバーで SQL コマンドの変更、挿入、更新、または削除を行うようにします。
この手順を実行するには、SQL Server Management Studio がバージョン 2008 である必要があります。SQL Server Management Studio 2005 をご利用の場合、少なくとも 2008 にアップグレードするか、Confluence データベースを SQL Server Management 2008 または最新のものに移行する必要があります。
また、SQL Server でフルテキストのインデックスを利用している場合、変更を行う前にそれらを削除する必要があります。
次のクエリを実行して、サーバーでフルテキストのインデックスが有効化されているかどうかを確認します。
USE [mydbname]
SELECT fulltextserviceproperty('isfulltextinstalled')
上記のクエリで 1 が返される場合、インデックスを保持しているテーブルを特定して削除する必要があります (出力が 0 の場合は次のセクションに進んでください)。
- フルテキストのインデックスを持っているテーブルを特定します。
- テーブルのフルテキストのインデックスを削除します。
また、フルテキスト カタログを削除します。
該当有無の確認
古いデータベースで次のクエリを実行します。何らかの結果が返される場合は Confluence の新しいバージョンにアップグレードする前に照合を調整する必要があります。
SELECT object_name(object_id) as TableName, name as ColumnName, collation_name
FROM sys.columns
WHERE collation_name <> 'SQL_Latin1_General_CP1_CS_AS'
AND object_name(object_id) NOT LIKE 'sys%'
AND object_name(object_id) NOT LIKE 'queue%'
AND object_name(object_id) NOT LIKE 'file%'
AND object_name(object_id) NOT LIKE 'spt%'
AND object_name(object_id) NOT LIKE 'MSrep%'
AND object_name(object_id) NOT LIKE 'sqlagent_job%'
AND object_name(object_id) NOT LIKE 'plan_persist%'
新しいデータベースの作成
まず、当社の「SQL Server のデータベース セットアップ」ガイドラインに従って新しいデータベースを作成します。照合が SQL_Latin1_General_CP1_CS_AS
に設定されていることを確認します。
データベース テーブルの作成
既存のデータベースからデータベース テーブルが作成されます。SQL Server Management Studio で古いデータベースを右クリックします。
- [Tasks] > [Generate Scripts...] の順にクリックします。
- [Choose Objects] 画面で [Select specific database objects] を選択します。
- [Tables] を選択します。これにより、データベースそのものを除く、データベース内のすべてのオブジェクトが選択されます (新しいデータベースを作成済みであるため)。
- [Set Scripting Options] で [Advanced] をクリックし、次のオプションを調整します。
- [Script USE DATABASE] を false に設定
- [Script Full-Text Indexes] を true に設定
- [Script Indexes] を true に設定
[Next] > [Finish] の順にクリック
スクリプトを実行する前に、テキストベースのカラムのデータ タイプを国際化されたバージョンに変更する必要があります。これにより、さまざまな照合のデータをインポートできるようになります (Active Objects テーブルの問題も修正されます)。
テキスト エディタを使い、次の内容を特に変更する必要があります。
varchar
>nvarchar
char
>nchar
text
>ntext
nvarnchar などの値が発生しないよう、完全置換を行うようにします。
- 新しいデータベースに対してスクリプトを実行します。この時点で新しいデータベースにはテーブルが含まれますがデータは含まれません。
インポート前に制約チェックを無効化
データをインポートする前に、データベース内のすべてのテーブルで制約チェックを一時的に無効化する必要があります。新しいデータベースに対して次のクエリを実行します。
EXEC sp_MSforeachtable"ALTER TABLE ? NOCHECK CONSTRAINT all"
古いデータベースからデータをインポート
データをエクスポートする手順を実行する前に、テーブルを生成するための手順である、前述の「データベース テーブルの作成」以降を完了していることをご確認ください。これらの手順が完了されていなかったために、データベースにプライマリ キーやインデックスが作成されなかった事例があります。先に進む前に、いくつかのテーブルでインデックスやプライマリ キーが適切に作成されているのを確認することをおすすめします。
エクスポート ウィザードが完了すると同じ名前の 2 つのデータベースが作成されるため、このセクションを始める前に十分なディスク容量があることを確認してください。
SQL Server Management Studio で古いデータベースを右クリックします。
- [Tasks] > [Export Data...] の順にクリックします。
- [Choose a Data Source] 画面で、古いデータベースが選択されていることを確認します。次に [Next] をクリックします。
- [Choose a Destination] 画面で新しいデータベース用の接続情報を提供します。これは通常は同じサーバーになりますが、認証を行える任意の SQL Server を利用できます。次に [Next] をクリックします。
- [Copy Data from one or more tables or views] を選択して [Next] をクリックします。
- [Select Source Tables and Views] で、すべてのテーブルが選択済みで、すべてのテーブルがハイライトされていることを確認します。
- テーブルがハイライトされた状態で [Edit Mappings...] をクリックします。
- 適切なスキーマが選択されていること (通常は
DBO
が適切なスキーマです) と、[Enable Identity Insert] が選択されていることを確認します。[OK] をクリックします。 - [Next] をクリックしてデータ転送を完了します。データベースの大きさや、利用されているデータベース サーバーの速度により、このプロセスには時間がかかることがあります。
インポート後に制約チェックを再有効化
インポートが完了したら、データベースの制約チェックを再有効化する必要があります。新しいデータベースに対して次のクエリを実行します。
EXEC sp_MSforeachtable"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
移行が正常に完了したことを確認
診断クエリを再度実行し、誤った照合を持つ行が存在しないことを確認します。
Confluence のデータベース接続を調整して (server.xml または confluence.cfg.xml のデータソース)、新しいデータベースを指すようにします。
Confluence を起動し、すべてが適切に動作されていることを確認します。
お困りですか?
アトラシアン サポートに、次の情報を添えてお問い合わせください。
- 古いデータベースから生成した SQL スクリプト
- 転送プロセスでエラーが発生している場合はエラー メッセージ
- Home ディレクトリから取得した最新の Confluence ログ
照合を修正して、問題のトラブルシューティングをお手伝いいたします。