AWS DMSでSQL ServerからMySQLへ移行する

アプリケーションエンジニア 難波 アプリケーションエンジニア 難波

こんにちは、アプリケーションエンジニアの難波です。
AWS DMSを使用してSQL Server から MySQLに移行したので、その内容を解説したいと思います。

私が所属するアプリケーション開発課で開発・保守しているWebアプリは基本的にMySQLを使用していますが、一部、SQL Serverを使用しています。
保守の観点からMySQLに統一することになり、可能な限りシステム停止時間を短時間に抑えた移行方法を採用しました。

前提

  • 移行元のSQL Server :
      AWS RDSのSQL Serverインスタンス(Webエディション)
  • 移行先のMySQL :
      AWS Aurora MySQL

RDSのデータ移行について調べると、AWS DMSを使えばリアルタイムデータ移行(レプリケーション)ができそうなのでDMSを試してみました。

誤算

SQL ServerはWebエディションだったので、リアルタイムデータ移行(CDC)に対応していませんでした
リアルタイムデータ移行を実施するにはSQL ServerをStandardエディションにアップグレードする必要があります。

実行時間の検証

SQL Serverのエディションを変更するには、スナップショットから復元する必要があります。そのため、システムを一度停止してデータ更新がない状態を作る必要があります。 

SQL Server をWebエディションからStandardエディションに変更するのに必要な時間を計測しました。
・スナップショット作成 : 6分30秒
・RDSインスタンス作成 : 17分30秒
 合計24分間

意外と時間がかかるな、という印象です。

そもそもシステムを一度停止する必要があるなら、システム停止中にSQL ServerからMySQLにデータ移行すれば良いのでは?と考え、移行時間を計測しました。
・DMS移行タスク : 6分


というわけで、システムの停止時間が短い 「システムを停止している間にデータ移行する」 方法を採用しました。

DMS

DMSの前準備

1. LOB型のカラムはnullableにする必要があります。
 SQL Serverの場合、varchar(max) 、nvarchar(max)がLOG型になります

SQL Server
コードをコピー

alter table テーブル名 alter column カラム名 nvarchar(max) null
go



2. DMSは移行先DBにテーブルを自動作成してくれますが、カラムのデータタイプが望ましい結果になるとは限りません。
 事前にテーブルを作成した方が安全です。
 SQL ServerのddlをMySQLに変換するのはGithub Copilot Chatにお願いしました。
 
 ChatGPT、素晴らしい。

DMSの設定

サブネットグループ

サブネットグループを作成します。

VPC : RDSインスタンスと同じVPC・サブネット

レプリケーションインスタンス

レプリケーションインスタンスを作成します。

・インスタンスクラス : dms.t3.medium
・VPC : RDSインスタンスと同じVPC
・サブネットグループ : 先ほど作成したDMSサブネットグループ
・RDSインスタンス(SQL ServerとMySQL)にアクセスできるセキュリティグループ

ソースエンドポイント

エンドポイントを作成します。

・ソースエンドポイント
・RDSインスタンス : 移行元のSQL Serverインスタンス

ターゲットエンドポイント

エンドポイントを作成します。

・ターゲットエンドポイント
・RDSインスタンス : 移行先MySQLインスタンスを指定

データベース移行タスク

データベース移行タスクを作成します

・移行タイプ : 移行
 ※リアルタイムデータ移行を行わない
・ターゲットテーブル準備モード : 切り捨て
 ※あらかじめMySQL用のDDLでテーブルを作成済み
・LOB 列設定 : 最大 LOB サイズ (KB) : 32kb
 ※VARCHAR(max) 、 NVARCHAR(max)に大きなデータはなかったので、32kbで十分でした
・テーブルマッピング
 そのままだとMySQLにdboというDB名で作成されてしまうので、任意のDB名にするために変換ルールを追加しました。

  ・選択ルール
   スキーマ : スキーマの入力
   ソース名 : dbo
   ソーステーブル名 : %
   アクション : 含む
  ・変換ルール
   ルールターゲット : スキーマ
   スキーマ : スキーマの入力
   ソース名 : %
   rename : 任意のDB名

DMSタスクを実行

さて、DMSの準備ができたのでデータベース移行タスクを実行します。

・アクション : 再起動/再開

ターゲットテーブル準備モードを切り捨てにしているので、タスクを開始するとテーブル内データを一旦削除して、データがコピーされます。

まとめ

AWS DMSを使用したSQL Server からMySQLへの移行を解説しました。
CDCを利用できない環境でしたが、短いシステム停止時間で移行できました。
 

SNS SHARE