【OCI クラウド移行ガイド】 Amazon Aurora を MySQL HeatWave Database Serviceへ移行してみた～Replication Channel 編～

# OCIクラウド移行ガイドとは

オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニア（@araidon,@kazunishi,@yama6）による、OCI移行手順をまとめたシリーズ記事です。
各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。

# 移行したいサンプルワークロード

日々の業務でよく目にするサービスを中心に、サンプルワークロードとしてまとめてみました。このシリーズでは、主にAWSからの移行を取り上げます。
このワークロードは、ユーザがログインして、Web上で写真を共有するWebサービスをイメージしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/1c9074f1-d4df-e201-1274-0b92d49837e1.png)

# 移行するサービス：Amazon Aurora for MySQL

今回、移行対象とするのはAmazon Aurora for MySQLです。
MySQL HeatWave Database ServiceのReplication Channel機能を利用した移行手順をガイドします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/47777b1b-ee39-f515-19d3-e8072fbe0df7.png)

# 移行のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/2750b0f2-1b06-f8d8-b64f-d3883f5698aa.png)

今回は、AuroraとMDSとレプリケーションを貼り、Aurora側で行った変更が自動的にMDSに反映されるかの移行検証をしてみたいと思います。
移行にあたり、発生元のサーバー (ソース) でコミットされた各トランザクションに作成および関連付けられる一意の識別子であるGTID（グローバルトランザクション識別子）の設定、変更内容をバイナリログファイルに行形式で保存するbinlog_formatをAuroraのパラメータグループで設定します。

**MySQL 8.0 リファレンスマニュアル　17.1.3.1 GTID 形式および格納**
https://dev.mysql.com/doc/refman/8.0/ja/replication-gtids-concepts.html

**MySQL 8.0 リファレンスマニュアル　5.4.4.2 バイナリログ形式の設定**
https://dev.mysql.com/doc/refman/8.0/ja/binary-log-setting.html

移行の仕組については、下記の情報を参考にしました。
**高可用性・性能がアップデート！MySQL HeatWave最新情報**
https://www.mysql.com/jp/news-and-events/web-seminars/mysql-heatwave-tech-updates-enhancements-in-ha-and-performance/

今回行う移行方式は、本資料のInbound Replicationに該当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/2140a122-3cc5-be6a-8a86-4b7765e8c861.png)

# 前提条件
AWSとOCIがVPN接続されていること、Aurora,MDSそれぞれに接続するための踏み台サーバがパブリックサブネット上に構築されていることが前提条件です。
~~(OCIとAWSのVPN接続手順については、後日、別の記事で解説します。）~~
接続手順は下記の記事を参考にしてください。

https://qiita.com/yama6/items/c188de191269cb604341

# 移行手順
1. Auroraの作成
1. MDSの作成
1. Aurora--->MDS：レプリケーションの検証

# 1. Auroraの作成
AWS側でAuroraを作成します。
# 1-1. Aurora：パラメータグループの作成
まずはパラメータグループにて、行ベースのレプリケーションを有効化、GTIDの有効化していきます。
RDS>パラメータグループ から、パラメータグループを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/4e93800a-9944-df8d-867b-8574ca9f6e65.png)
今回は、移行元のAuroraのMySQLのメジャーバージョンは8.0とします。
DB Cluster Parameter Groupを設定すると、クラスタに紐づくDBすべてに同じパラメータが設定されます。

# 1-2. Aurora：パラメータグループの編集
作成後、編集ボタンから編集画面に遷移し、パラメータを変更します。
変更するパラメータは下記5つです。

|パラメータ  |値  
|---|---
|binlog_format  |ROW
|gtid-mode  |ON  
|enforce_gtid_consistency  |ON
|character_set_database  |utf8mb4
|character_set_server  |utf8mb4

MDSにおけるキャラクタセットのデフォルトはutf8mb4なので、こちらも変更します。
「パラメータをフィルタリング」の検索欄に上記パラメータ名を入れ、値を入力し、「変更を保存」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/1b6a3f10-d8e7-35fb-d5fd-03087975a8ad.png)

# 1-3. Aurora：DBの作成
RDS>データベースから、「データベースの作成」ボタンを押下します。
必要な設定箇所は下記の通りです。

|設定項目  |値  
|---|---
|データベース作成方法を選択  |標準作成
|エンジンのタイプ  |Aurora (MySQL Compatible)  
|利用可能なバージョン  |8.0.mysql_aurora.3.04.0
|テンプレート  |本番稼働用
|DB クラスター識別子  |任意の値
|マスターパスワード  |任意の値
|インスタンスの設定  |バースト可能クラス (t クラスを含む)
|インスタンスタイプ  |任意のもの
|マルチ AZ 配置  |Aurora レプリカを作成しない
|コンピューティングリソース  |EC2 コンピューティングリソースに接続しない
|ネットワークタイプ  |IPv4
|Virtual Private Cloud (VPC)  |VPN接続を設定したVPC
|DB クラスター識別子  |任意の値
|VPC セキュリティグループ  |VPN接続を設定したセキュリティグループ
|追加設定  |データベースの選択肢
|最初のデータベース名  |任意の値
|DB クラスターのパラメータグループ  |作成したパラメータグループを選択
|設定画面  |　👇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/d23dca35-14aa-9d3e-a602-27edd3d8b51a.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/00b831b1-f8c8-00c6-52e6-5793e3ee4b26.png)
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/1720e130-a073-bb89-6876-c925e7bd7715.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/f56f4265-5d87-60b3-eb95-7dc5664a9c03.png)
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ed28f87d-eb72-57b4-8cc6-8c8ee70cbe49.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/2c83153a-758a-e404-955d-cafb2e354fed.png)

データベースの作成ボタンを押下し、ステータスが利用可能になるまで待ちます。

# 1-4. Aurora：DBへの接続
利用可能のステータスが確認できたら、ライターのエンドポイントをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/42e0f4a3-a79b-60e3-086e-879fde714cf0.png)
下記のコマンドで、エンドポイントに対して接続します。
今回は、mysql ClientをインストールしたEC2からmysql接続を行っています。

```
[ec2-user@ip-10-1-3-181 ~]$ mysql -u admin -p -h test-cluster-1-instance-1.cn07mhl9cm4v.ap-northeast-1.rds.amazonaws.com
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1900
Server version: 8.0.28 Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
```
# 1-5. Aurora：レプリケーションユーザの準備

このあと作成するMDSにて、チャネルを作成して、Auroraとレプリケーションを行います。その際にソースDB（今回は移行元のAurora）からレプリケーションユーザを提供する必要があります。ユーザを作成し、権限を設定します。

```
mysql> CREATE USER repluser@'%' IDENTIFIED BY '任意パスワード';
mysql> GRANT REPLICATION SLAVE on *.* to repluser@'%';
```
任意パスワードには、大文字小文字の英字、数字、記号を含めてください。
AWS側では怒られませんが、OCI側のパスワードポリシーが、8文字から32文字までの長さで、大文字、小文字、数字および特殊文字をそれぞれ1つ以上含める必要があるため、のちに怒られます。

# 1-6. Aurora：GTIDの確認
後に必要となる、GTIDを確認します。

```
mysql> show global variables like 'GTID%';
```
表示されたGTIDをコピーしてメモしておきます。
```
+----------------------------------+--------------------------------------------+
| Variable_name | Value |
+----------------------------------+--------------------------------------------+
| gtid_executed  | <<この部分をコピー>> |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | コピー部分と同値:X-XX |
+----------------------------------+--------------------------------------------+
5 rows in set (0.03 sec)
```
ここまでで、Aurora側の設定は一旦完了です。

# 2. MDSの作成
次にOCI側でMDS（MySQL HeatWave Database Service）を作成します。
# 2-1. MDS：DBの作成
データベース>MySQL HeatWave>DBシステムを選択し、DBシステム作成画面に遷移します。DBシステムの作成ボタンを押下します。
必要な設定箇所は下記の通りです。

|設定項目  |値  
|---|---
|本番  |<選択>
|DBシステム情報の指定  |
|コンパートメントに作成  |任意のコンパートメント
|名前  |任意の値
|スタンドアロン  |<選択>
|MySQL HeatWaveの構成  |<選択しない>
|管理者資格証明の作成  | 
|ユーザー名  |admin
|パスワード  |任意の値
|ネットワーキングの構成  |
|仮想クラウド・ネットワーク  |VPN接続を設定したVCN
|サブネット  |VPN接続を設定したサブネット
|ハードウェアの構成  |
|シェイプの選択  |MySQL.VM.Standard.E4.1.8GB(任意) *1
|データ・ストレージ・サイズ(GB)  |50GB(任意)
|拡張オプションの表示  |*2
|構成タブ |
|MySQLバージョン  |8.0.34
|接続タブ  |
|ホスト名  |任意の値
|設定画面  |　👇
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/a279a323-63bc-6194-d6cb-0205f6ca5b0c.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/5bac6cac-dd34-9029-08d8-7cf1b2a0a874.png)　
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ef99ff5a-6776-4d98-69d1-cc3951adc97c.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/80ec09d9-49af-ccda-1700-dc395c82c03a.png)
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/9accddac-1621-0634-286e-6fce6cac8623.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/c89fadf4-09a4-23e6-fe77-fa989c232060.png)

*1：シェイプの選択>シェイプの変更ボタンから変更できます。
*2：拡張オプションの表示ボタンを押下してください。

設定項目が入力できたら、作成ボタンを押下してください。

# 2-2. MDS：DBへの接続
アクティブのステータスが確認できたら、エンドポイントをコピーします。
エンドポイントは、DBシステムの詳細画面から、リソース>エンドポイントのラベルを押下すると確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/2c2b7256-f90c-6698-6901-b69cdf6ae2df.png)
※ホスト名がエンドポイントになります。

下記のコマンドで、エンドポイントに対して接続します。
mysql ClientをインストールしたCompute VMからmysql接続を行っています。

```
[opc@test-instance ~]$ mysql --host testmds.testprisubnet.testvcn.oraclevcn.com -u admin -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 480
Server version: 8.0.34-u3-cloud MySQL Enterprise - Cloud

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

# 2-3. GTIDの設定

まずはMDS側でGTIDを確認します。下記コマンドを実行してください。

```
mysql> show global variables like 'GTID%';
```
先ほどAurora側で確認できたgtid_executedの値が空になっていることが確認できます。
ここに、さきほどメモを残したAuroraのGTIDを設定します。
```
mysql> call sys.set_gtid_purged("<<コピーしたGTID>>");
```
再度、GTIDの確認コマンドを実行します。
```
mysql> show global variables like 'GTID%';
+----------------------------------+--------------------------------------------+
| Variable_name | Value |
+----------------------------------+--------------------------------------------+
| gtid_executed | <<設定したGTID>> |
| gtid_executed_compression_period | 0 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | <<設定したGTID>> |
+----------------------------------+--------------------------------------------+
5 rows in set (0.00 sec)
```
先述した通り、このGTIDを両方のDBに持たせて、Aurora (ソース) でコミットされた各トランザクションをMDS（ターゲット）に反映し、レプリケーションを実現します。


# 2-4. MDS：Replication Channelの作成

Replication Channelは、DBシステムの詳細画面から、リソース>チャネルのラベルを押下して作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/d1666db5-28a6-b0ce-74ef-95515df04050.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/e57af6f7-0af9-3e61-a3d4-c2656d5ae8ad.png)

ソース接続のフィールドに、**「1-5. Aurora：レプリケーションユーザの準備」** で作成したレプリケーションユーザの情報を入力します。

|設定項目  |値  
|---|---
|ホスト名  |Auroraのライターエンドポイント名
|ユーザ名  |レプリケーションユーザ名
|パスワード  |設定した任意の値
|SSLモード  |無効
|レプリケーションのポジショニング  |ソースで、GTID自動ポジショニングを使用できます(推奨)

チャネルの作成ボタンを押下します。

ステータスが作成中からアクティブになれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/5b50f477-3516-4b53-0882-a09fda9b4b5d.png)

※「注意が必要」となる場合は、作成に失敗しています。下記リファレンスを参照して、設定を確認してください。

https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/mysql-database/doc/viewing-replication-channel-information.html#MYAAS-GUID-3C79708C-BB71-41B9-A882-77662A28FF14


# 3. Aurora--->MDS：レプリケーションの検証

AuroraでDBを構築し、それらがMDSで反映されるか確認します。
テストデータは、GitHubの下記データを利用します。

https://github.com/datacharmer/test_db

# 3-1. EC2：Gitのインストール

下記コマンドを実行します。
```
[ec2-user@ip-10-1-3-181 ~]$sudo yum install git-all
---略---
[ec2-user@ip-10-1-3-181 ~]$ git -v
git version 2.40.1
```
# 3-2. EC2：テストデータの準備
下記コマンドを実行し、test_dbディレクトリにテストデータを準備します。
```
[ec2-user@ip-10-1-3-181 ~]$git clone https://github.com/datacharmer/test_db
```
さらに、test_dbディレクトリに移動します。
```
[ec2-user@ip-10-1-3-181 ~]$ cd test_db
[ec2-user@ip-10-1-3-181 ~]$ cd test_db
[ec2-user@ip-10-1-3-181 test_db]$ ls
Changelog  employees.sql              employees_partitioned_5.1.sql  load_departments.dump  load_dept_manager.dump  load_salaries1.dump  load_salaries3.dump  objects.sql  show_elapsed.sql  test_employees_md5.sql  test_versions.sh
README.md  employees_partitioned.sql  images                         load_dept_emp.dump     load_employees.dump     load_salaries2.dump  load_titles.dump     sakila       sql_test.sh       test_employees_sha.sql
[ec2-user@ip-10-1-3-181 test_db]$ 
```
テストデータがクローンされたことが確認できました。

# 3-3. Aurora：テストデータの投入

まず、踏み台のEC2からAuroraに接続します。
```
[ec2-user@ip-10-1-3-181 test_db]$ mysql -u admin -p -h test-cluster-1.cluster-cn07mhl9cm4v.ap-northeast-1.rds.amazonaws.com
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3908
Server version: 8.0.28 Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

```
sourceコマンドを実行し、test_dbディレクトリにクローンした SQL スクリプトファイルを実行します。このコマンドにより、employeesというDBが構築されます。

その前に、Aurora、MDSでそれぞれの初期状態を確認しておきましょう。

**Aurora**
```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test_aurora        |
+--------------------+
5 rows in set (0.00 sec)

```

**MDS**
```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mysql_audit        |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
```

当然ですが、それぞれのDBにて、employeesというDBは作られていません。
では、テストデータを投入します。Auroraにて、下記コマンドを実行してください。

**Aurora**
```
mysql> source employees.sql;
Query OK, 0 rows affected, 1 warning (0.01 sec)

Query OK, 1 row affected (0.01 sec)

Database changed
+-----------------------------+
| INFO                        |
+-----------------------------+
| CREATING DATABASE STRUCTURE |
+-----------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected, 6 warnings (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

+------------------------+
| INFO                   |
+------------------------+
| storage engine: InnoDB |
+------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.04 sec)
～略～

```
# 3-4. 実行結果の確認

MDS側に結果が反映されたか確認してみます。

**MDS**
```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| employees          |
| information_schema |
| mysql              |
| mysql_audit        |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
```
employeesというDatabaseが追加されたことが確認できました！
中身を見てみましょう。

**MDS**
```
mysql> use employees;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------------+
| Tables_in_employees  |
+----------------------+
| current_dept_emp     |
| departments          |
| dept_emp             |
| dept_emp_latest_date |
| dept_manager         |
| employees            |
| salaries             |
| titles               |
+----------------------+
8 rows in set (0.00 sec)
mysql> select * from employees limit 10;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.00 sec)
```

Auroraでも同様にemployeesテーブル内のデータも確認します。

**Aurora**
```
mysql> use employees;
Database changed
mysql> show tables;
+----------------------+
| Tables_in_employees  |
+----------------------+
| current_dept_emp     |
| departments          |
| dept_emp             |
| dept_emp_latest_date |
| dept_manager         |
| employees            |
| salaries             |
| titles               |
+----------------------+
8 rows in set (0.00 sec)

mysql> select * from employees limit 10;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.00 sec)
```

実行結果比較
|Aurora  |MDS
|---|---
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/6c56e2ed-6cc9-6771-d9b8-7cf6bbf40749.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ee1bff8e-b652-3903-673a-4a7a1466dd8d.png)|

# まとめ

このあと、試しにAurora側で作成したDBを削除したところ、MDS側でも即時に変更が反映されていました。
結果、AuroraからMDSの移行はReplication Channelで実現することができました。
次回は、Aurora Serverlessからの移行を試してみたいと思います。