SQLServerでの下位バージョンへのデータベース復元について

以前、SQLServerのデータベース復元について書いたが、今回は上位バージョンのSQLServerから下位バージョンのSQLServerへの復元が必要になったので、そちらの手順について覚書。

以前の記事はこちら。
marusho1266.com


SQLServerの復元を依頼されたので対応をしていたのだが、以下のようなメッセージが出力された。

今回対応したSQLServerの各バージョンが以下のようになっている。
 復元元:SQLServer2019
 復元先:SQLServer2017

SQLServerのバックアップ復元機能は下位互換をサポートしていないようで、通常の手順での復元が出来ない。なので別の方法を取る必要がある。

プロパティの互換性レベルを変えてバックアップを取るなど、色々試したがどれも同じメッセージが出力されていたが、以下の方法で何とか復元が出来た。

流れとしては、
 ①復元元の各モジュールをスクリプト化して、復元先に作成
 ②復元元から復元先へデータをエクスポート

のようになる。


以下に詳細な手順を示していく

復元元のオブジェクトの出力

①復元したいデータベースを右クリックし「タスク → スクリプトの生成」を選択


②「次へ」を選択


③「データベース全体をすべてのデータベース オブジェクトのスクリプトを作成」を選択し、「次へ」を選択


④「詳細設定」をクリック


⑤「サーバーのバージョン互換のスクリプト」で復元先のサーバーバージョンを選択

※今回は対象の「SQL Server 2017」を選択


⑥「スクリプトを作成するデータの種類」で「スキーマのみ」を選択

※選択肢に「スキーマとデータ」があり、これでもいけそうだが、今回の復元対象データベースはデータサイズが大きくこちらでは出来なかった。サイズが小さい場合はこちらでも良さそう。


スクリプトファイルの名称と保存先を指定

復元先サーバーにオブジェクトを作成

①復元先サーバーのSSMSで出力したスクリプトファイルを開く


スクリプトを実行

※データベースの保存先などを変更する場合はテキストを直接修正する

復元先テーブルのIDENTITYプロパティの解除

扱っているテーブルにIDENTITYプロパティが無ければ不要だが、ある場合は後述のエクスポートでエラーが発生するので、確認の意味でも実施をする。

①復元先サーバーのSSMSで対象データベースに対して以下のコマンドを実行

SELECT 
    t.name AS TableName,
    c.name AS ColumnName
FROM 
    sys.tables t
JOIN 
    sys.columns c ON t.object_id = c.object_id
WHERE 
    c.is_identity = 1
ORDER BY t.name;

取得結果は以下のようになる。

この結果より、対象データベースでIDENTITYプロパティを利用しているテーブルが分かるので、結果が取得できた場合は以降をさらに実施。


②復元先サーバーのSSMSで対象テーブルのデザインを開く


③対象項目を選択し、IDENTITYの指定で「いいえ」を選択

この時、増分を控えておくようにする。初期値は1だが、1以外の場合は再設定する時に指定する必要がある。


復元元データベースのデータをエクスポート

①復元元データベースを右クリックし「タスク → データのエクスポート」を選択


②「NEXT」を選択


③データソースで「SQL Server Native Client」を選択


④復元元の必要情報を入力する


⑤データソースで「SQL Server Native Client」を選択


⑥復元先の必要情報を入力


⑦復元したいテーブルにチェックを入れ、「NEXT」を選択


⑧「すぐに実行する」にチェックが入っていることを確認し、「NEXT」を選択


⑨設定内容が正しいことを確認し、「Finish」を選択

復元先テーブルのIDENTITYプロパティを再設定

※復元先テーブルのIDENTITYプロパティの解除を行っていない場合は不要な手順

①解除と同じ手順で対象テーブルのデザインを開く

②対象項目を選択し、IDENTITYの指定で「はい」を選択
増分が1以外の場合は先に控えた値をIDの増分に入力する。



以上が下位バージョンへの復元の手順となる。
ただし、IDENTITYプロパティの再設定などはトラブルの温床なので、可能ならばSQLServerのバージョンアップをおすすめする。