SQLServerのバックアップファイルは上位互換がないよって話と、なんとかデータコピーしたらいろいろ躓いたよって話【SQLServer】
先日、業務にて何気なくSQLServer2016の環境から取得したバックアップファイルを
SQLServer2012の環境へ復元(RESTORE DATABASE)したところエラーになった。
メッセージは確か
「SqlError:データベースはバージョン(13.xxx)実行中のサーバーにバックアップされました。このバージョンは、このサーバー(バージョン11.xxxを実行)とは互換性がありません。」
みたいな感じだった。
調べてみると普通にSQLServerには上位互換がないため、新しいバージョンのバックアップファイルでは古いバージョンで復元できない様子。
参考:SQL Serverのバージョンが異なるため復元に失敗する
しかし、何とかSQLServer2012上のDBに対象データを復元したかったのでいろいろ試行錯誤をしてみました。
その結果、SSMSを使ってデータの複製が行えたのでその時の作業内容と詰まったことを書きます。
まず、試したこと。
SQLServer2016のDBへ接続し、「タスク > データのエクスポート」から
元「SQLServer2016」→先「SQLServer2012」を指定しエクスポートを実行した。
このとき、エクスポート先のDBにはテーブルを未作成の状態だったのでデータエクスポート時にテーブルの作成も合わせて行うよう指定していた。
簡単に行けそうだと思った矢先、不思議なことが起こった。
まず、datetime型のカラムのエクスポートにてエラーが発生した。
※エラーメッセージは、型変換失敗みたいな感じのやつだった?と思う。
調べてみると、エクスポートの設定(マッピングの設定)でdatatimeのカラムがsmalldatetimeと定義されており、作成されたテーブルの型に元データが格納できずエラーになった。
検証としてSQLServer2012からSQLServer2012に対してデータエクスポートをしたが事象は発生せず、SQLServer2016からSQLServer2012に対してのみ発生した。
意味がわからないので、SQLServerの不具合と勝手に考えるようにした。
(ちなみに、numeric型がdecimal型に変わっていたりもした。)対応としては、マッピングで正しい型を定義してあげることでエラーなくエクスポートが行えた。
また、あらかじめエクスポート先に正しい定義でテーブルを作成しておいてもカラムの型が変換されることなくエクスポートが正常に行えた。
私は、取得したいテーブルが400以上あったのであらかじめテーブルを作成しておく手法で実践した。
そこでまた問題が発生した。
事前に作成していたテーブル内にIDENTITY(自動採番)を持つカラムが存在したためエクスポートがエラーになった。
※IDENTITYがあるとエラーになるのはエクスポートの仕様らしい。
今回はデータの抽出がしたいだけなので、エクスポート先のテーブルをIDENTITYを外して再作成して対応したが、定義ごと必要になったらINSERTスクリプトでも抽出して手動でメンテナンスをするほかなさそう…
(参考としてIDENTITYを持つカラムは以下のSQLで抽出した。)
SELECT obj.name, col.name, col.column_id, col.is_identity FROM sys.columns col INNER JOIN sys.object obj ON col.object_id = obj.object_id AND obj.type = 'U' WHERE col.is_identity = 1 ORDER BY obj.name,col.column_id ;
ただデータを取得したかっただけなのにSQLServerのバージョン違いにより
四苦八苦しましたよって話。
素直に同じバージョンの環境が用意出来れば問題ないんだけど
どうしてもバージョン差異が出てしまうときはいろいろ気を遣わないとダメだってことを実感しました。
以上、本日の記録。
コメント
コメントを投稿