RDS for Microsoft SQL Serverの制限事項とデータ移行手順(SQLAzureMW)

2015.12.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

西澤です。RDS for Microsoft SQL Serverを利用したシステム構築を担当しているのですが、把握していなかった制限事項も多く苦戦しています。今回判明したことをまとめておきたいと思います。

RDS for Microsoft SQL Serverではストレージ変更ができない

初歩的なことかもしれませんが、RDS for Microsoft SQL Serverではストレージタイプ変更やストレージ増量をすることができません。この制限は、AWS Management Consoleからのインスタンスの操作→変更、といった操作だけだと思い込んでいました。

既存の SQL Server の DB インスタンスを修正して、ストレージタイプやストレージ割り当てを変更することはできません。

SQL Server データベースエンジンを実行する DB インスタンスの変更 - Amazon Relational Database Service

よくよく調べてみたところ、動作中のRDSインスタンスに対するストレージ変更操作だけではなく、RDSスナップショットからのリストア時にも同様の制限があるということがわかりました。つまり、RDSスナップショットから新しいRDSインスタンスを起動する際にも、元のインスタンスで利用していたストレージタイプとストレージ容量を引き継ぐことしかできないということです。このままでは、ストレージ容量が枯渇したらアウト、IOPS性能を確保しようにもストレージタイプの変更もできない、ということになります。これではクラウドのメリットが全く活かせません。

2017年11月にアップデートがあり、現在はスナップショットからのリストア時にストレージタイプ変更が可能となっています。

RDS for Microsoft SQL Serverのスナップショットを利用しないデータ移行

前述の制限から、RDS for Microsoft SQL Serverのスナップショットだけでは、ストレージ変更に対応できない為、Microsoft SQL Serverの機能を利用したデータのエクスポート・インポートを行う必要があります。下記に詳細なドキュメントがありますのでご確認ください。

これでバッチリと言いたいところですが、何だか手順が複雑です。正直この手順で運用するのは辛すぎます。何かもっと簡単な方法があるはず!と思い、もう少し調査をしていたところ、良いツールが見つかりました。

SQL Database Migration Wizard (SQLAzureMW)

SQL Database Migration Wizard (SQLAzureMW)は、本来はSQL Azure環境へのデータベース移行する為に開発されたツールですが、こちらがRDS for Microsoft SQL Server用にも利用できることがわかりました。こちらを利用したRDS環境のデータ移行手順をご紹介します。

事前準備

今回、RDS環境に接続を許可されたWindows Server 2012 R2のEC2インスタンスを用意し、ソフトウェアを準備しました。今回検証を行った環境は以下の通りです。今回はRDS側をSQL Server 2012で構築しましたので、それに合わせたクライアントバージョンで統一しています。厳密に揃えなくても互換性があるとは思いますが、Management StudioとSQLAzureMWはバージョンを揃えないとライブラリ不足で起動できない場合があるようですのでご注意ください。

  • RDS for Microsoft SQL Server
  • SQL Server 2012(11.00.5058.0.v1)
  • OS
  • Windows Server 2012 R2
  • ソフトウェア
  • Microsoft SQL Server Management Studio 2012
  • SQLAzureMW v4.15.6

※ Managment Studioは、下記ページよりSQLManagementStudio_x64_JPN.exeをダウンロードしてインストール

※ SQLAzureMWは、ダウンロードしたzipファイルの展開のみ

データ移行

ストレージタイプ、ストレージサイズを変更して移行できることを確認する為、下記2種類のデータベースを用意しました。

  • インスタンス名: testdb
  • ストレージ: gp2、20GB
  • ※データ移行元
  • ※データベース(sampledb)を作成済
  • インスタンス名: testdb-restore
  • ストレージ: magnetic、30GB
  • ※データ移行先
  • ※データベースなし

まずは、SQLAzureMWを起動します。SQLAzureMW.exeをダブルクリックします。

launch_sqlazuremw

"分析と移行"から"データベース"を選択、ターゲットサーバに"SQL データベース"を指定して"次へ"をクリックします。

sqlazuremw1

移行元RDSの接続情報を入力し、"接続"をクリックします。

sqlazuremw2

移行対象のデータベースが選択されていることを確認し、"次へ"をクリックします。

sqlazuremw3

今回は全てのデータを移行する検証を行いました。また、接続元データベースによっては異なる表示項目が出てくる可能性もあります。また、詳細設定画面で細かい設定も可能です。

sqlazuremw4sqlazuremw5

"はい"をクリックして移行用スクリプトを生成します。

sqlazuremw6sqlazuremw7sqlazuremw8

続けて移行先の情報を入力します。移行先のデータベースは事前に作成することもできますが、この手順ではここでツールから作成しています。同一のデータベース名で移行を行いました。日本語環境の場合には、照合順序にも注意が必要になると思います。

sqlazuremw9sqlazuremw10 sqlazuremw11sqlazuremw12

先ほど生成した移行用スクリプトを実行します。

sqlazuremw13sqlazuremw14

無事成功しました。アプリケーションからDB接続先を変更しても利用できることを確認しました。ちなみに、bcp outコマンドで出力されたdatファイルと、bcp inコマンドの実行結果は、デフォルトではC:\SQLAzureMW\BCPDataフォルダに作成されるようです。

sqlazuremw_backup

出力フォルダやログをよく確認すればわかりますが、実態はbcpコマンドまとめて実行してくれるような実装のようですね。

まとめ

まだ制約の多いRDS for Microsoft SQL Serverですが、このようなツールがあれば運用の負担も緩和できますね。ただ、ストレージ拡張すらできないのはちょっと辛いです。早く他のDBエンジンと同様の機能レベルで使えるようになってくれたら一番嬉しいです。