AWS DMSでMySQLRDS→オンプレMySQLの継続的レプリケーション


## やりたいこと
AWS DMSを使用して、MySQLRDS→オンプレMySQLでの継続的レプリケーションのテスト 

MySQLバージョン:5.7

以下の公式ドキュメントを参照しながら、MySQLRDSの設定を一つずつ確認していく
[Amazon が管理する MySQL 互換データベースの AWS DMS のソースとしての使用](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.MySQL.html)


## 自動バックアップは有効である必要がある

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143580/1468911a-c651-4559-e424-109368b0301e.png)

## binlog_formatがROWである必要がある
本来であればmy.cnfに書かれる設定で、RDSではパラメータグループで確認する  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143580/ec71d5af-1a66-8f8d-eddc-634af404c644.png)
## バイナリログ保持期間の変更
デフォルトの設定では、RDSやAuroraはすぐにバイナリログを消去するため、保持期間を長くする必要がある
binlogの保持期間を24hにする  

```
変更前
MySQL [(none)]> call mysql.rds_show_configuration;
+------------------------+-------+------------------------------------------------------------------------------------------------------+
| name                   | value | description                                                                                          |
+------------------------+-------+------------------------------------------------------------------------------------------------------+
| binlog retention hours | NULL  | binlog retention hours specifies the duration in hours before binary logs are automatically deleted. |
+------------------------+-------+------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

変更
call mysql.rds_set_configuration('binlog retention hours', 24);

変更後確認
MySQL [(none)]> call mysql.rds_show_configuration;
+------------------------+-------+------------------------------------------------------------------------------------------------------+
| name                   | value | description                                                                                          |
+------------------------+-------+------------------------------------------------------------------------------------------------------+
| binlog retention hours | 24    | binlog retention hours specifies the duration in hours before binary logs are automatically deleted. |
+------------------------+-------+------------------------------------------------------------------------------------------------------+
```
## binlog_checksumをNONEにする必要がある
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143580/6c2c9f0a-45f7-87e2-1a92-55e4f979f7e5.png)







## パラメータグループ変更
binlog_formatとbinlog_checksumが指定の値になっていないため、RDSパラメータグループを変更する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143580/f4abc2fb-a706-e874-27f3-de70d7a953b4.png)


変更はdynamicなのでRDSの再起動を伴わないで実行される

変更確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143580/04b4e912-6af6-535e-0e5b-5d4c44f0a72e.png)

## DMS実行

移行元でテスト用DBを作っておく

```
MySQL [(none)]> create database dms_test;
MySQL [(none)]> use dms_test;
Database changed
MySQL [dms_test]> create table testtable ( id INT , name VARCHAR(5) );
Query OK, 0 rows affected (0.05 sec)

MySQL [dms_test]> show tables;
+--------------------+
| Tables_in_dms_test |
+--------------------+
| testtable          |
+--------------------+
1 row in set (0.00 sec)

MySQL [dms_test]> insert into testtable values ( 1 , "taro");
Query OK, 1 row affected (0.01 sec)

MySQL [dms_test]>
MySQL [dms_test]> select * from testtable;
+------+------+
| id   | name |
+------+------+
|    1 | taro |
+------+------+
```
## タスク作成→実行
以下の設定でタスクを作成する
タスク名：dms-cdc-test
移行タイプ：「既存のデータを移行して、継続的な変更をレプリケートする」
ロギングの有効化：チェック　(CloudWatchログでタスクの実行ログを確認したいため)
テーブルマッピング：dms_testスキーマを選択

タスクを実行する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143580/3ca658d6-1b80-185a-18bd-ad2f58af9da7.png)
ステータスは準備完了になる。
この時点で、オンプレ側DBにはまだ何も移行されていない

開始/再開　ボタンをクリックするとタスクが開始される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143580/a76d90c0-cee3-db61-0d80-aa9e91348a99.png)

移行先DBへのデータロードが完了すると、CloudWatchログに以下のように出力され、移行が完了する

```
Load finished for table 'dms_test','testtable'...
```
タスクのステータスは、「ロード完了、レプリケーション進行中」となる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143580/67a9d9d2-027c-f06a-e4e3-9129fb0f45ee.png)

移行先DBのデータを確認する。dms_testデータベースの移行が完了している

```				
mysql> show databases;			mysql> select * from dms_test.testtable;		
+--------------------+			+------+------+		
| Database           |			| id   | name |		
+--------------------+			+------+------+		
| information_schema |			|    1 | taro |		
| awsdms_control     |			+------+------+		
| dms_test           |					
| mysql              |					
| performance_schema |					
| sys                |					
+--------------------+					
8 rows in set (0.00 sec)
```					
移行元DBにinsertする

```				
MySQL [dms_test]> insert into testtable values ( 2,"ichi");					
Query OK, 1 row affected, 1 warning (0.01 sec)					

MySQL [dms_test]> select * from testtable;					
+------+-------+					
| id   | name  |					
+------+-------+					
|    1 | taro  |					
|    2 | ichi  |					
+------+-------+					
2 rows in set (0.00 sec)
```					
移行先DBでの反映を確認

```
mysql> select * from testtable;		
+------+-------+		
| id   | name  |		
+------+-------+		
|    1 | taro  |		
|    2 | ichi  |		
+------+-------+		
2 rows in set (0.00 sec)		
```

## 参考

[バイナリログのフォーマットについて](http://sawara.me/mysql/1476/)