DMS でデータ移行をやってみた
DMS の使い方について学ぶため、以下の構成で DMS をやってみようと思います。
- ソースデータベース:8.0.mysql_aurora.3.08.2
- ターゲットデータベース:8.0.mysql_aurora.3.08.2
- DMS で移行するもの:ソースデータベースに作成した test_db データベースおよび test_db 内の user テーブル
構成図内の EC2 はソース DB に接続して検証用のデータベースを作成したり、ターゲット DB に接続して移行がちゃんとできているか確認をするためのものです。
今回は DMS がどのようなものかを把握することが目的のため、一番シンプルと思われる同一エンジンバージョンでの移行を試します。
また、移行対象の user テーブルもデータのみ insert しておき、インデックスなどは作成しません。
以下、検証していきます。
セキュリティグループの作成
まずはセキュリティグループを作ります。
セキュリティグループは、ソースとターゲットのデータベース、そしてレプリケーションインスタンスの合計 3 つの設定が必要です。
ソースとターゲットには、DMS レプリケーションインスタンスからのインバウンドルールを許可しておきます。また、EC2 も動作確認で必要なのでそこからのインバウンドも許可します。
レプリケーションインスタンスは何も設定しなくて OK です。
-
source-db-sg
-
target-db-sg
-
dms-replication-instance-sg
ソースデータベースの作成
以下の項目でソース DB を作成します。セキュリティグループは前項のものを使用します。
設定項目 | 値 |
---|---|
エンジンバージョン | Aurora MySQL3.08.2 |
DB クラスター識別子 | source-db |
マスターユーザー名 | admin |
マスターパスワード | <任意のパスワード> |
セキュリティグループ | source-db-sg |
DB クラスターのパラメータグループ | default.aurora-mysql8.0 |
DB パラメータグループ | default.aurora-mysql8.0 |
サブネット | プライベートサブネットに配置 |
作成できました。
ターゲットDBの作成
識別子を target-db として作成します。セキュリティグループは前述のものを使います。その他はソース DB と同じです。
設定項目 | 値 |
---|---|
DB クラスター識別子 | target-db |
セキュリティグループ | target-db-sg |
作成できました。
EC2 の作成とソース DB へのログイン
以下の設定で EC2 を作成します。
- Amazon Linux 2023
- Aurora クラスターと同じ VPC
- パブリックサブネット
EC2 にログインし、以下ブログを参考に mysql クライアントをインストールします。
ソース DB に接続します。
mysql -u admin -p -h <ソース DB インスタンスのエンドポイント>
適当なデータベース test_db とテーブル user を作ります。こちらを後ほど DMS で移行します。
mysql> create database test_db;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_db |
+--------------------+
5 rows in set (0.01 sec)
mysql> create table test_db.user (id int, name varchar(10), address varchar(10));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into test_db.user values (1, 'Yamada', 'Tokyo');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test_db.user values (2, 'Satou', 'Chiba');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_db.user values (3, 'Kinjo', 'Okinawa');
Query OK, 1 row affected (0.01 sec)
mysql> select * from test_db.user;
+------+--------+---------+
| id | name | address |
+------+--------+---------+
| 1 | Yamada | Tokyo |
| 2 | Satou | Chiba |
| 3 | Kinjo | Okinawa |
+------+--------+---------+
3 rows in set (0.00 sec)
DMS の設定
サブネットグループの作成
レプリケーションインスタンス用のサブネットグループを作成します。
Aurora ソースデータベース、ターゲットデータベースと同じVPCを選択して作成します。
エンドポイントの作成
左側のナビゲーションペインより「移行または複製」を選びます。そうすると、DMS の設定手順が表示されます。
画面に従い、エンドポイントの作成からはじめます。
ソースエンドポイントを以下の通り作成します。RDS インスタンスはソースDBのインスタンスを選びます。
アクセス情報はソースに接続するときのマスターユーザー名、マスターパスワードを設定します。
ターゲットエンドポイントも同様の手順で作成します。
ソースエンドポイントとターゲットエンドポイントを作成できました。
レプリケーションインスタンスの作成
エンドポイントの作成を終えたので、続いて、レプリケーションインスタンスを作成します。「移行または複製」の画面から、「インスタンスを作成」を選びます。
レプリケーションインスタンスの設定をしていきます。
今回は検証なので、高可用性の部分はシングル AZ とします。
レプリケーションサブネットグループは前述で作成したグループを選びます。
"パブリックアクセス可能" は不要のため、チェックを外しておきます。
セキュリティグループは前述にて作成済みの dms-replication-instance-sg を指定します。
レプリケーションインスタンスを作成できました。
タスクの作成
前項までで、DMS でデータを移行する環境準備が整ったので、続いて具体的にどのようなデータベースやテーブルを移行するのかのタスク設定をしていきます。
タスクは DMS レプリケーションインスタンスにて実行される内容(どのテーブルを移行するのかなど)を設定するものです。
以下の画面からタスクの作成を選択します。
タスク設定にて、作成済みのソースデータベースエンドポイント、ターゲットデータベースエンドポイントを指定します。
また、今回はソース DB に作成済みの test_db および test_db 内の user テーブルのみを移行するため、タスクタイプはフルロードを指定しておきます。
移行先のDBは空の状態なので、ターゲットテーブル準備モードは「ターゲットのテーブルをドロップ」を設定します。
テーブルマッピングでは、今回移行させるDBスキーマ・テーブルを選択できます。
事前にソース DB にて作成しておいた test_db および user テーブルを指定します。
移行前評価は、移行タスクの実行前にエラーが無いかチェックし、結果を S3 に保存してくれる機能です。今回は移行前評価はしないため、無効化のままにしておきます。
設定ができたら、「タスクを作成」を選びます。
タスクを作成できました。
タスクの実行
前項にて作成したタスクを実行し、実際に移行をやってみます。
作成したタスクを選択し、アクションから「開始」します。
タスクが開始されると以下のようにステータスが「開始中」になります。
完了するとステータスが完了に変わります。
それでは、EC2 からターゲット DB にログインして、ちゃんと移行ができているか確認します。
mysql -u admin -p -h <ターゲット DB クラスターエンドポイント>
以下結果より、ソース DB で作成した test_db データベース、user テーブルがきちんと移行されていることが確認できました!
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| awsdms_control |
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_db |
+--------------------+
6 rows in set (0.00 sec)
mysql> select * from test_db.user;
+------+--------+---------+
| id | name | address |
+------+--------+---------+
| 1 | Yamada | Tokyo |
| 2 | Satou | Chiba |
| 3 | Kinjo | Okinawa |
+------+--------+---------+
3 rows in set (0.00 sec)
終わりに
今回は DMS を試してみました。DMS ってエンドポイントとかタスクとか色々出てくるし、かつ移行元や移行先も用意しないといけないので、手を動かすことを避けていたのですがやってみると案外簡潔にできました!
セキュリティグループの設定方法が分からず、エラーで詰まったりしましたが、早い人だと1-2時間程度で検証できる内容だと思うため、まずは触ってみて DMS の仕組みをなんとなく理解してくれたらと思います。本ブログが DMS を初めて触ってみる方などの参考になれば幸いです。
参考文献