MySQLからSQL Azureへのデータ移行について


こんにちは。川野です。
今週はRSpecはおやすみです。
なので、(´・ω・`)と( ´∀`)もおやすみですw

今週は大きな仕事として弊社サービスであるAT SHOP NOWをMySQLからSQL Azureに移行するという作業がありました。
今回はその手順についてご紹介したいと思います。

————————————————————

SQL Azureとは・・・
MicroSoftが提供するPaaS(platform as a service)のデータベースサービス。
可用性・負荷分散等をサービス側で担保してくれるため、今回利用に踏み切った。

————————————————————

SQL Azureに移行するにあたって、問題となる点が2つありました。
1. どうやってデータを引っこ抜くか → mysqldumpコマンドにどういったオプションを付けると必要なデータが取り出せるか
2. どうやってデータをぶち込むか → MySQLとMicroSoftSQLの違いをどう修正するか
以上の2点についてご説明しようと思います。

————————————————————

1. どうやってデータを引っこ抜くか
今回は以下の様なコマンドでmysqldumpを実行いたしました。

-u
ユーザー名を入力

-p
パスワードを入力(「-p」と「パスワード」の間にスペースを入れないように注意!)

–no-create-info
テーブル作成情報(CREATE TABLE ステートメント)を書き込まない。
→今回はデータのみの移行であり、データベースのマイグレーションは別途行っているため。

-c
完全な挿入ステートメント(カラム名も指定)を使用する。

–compatible=mssql
mssqlと互換性のある出力を生成する

–compact
verbose生成を少なくすることで文字数を削減します。

–default-character-set=binary
デフォルトキャラクタセットを定義します。これがないと文字化けします(´・ω・`)

参考URL: http://dev.mysql.com/doc/refman/5.1/ja/mysqldump.html

あとはデータベース名と出力先のファイル名(○○.sqlにしておくと便利)を指定すれば終わりです。
これでMySQLのダンプファイル取得はおしまいです。

————————————————————

2. どうやってデータをぶち込むか


MySQLから取得したダンプファイルはこんな感じになってるかと思います。
これをそのまま入れると入らなかったり、文字化けしたりします。
それを避けるために修正すべき点があるので押さえておきましょう。

A. 「INSERT INTO」の前に「SET IDENTITY_INSERT」をONにしよう。
このコマンドはテーブルの ID 列に明示的な値を挿入することを許可するかどうかのオプションです。
参考URL: http://technet.microsoft.com/ja-jp/library/bb734402.aspx

これがONでないと、ID列の値をユーザー側が入れることはできません。
MySQLからのダンプファイルにはID列の値が含まれているので、このオプションをONにする必要があります。

今回のsamplesテーブルにおいてこのオプションを適用させるためには、以下のように書けばOKです。

これがさっきのINSERT INTO ・・・の前に来ればOKということですね。

ちなみに、さっきの参考URLにはこんなことが書いてあります。

>IDENTITY_INSERT プロパティを ON に設定できるのは、セッション内の 1 つのテーブルのみです。
・・・つまり、テーブルを1個ずつ移行していかないといけないということです。

samplesテーブルを移行するために

↑この2行を流したら、それとは分けて次のテーブルを・・・といった具合です。
めんどくさいですがそこは割り切りましょう(´-ω-`)

B. 「”N”プレフィックス」を付けよう
MSのSQL ServerにUnicode文字を入れたい場合は、必ず前に大文字のNを付ける必要があるそうです。
これが”N”プレフィックスと呼ばれるもので、付けないと挿入したデータが文字化けします。

参考URL: http://support.microsoft.com/kb/239530/ja

さっきのテストデータに付けるならこんな感じですね。

「N’テスト’」ってなっている部分が”N”プレフィックス適用済みの部分になります。
Unicode文字の前に付けるということになってますが、英数字の前に付けたりしても特に害はないので、一括で付けても良いでしょう。
もし不具合があるようであれば、Unicode文字の前以外は外すようにすればいいかと思います。

————————————————————

今回はMySQLからSQL Azureへのデータ移行方法について書かせていただきました。

上に書いたように移行にはある程度の手順が伴いますが、
SQL Azureは冗長構成等をクラウド側で持ってくれるデータベースになりますので、
Windows Azureを使う場合は利用を前向きに検討するといいのではないかと思います(*´ω`*)

この記事に対してコメントを書く