タイトルの通りですが、SQL Database にツールベースで移行するための方法として、
ここ数日、夜なべして Azure VM 上にインストールした SQL Server で試していた時のの雑記を少し。
[SQL Database] SQL Server ? Windows Azure SQL Database (WASD) 間のデータ同期方法について
SQL Server データベースのクラウド内の SQL Database への移行
も参考になります。
Contents
■データのエクスポート
sqlpackage.exe は bacpac 形式で、移行用のデータをエクスポートし、SQL Database Migration Wizard (SQLMW) は、bcp やスキーマのテキストベースでエクスポート用データを作成します。
bacpac 形式についても使用しているのは bcp 形式のデータとなりますので、移行されるデータに関しては両方とも bcp が使われていることになるかと。
# sqlpackage と SQLMW ではスキーマの移行データの形式は異なります。
bacpac は、zip 形式で圧縮されているファイルですが、SQLMW のファイルはテキストベースのものを圧縮しない状態で格納しています。
処理時間ですが、データサイズによっては、sqlpackage では、50分ぐらいかかるものが、SQLMW では 10 分ぐらいでエクスポートできたりします。
bacpac の作成時ですが、zip 形式の圧縮、地味に処理が地味に重いみたいなのですよね。
データのエクスポートが完了して、DB へのアクセスは終わっているのですが、bacpac の作成にかかる時間が馬鹿にならないような気がしています。
bacpac の作成中ですが、「C:\Users\<ユーザー名>\AppData\Local\Temp」に一時ファイルを作成しているのですが、この際の I/O は結構発生しています。
仮想マシンの C ドライブでこれを実行すると結構、処理時間がかかるようでした。
試しに、D シリーズにサイズを変更して、以下のレジストリを変更し、
- 「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList」
- ProfilesDirectory (REG_EXPAND_SZ) : %SystemDrive%\Users → D ドライブ
にし、新規のユーザープロファイルを D ドライブ (SSD) に作成されるように設定してみました。
そうしたところ、C ドライブを使用していた場合には「55分」かかっていたものが、D ドライブにユーザープロファイルを作成することで、「40」分まで短縮されました。
SQLMW の処理時間には届きませんでしたが、ユーザープロファイルのドライブを高速にすることで処理時間の短縮は図れそうですね。
エクスポートの処理時間を見ると SQLMW の方がよさそうですが、インポートについては bacpac の方が優れている点があります。
■データのインポート
データのインポートについては、sqlpackage と SQLMW では、sqlpackage の方が早い傾向がありました。
- sqlpackage : 単一のファイルを複数スレッドでインポート
- SQLMW : 複数のファイルを並列にインポート
というような動作になっているようで、SQLMW の方が SQL Database のログの書き込み性能を上限まで使っている感じでした。
sqlpackage の bacpac のインポートは一つずつファイルをインポートしているような感じで、SQL Database がある程度のサイズになるとログの書き込みの上限には届かず、書き込みにはある程度余裕があるが、並列度が足りなくて書き込みの性能上限を余らしているような感じに見えました。
大きいサイズの DB のインポートをする際には、SQL Database のリソースをどの程度使っているかを意識した方がよいかと思います。
こちらも処理時間としては SQLMW の方が早かったのですが、インポートの特徴として、
- sqlpackage : インデックスを無効の状態でインポートし、インポート完了後にインデックスを再設定
- SQLMW : インデックスが有効の状態でインポート
というのがありそうです。
SQLMW の方が処理時間は短かったのですが、インデックスが有効の状態でインポートをしているため、インポート後の断片化は進んだ状態です。
sqlpackage はインデックスを無効の状態でインポートし、インポート完了後にインデックスを再設定しているので、断片化は発生していない状態となります。
結果としては、標準的なツールである sqlpackage の方がいいのかなと思っています。
エクスポートについては時間がかかりますが、エクスポート後の状態については、sqlpackage の方が整っていますので。
一定の件数で区切ったファイルを並列でロードするのがいいかと思うのですが、大量のテーブルが存在している場合はツールを使って初期の移行は行いたいので、できるだけシンプルな移行方法がいいですよね。