ビジネス課題への解決策(アイディア)と、新たな発想(+α)が見つかるIT情報メディア

Menu
  1. TOP
  2. データ活用
  3. Amazon RDS:Relational Database Serviceへのデータ移行(1)SQL Server編

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加

最近ちょっとテストで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

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

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

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

テーブルが出来たら、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」がデフォルトになるようです。

作成後のDBプロパティ

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

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

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

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

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


追記:関連コンテンツ

Amazon Relational Database Service(Amazon RDS)へのデータ移行(2)MySQL編

Amazon RDSへのデータ移行(3)番外:PostgreSQL編+Oracle情報

追記:Waha! Transformer 製品サイトの関連コンテンツ

Waha! Transformerの対応データソース

API とは 2025年の崖と未来をつなぐ架け橋

データの抽出や加工、連携にお悩みではありませんか?

20年以上の実績に裏打ちされた信頼のデータ連携ツール「Waha! Transformer」で、自社に眠るデータを有効活用。まずは無料のハンズオンセミナーや体験版で効果を実感していただけます。

> 純国産ETLツール「Waha! Transformer」

Waha! Transformer
メールマガジンの登録はこちらから
メルマガ登録 お問い合わせ