以前、SQLServerのデータベース復元について書いたが、今回は上位バージョンのSQLServerから下位バージョンのSQLServerへの復元が必要になったので、そちらの手順について覚書。
以前の記事はこちら。
marusho1266.com
SQLServerの復元を依頼されたので対応をしていたのだが、以下のようなメッセージが出力された。
今回対応したSQLServerの各バージョンが以下のようになっている。
復元元:SQLServer2019
復元先:SQLServer2017
SQLServerのバックアップ復元機能は下位互換をサポートしていないようで、通常の手順での復元が出来ない。なので別の方法を取る必要がある。
プロパティの互換性レベルを変えてバックアップを取るなど、色々試したがどれも同じメッセージが出力されていたが、以下の方法で何とか復元が出来た。
流れとしては、
①復元元の各モジュールをスクリプト化して、復元先に作成
②復元元から復元先へデータをエクスポート
のようになる。
以下に詳細な手順を示していく
- 復元元のオブジェクトの出力
- 復元先サーバーにオブジェクトを作成
- 復元先テーブルのIDENTITYプロパティの解除
- 復元元データベースのデータをエクスポート
- 復元先テーブルのIDENTITYプロパティを再設定
復元元のオブジェクトの出力
①復元したいデータベースを右クリックし「タスク → スクリプトの生成」を選択
②「次へ」を選択
③「データベース全体をすべてのデータベース オブジェクトのスクリプトを作成」を選択し、「次へ」を選択
④「詳細設定」をクリック
⑤「サーバーのバージョン互換のスクリプト」で復元先のサーバーバージョンを選択
※今回は対象の「SQL Server 2017」を選択
⑥「スクリプトを作成するデータの種類」で「スキーマのみ」を選択
※選択肢に「スキーマとデータ」があり、これでもいけそうだが、今回の復元対象データベースはデータサイズが大きくこちらでは出来なかった。サイズが小さい場合はこちらでも良さそう。
⑦スクリプトファイルの名称と保存先を指定
復元先テーブルの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のバージョンアップをおすすめする。