こちらの記事、
で、
MySQL HeatWave on AWS does not support inbound replication.
インバウンドレプリケーションがサポートされていない点が大きなネックと感じます。
と書きましたが、インバウンドレプリケーションの代わりに DMS の CDC レプリケーションを試してみました。
2023/9/10 時点(MySQL バージョン 8.1.0-u2-cloud)の情報です。
今後、仕様が変わる可能性があります。
2023/9/10 現在、MySQL HeatWave on AWS の DB 作成画面には PrivateLINK を使うか Public IP Address 経由のアクセスを行うか選択するチェックボックスがあります。
しかし、PrivateLINK を使うのに必要な情報がまだ表示されないので、この記事では Public IP Address 経由のアクセスで試しています。
1. ソースとターゲットの DB を作成する
ソース DB として RDS for MySQL 8.0、ターゲット DB として MySQL HeatWave on AWS の DB System を作成します。
ソース DB でROW
形式のバイナリログ(binlog)を有効にするのがポイントです。
今回は RDS for MySQL で試しましたが、Aurora MySQL をソース DB にすることも可能です。
1-1. DB パラメータグループを作成する
バイナリログをROW
形式で指定する(binlog_format='ROW'
)RDS for MySQL 8.0 用のパラメータグループを作成します。
サブネットグループを作成していない場合は、後から作成する DMS のレプリケーションインスタンスからアクセス可能なサブネットグループも作成しておきます。
1-2. RDS for MySQL 8.0 インスタンスを作成する
- エンジンバージョンは 8.0.34
- インスタンスタイプは任意で
- 後から作成する DMS のレプリケーションインスタンスからアクセス可能なサブネットグループを指定
- 同様に DMS のレプリケーションインスタンスからアクセス可能なセキュリティグループを作成・指定
- TCP:3306 でインバウンド接続可能に
- 先ほど作成した DB パラメータグループを指定
- バックアップ保持期間は 1 日以上を指定
- バイナリログを有効にするため
1-3. ソース DB にテストデータを投入する
テストデータの前にバイナリログ保持期間を設定しておきます。
mysql> call mysql.rds_set_configuration('binlog retention hours', 168);
テストデータはこちらの記事のサンプルデータを、HeatWave ではなく RDS にロード(投入)します。
サンプルデータの元の記事はこちらです。
- 5. サンプルデータベースの構築(OCI チュートリアル - その10 - MySQLで高速分析を体験する)
1-4. MySQL HeatWave on AWS の DB System を作成する
こちらの記事を参考に、最小のシェイプで MySQL DB + HeatWave Cluster を作成します。
今回は MySQL version を 8.1.0 にしました(2023/9/10 現在、8.0.34 が見当たらなかったため)。
Networking については、「Enable public connectivity」のチェックを入れ、一旦データ確認に使う EC2 の Public IP Address(EC2 が Private Subnet にある場合は NAT インスタンス / NAT Gateway など)だけ登録しておきます。
作成が完了したら、「Hostname」を確認しメモしておきます。
1-5. ターゲット DB にデータベース(スキーマ)を作成する
念のため、ターゲット DB(MySQL DB System)にデータベースを作成しておきます。
CREATE DATABASE tpch;
2. DMS レプリケーションを設定する
今回はサーバーレスではなく通常のレプリケーションインスタンスを使って設定します。
2-1. DMS でレプリケーションサブネットグループを作成する
2-2. DMS でレプリケーションインスタンスを作成する
テスト用の RDS を小さめのインスタンスで作成したので、レプリケーションインスタンスも小さめで OK です。
- 先ほど作成したレプリケーションサブネットグループを選択
- 「パブリックアクセス可能」にチェック
2-3. EC2 でレプリケーションインスタンスの Public IP Address を確認する
レプリケーションインスタンス作成完了後、EC2 の「ネットワークインターフェイス」で、「dms」で絞り込みをしてレプリケーションインスタンスの「パブリック IPv4 アドレス」を確認しメモしておきます。
2-4. MySQL HeatWave on AWS で DB System の Networking 設定を変更する
DMS レプリケーションインスタンスのパブリック IPv4 アドレスを「;
」(セミコロン)区切りで追記します。
2-5. DMS でソースエンドポイントを作成する
RDS for MySQL 8.0 のインスタンスを指定して作成します。
エンドポイントの接続テストも実施しておきます。
2-6. DMS でターゲットエンドポイントを作成する
MySQL HeatWave on AWS の DB System を指定して作成します。
先にメモした Hostname を「サーバー名」に指定します。
2-7. DMS でデータ移行タスクを作成する
- 先ほど作成したレプリケーションインスタンスとソース・ターゲットのエンドポイントを指定
- 移行タイプは「既存のデータを移行して、継続的な変更をレプリケートする」
- 初期データの移行と CDC によるレプリケーションの両方を有効化
- 今回のデータでは LOB 列は不要
- 検証とタスクログはお好みで
- テーブルマッピングの「選択ルール」でスキーマ名「tpch」の全テーブル(「%」)を「含む」に
- 変換ルールは不使用
MySQL to MySQL のレプリケーションではFLOAT
型・TIME
型が正しく移行できないので、これらの列が存在する場合は変換ルールでreal4
・time
に型変換します。
その他、MySQL to MySQL の DMS レプリケーションにはいくつか気をつけるべき点があります。
3. DMS のレプリケーションを確認する
データ移行タスクを作成したら、初期データの移行(ロード)およびレプリケーションを確認します。
3-1. データ移行完了後の状態を確認する
初期データの移行(ロード)完了を待ちます。
「テーブル統計」を見てみます。
ロード完了時点では「挿入」・「削除」・「更新」などの各項目の値は0
です。
また、ソース DB・ターゲット DB の両方でデータの状態を確認します。
mysql> USE tpch;
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_tpch |
+----------------+
| customer |
| lineitem |
| nation |
| orders |
| part |
| partsupp |
| region |
| supplier |
+----------------+
8 rows in set (0.01 sec)
mysql> SELECT * FROM region;
+-------------+-------------+---------------------------------------------------------------------------------------------------------------------+
| R_REGIONKEY | R_NAME | R_COMMENT |
+-------------+-------------+---------------------------------------------------------------------------------------------------------------------+
| 0 | AFRICA | lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to |
| 1 | AMERICA | hs use ironic, even requests. s |
| 2 | ASIA | ges. thinly even pinto beans ca |
| 3 | EUROPE | ly final courts cajole furiously final excuse |
| 4 | MIDDLE EAST | uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl |
+-------------+-------------+---------------------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)
3-2. MySQL HeatWave on AWS で HeatWave へのオフロードを有効にする
こちらの記事のとおり HeatWave へのオフロードを有効にします。
元の記事はこちらです。
- 6. HeatWaveへのデータロード(OCI チュートリアル - その10 - MySQLで高速分析を体験する)
3-3. データをINSERT
して CDC レプリケーションを確認する
ソース DB(RDS)でデータを 1 行INSERT
してみます。
mysql> INSERT INTO region SET R_REGIONKEY = 999, R_NAME = 'SPACE', R_COMMENT = 'outside the earth';
先ほどの「テーブル統計」を再確認します。
対象テーブル(region
)の「挿入」「適用された挿入」がカウントアップされて1
になっています。
ターゲット DB(MySQL DB System)で確認してみます。
mysql> USE tpch;
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> SELECT * FROM region;
+-------------+-------------+---------------------------------------------------------------------------------------------------------------------+
| R_REGIONKEY | R_NAME | R_COMMENT |
+-------------+-------------+---------------------------------------------------------------------------------------------------------------------+
| 0 | AFRICA | lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to |
| 1 | AMERICA | hs use ironic, even requests. s |
| 2 | ASIA | ges. thinly even pinto beans ca |
| 3 | EUROPE | ly final courts cajole furiously final excuse |
| 4 | MIDDLE EAST | uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl |
| 999 | SPACE | outside the earth |
+-------------+-------------+---------------------------------------------------------------------------------------------------------------------+
6 rows in set (0.00 sec)
mysql> SELECT /*+ SET_VAR(use_secondary_engine=FORCED) */ * FROM region;
+-------------+-------------+---------------------------------------------------------------------------------------------------------------------+
| R_REGIONKEY | R_NAME | R_COMMENT |
+-------------+-------------+---------------------------------------------------------------------------------------------------------------------+
| 0 | AFRICA | lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to |
| 1 | AMERICA | hs use ironic, even requests. s |
| 2 | ASIA | ges. thinly even pinto beans ca |
| 3 | EUROPE | ly final courts cajole furiously final excuse |
| 4 | MIDDLE EAST | uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl |
| 999 | SPACE | outside the earth |
+-------------+-------------+---------------------------------------------------------------------------------------------------------------------+
6 rows in set (0.09 sec)
HeatWave も含めてデータが移行&レプリケーションされているのが確認できました。
mysql> SELECT
-> l_returnflag,
-> l_linestatus,
-> SUM(l_quantity) AS sum_qty,
-> SUM(l_extendedprice) AS sum_base_price,
-> SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
-> SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
-> AVG(l_quantity) AS avg_qty,
-> AVG(l_extendedprice) AS avg_price,
-> AVG(l_discount) AS avg_disc,
-> COUNT(*) AS count_order
-> FROM
-> lineitem
-> WHERE
-> l_shipdate <= DATE '1998-12-01' - INTERVAL '90' DAY
-> GROUP BY l_returnflag , l_linestatus
-> ORDER BY l_returnflag , l_linestatus;
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| l_returnflag | l_linestatus | sum_qty | sum_base_price | sum_disc_price | sum_charge | avg_qty | avg_price | avg_disc | count_order |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| A | F | 37734107.00 | 56586554400.73 | 53758257134.8700 | 55909065222.827692 | 25.522005 | 38273.129734 | 0.049985 | 1478493 |
| N | F | 991417.00 | 1487504710.38 | 1413082168.0541 | 1469649223.194375 | 25.516471 | 38284.467760 | 0.050093 | 38854 |
| N | O | 74476040.00 | 111701729697.74 | 106118230307.6056 | 110367043872.497010 | 25.502226 | 38249.117988 | 0.049996 | 2920374 |
| R | F | 37719753.00 | 56568041380.90 | 53741292684.6040 | 55889619119.831932 | 25.505793 | 38250.854626 | 0.050009 | 1478870 |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
4 rows in set (1.08 sec)