2015年4月15日水曜日

Amazon Relational Database Service(Amazon RDS)へのデータ移行(1)SQL Server編

大須賀です。




最近ちょっとテストでAmazon RDSへのデータ移行を行っている関係で、データ移行について記事にしてみました。

各DBMSの移行方法はAWSでドキュメントされていますが、すべて英語の情報の翻訳のようです。
なので、日本語の入ったデータを移行しようとすると、いろいろ引っかかります。

あろうことか、いちばん問題なく移行できたのはOracleでした(笑

■ SQL Server

社内で別サーバーにデータ移行するときは、SQL Serverのバックアップから一気にDB生成する方法でしたが、RDSはDBが常にリモートになりますので、この方法が使えません。

AWSの資料ではbcpでコピーせよと言う事なので実行しようとしたところ、bcpはテーブル単位でしか実行できません。テーブルが大量なので、結構な作業になります。
仕方がないのでテーブル一覧を取得し、バッチ力を駆使して実行しました。

use DBNAME
select s.name + '.' + t.name stname from sys.tables t, sys.schemas s
where t.schema_id = s.schema_id order by stname

SQL Serverのsys.tablesとsys.scemasを読んで「スキーマ名.テーブル名」の文字列を作るわけです。
これをsqlcmdかManagement Studioのクエリツールで実行し、結果をテキストファイル(AllTables.txt)にします。

そしてコマンドラインからfor文のダイレクト実行。

for /F %I IN (AllTables.txt) DO bcp %I out %I.dat -S localhost
                   -U {user} -P {password} -d {db name} -n -b 10000

これでカレントディレクトリに「スキーマ名.テーブル名.dat」でテーブルごとのエクスポートファイルが出来ます。

ディレクトリごと圧縮してEC2へ転送し、EC2上でインポートのコマンドを実行しますが、bcpではCREATEは行われませんので、テーブル構築スクリプトを作成しますが、SQL Serverの場合、Management Studioでメニューから生成できるので楽ちんです。

テーブルが出来たら、bcpの実行。

幸いにしてテストDBなのでFOREIGN KEYはないので、テーブルは単純なアルファベット順のままです。FOREIGN KEYがある場合には、AllTables.txtで参照される側を参照側より前に並べ替える必要があります。

for /F %I IN (AllTables.txt) DO bcp %I in %I.dat -S {rds servername} 
            -U {rss user} -P {rds password} -d {rds db name} -n -b 10000

思いの他あっさり移行できたと思いきや、SELECTすると見事な文字化け。
いろいろ調べましたが、RDSでSQL Serverのデータベースを作成するときのデフォルトの問題とわかりました。
Management Studioでデータベースを作成するとき、「照合順序」が「<既定>」だと日本語が入りません。

<画像1>DB作成ダイアログ。「照合順序」を「<既定>」のまま作成。

日本語版のSQL Serverは「照合順序」が「<既定>」の場合、「Jabanese_CI_AS」がデフォルトですが、RDSでは「SQL_Latin1_General_CP1_CI_AS」がデフォルトになるようです。



<画像2>作成後のDBのプロパティー。「照合順序」が
「SQL_Latin1_General_CP1_CI_AS」になっている。
淡色で、DB生成後には変更できないことがわかる。

「照合順序」が取り扱う言語の種類を規定しているのは非常に納得のいかない問題ですが、とりあえずSQL Serverの仕様と言うことで。
「照合順序」は「<既定>」ではなく明示的に「Jabanese_CI_AS」を選択してやる必要があります。



<画像3>「照合順序」を「Jabanese_CI_AS」に指定する。

「照合順序」はDB構築後に変更する事はできないため、一度DBを削除し、作り直してロードすることで、やっと正しくデータがロードできました。


次回はMySQLでのデータ移行です。

0 件のコメント:

コメントを投稿