Amazon Web Services ブログ

トランザクションレプリケーションを使用して、Amazon RDS for SQL Server に移行する方法

ご使用のデータベースを Amazon RDS for Microsoft SQL Server へ移行するには複数の方法があります。通常、データベースのシンプルなバックアップと復元を実行するのが一般的です (logins などのシステムオブジェクトのスクリプトを書くとともに)。可用性をさらに高める、またはダウンタイムを短縮するオプションが必要であれば、AWS Database Migration Service (AWS DMS) を利用できます。このブログ記事では、ご使用のデータベースを RDS for SQL Server へ移行するために、3 番目のメカニズムである、トランザクションレプリケーションを使用する方法について解説します。このアプローチを使用すると、提供されているサービスを使用する必要なく、既存のインフラストラクチャを活用して Amazon RDS for SQL Server へデータを移動できます。

RDS for SQL Server は SQL Server のレプリケーションをサポートしていません。これは主に、RDS for SQL Server インスタンス上でホストされているとき、SQL Server Agent のレプリケーションサブシステムが実行されていないためです。しかし、オンプレミスまたは Amazon EC2 (SQL Server のホストインスタンス) 上のいずれかで SQL Server Agent が実行されているところでは、プッシュサブスクリプションはサポートされています。RDS for SQL Server インスタンスにおいて、到着するプッシュサブスクリプションのトランザクションは、単に個別の Transact-SQL ステートメントの 1 つに過ぎません。

このブログ記事の方法を使用することで、1 つまたは複数の SQL Server データベースを 1 つの RDS for SQL Server インスタンスへ単発移行するレプリケーションをセットアップできます。この技法は EC2 ホスト名に依存します。また、ホスト名はホストの交換または マルチ AZ (高可用性) 構成のフェイルオーバーのいずれかで変更できます。そのため、この技法を使用して AWS にデータをレプリケーションする場合には、単発の AZ 構成を推奨します。レプリケーションの処理が完了したら、高可用性のためインスタンスを マルチ AZ に変換します。このような制限があることから、データを RDS for SQL Server へ単発で移行する場合にのみ、この技法を利用するようにしてください。

このブログ記事では、EC2 ホスト上で稼働している Microsoft Windows Server 2016 上の SQL Server 2017 インスタンスを使用します。(このセットアップは本記事では「ソース SQL Server」と呼びます。) このブログ記事では SQL Server トランザクションレプリケーションで作業する知識があることを前提に進めます。

ソース SQL Server 上でディストリビューションを有効化することから開始する

まず、ソース SQL Server でディストリビューションを有効にします (まだ構成されていない場合)。SQL Server Management Studio (SSMS) で、レプリケーションツリーのエントリーのコンテキスト (右クリック) メニューを表示し、[Configure Distribution] (ディストリビューションを構成する) を選択します。SQL Server のインストール後にコンピュータ名を変更した場合、サーバー名が一致しないというエラーメッセージが表示される場合があります。その場合は以下のスクリプトを実行してください。

Exec sp_dropserver ‘oldname’;
Go
Exec sp_addserver ‘newservername’,local;
Go

その後、SQL Server サービスを再始動して、もう一度やり直してください。ウィザードの手順に従い、ローカルサーバーをディストリビューションサーバーにし、ディストリビューションデータベースを作成します。ローカルサーバーをディストリビューションサーバーにし、ディストリビューションデータベースを作成するスクリーンショット

RDS for SQL Server 側では、セキュリティグループで EC2 またはオンプレミスの SQL Server システムからの SQL Server 接続を許可するようにしておいてください。セキュリティグループはデフォルトで TCP 1433 ポート、または構成によっては別のポートでの接続を許可しています。EC2 上またはオンプレミスの SQL Server システム上の SSMS から RDS for SQL Server へ接続することで、接続を検証できます。(このシステムを前進するパブリッシャーと呼びます。)

RDS データベースとデータベースオブジェクトを作成する

この時点から次のステップを実行します。

  1. RDS データベースを作成する
  2. オンプレミスのデータベースを書きだし、RDS for SQL Server 上で再作成する
  3. 各テーブルにパブリケーションオンプレミスを作成する
  4. RDS for SQL Server にプッシュサブスクライバーをセットアップする

SSMS 上で通常実行するように RDS サーバー上でデータベースを作成します。このケースではデータベース REPLTEST をレプリケーションし、同じデータベース名を RDS for SQL Server インスタンス上でも使用します。SSMS 上の RDS サーバーでデータベースを作成するデータベースが作成できたら、RDS for SQL Server データベースでデータベースオブジェクトを再作成するスクリプトを実行します。スクリプトをお持ちでない場合は、SQL Server でスクリプト生成ウィザードを使用することもできます。これを実行するには、データベースのコンテキスト (右クリック) メニューを開き、[Tasks] (タスク)、[Generate Scripts] (スクリプトの生成) を選択し、その手順に従います。データベースオブジェクトをすべて書きだし、そのスクリプトを RDS for SQL Server インスタンスで実行します。SSMS でスクリプトを生成するスクリーンショットこの時点で、データベースとすべてのデータベースオブジェクトが RDS for SQL Server インスタンス上に作成されました。続いて、データを RDS 環境へ移動しましょう。

データを転送する

ソース SQL Server システムに戻ります。次のステップでは RDS 環境へ移行したいデータで各テーブルのパブリケーションを作成します。これを実行するには、ソースサーバーのレプリケーションノードの下にある、Local Publications のコンテキスト (右クリック) メニューを開き、[New Publication] (パブリケーションの新規作成) を選択します。RDS 環境へ移行したいデータで各テーブルのパブリケーションを作成するため [New Publication] (パブリケーションの新規作成) を選択する

ウィザードが起動したら、[Next] (次へ) を選択し、データベース (この例では REPLTEST) を選択します。次に、[Next] (次へ) を選択し、パブリケーションのタイプとして [Transactional publication] (トランザクションパブリケーション) を選択します。[Articles] (アーティクル) ページで、レプリケーションするすべてのオブジェクトを選択します。テーブルにプライマリキーが設定されているものとして、レプリケーションの対象としてオブジェクトのほぼすべてを選択することも、テーブルのみで十分とすることも可能です。このブログ記事では、データが移動されるようにテーブルをレプリケーションします。レプリケーションする全オブジェクトを選択するための [アーティクル] ページのスクリーンショット[Next] (次へ) をもう一度選択し、また再度 [Next] (次へ) を選択して、テーブル行のフィルタリングをスキップします。このブログ記事に使用したデータベースは小さいので、すぐにスナップショットを取ります (テーブルの初期データの一括コピー中)。初回のスナップショットはシステムに余裕があるとき、またはメンテナンス中に実行されるようスケジュールすることもできます。「スナップショットエージェント」ページのスクリーンショットサービスアカウントまたはスナップショットエージェントとログリーダーエージェントのカスタムアカウントのいずれかを使用し、[Next] (次へ) を選択します。[Create the publication] (パブリケーションを作成する) のチェックボックスがオンになっていることを確認し、[Next] (次へ) を選択します。MigrateToAWS など、パブリケーションに分かりやすい名前を付けます。[Finish] (終了) を選択します。パブリケーションの作成が正常終了した状態のスクリーンショットパブリケーションの新規作成ウィザードが正常に完了したら、[Close] (閉じる) を選択します。

これでテーブルがパブリッシュされました。次の手順では PUSH サブスクリプションを作成し、SQL Server インスタンスの RDS にデータをプッシュします。ソースサーバーの SSMS で [Local Subscriptions] (ローカルサブスクリプション) のコンテキスト (右クリック) メニューを開き、[New Subscriptions] (サブスクリプションの新規作成) を選択して、サブスクリプションの新規作成ウィザードを立ち上げます。[Next] (次へ) を選択して、作成したばかりのパブリケーションを選択します。ここでは、MigrateToAWS になります。スクリーンショット[Next] (次へ) を選択して、PUSH サブスクリプションを有効化するために [Run all agents at the Distributor] (ディストリビューターですべてのエージェントを実行する) のオプションを選択します。[Next] (次へ) を選択して、[Add Subscriber] (サブスクライバーの追加) を選択して、RDS for SQL Server インスタンスにリンクを追加します。オブジェクトを作成するアクセス許可のある認証情報を使用して、SQL Server への接続を追加し、RDS for SQL Server データベースにデータをロードします。[Connect] (接続する) を選択します。その後、次のようなエラーメッセージのダイアログボックスが表示されます。これは想定通りです。SQL Server に接続しようとしたときに表示されたエラーメッセージのスクリーンショットSQL Server のレプリケーションでは、Windows Server のコンピュータ名とサーバー名が同一である必要があります。便利なことに、RDS for SQL Server インスタンスをホストしている Windows Server の実際の名前がエラーメッセージに返されます。

これを調べるには、RDS for SQL Server のインストレーションの IP アドレスを確認します。ソース SQL Server システム (またはご使用のデスクトップ) でコマンドウィンドウを開き、次のコマンドを実行します。

Nslookup <<RDS SQL Server>>

このブログの例では次を実行します。

Nslookup rwsqlserver.cb2xxxxxxx.us-west-2.rds.amazonaws.com

Nslookup がアドレスとして 203.0.113.14 を返しました。次に、ローカルコンピュータのエクスプローラーで Windows system32/drivers/etc に移動します。hosts. ファイルをエディタで開き編集します。サーバーのエントリーを追加します。この例では次のようになります。

203.0.113.14    EC2AMAZ-SL55HDG

テキストエディタを閉じて、変更内容を保存します。

SSMS に戻り、エラーメッセージをキャンセルしてください。[Server Name] (サーバー名) の値を想定される EC2 のホスト名に一致するように変更し、[Connect] (接続する) をもう一度選択します。今度は接続に成功しました。サブスクライバーの接続が [Subscribers] (サブスクライバー) リストに表示されています。[Next] (次へ) を選択します。

この接続のセキュリティを設定するには、[Distribution Agent Security] (ディストリビューションエージェントのセキュリティ) ダイアログボックスで、RDS for SQL Server 名の横にある省略記号ボタンを選択します。ディストリビューションエージェントのセキュリティダイアログボックスのスクリーンショットディストリビューションエージェントのセキュリティでは、サーバーに接続するために Windows アカウントを選択するか、SQL Server Agent のサービスアカウントを選択します。サブスクライバーの場合は、RDS for SQL Server のログイン情報を指定します。[OK]、[Next] (次へ) の順に選択します。同期スケジュールでは、デフォルトの [Run Continuously] (連続実行する) を受け入れ、[Next] (次へ) を選択します。[Initialize Subscriptions] (サブスクリプションの初期化) オプションでは、直ちに、または後でデータの同期を実行できます。または、手動で同期を実行することもできます (データベースのフルバックアップを取得して、RDS for SQL Server にそれを復元する)。このブログ記事では、デフォルトのすぐに同期を使用します。レプリケーションの同期での他のオプションについて詳しくは、Microsoft ドキュメントのスナップショットを使用しないトランザクション サブスクリプションの初期化を参照してください。

[Next] (次へ) を選択し、デフォルトの [Create the subscription] (サブスクリプションの新規作成) のまま、[Next] (次へ)、[Finish] (終了) の順に選択します。SSMS がスナップショットを作成し、ソースシステムでスナップショットエージェントを開始します。[Close] (閉じる) を選択します。サブスクリプションが正常終了した状態のスクリーンショット

この間にレプリケーションプロセスが開始します。

移行プロセスを終了する

同期が完了したら、RDS for SQL Server インスタンス上のオブジェクトを検証します。2 つのデータベースが同期中の場合は、オンプレミスまたは EC2 インスタンス上のアクティビティを停止し、レプリケーションが完了するのを確認してください。これで、RDS for SQL Server インスタンスへの本番ワークロードを切り替えられるようになります。最後に、プッシュサブスクリプションを停止して削除し、Amazon RDS for SQL Server のインストレーションを本番サーバーとして使用し始めます。

SQL Server レプリケーションの使用は、Amazon RDS for SQL Server を使用するために移行する複数ある方法の 1 つです。このブログ記事で解説した技法を使用すると、既存の SQL Server のソフトウェア性能を使用し、最小限のダウンタイムで移行できます。


著者について

リチャード・ウェイマイアーは、アマゾン ウェブ サービスのプリンシパルデータベース専門ソリューションアーキテクトです。 彼は、AWS を使用している場合にソリューションの価値を向上させる手助けとなるために、AWS の顧客と協力してデータベースプロジェクト上の指導や技術支援を行っています。