MariaDBからTiDB DedicatedにAWS DMSでデータを移行してみた

TiDB(MySQL互換のデータベース)はMariaDBからも簡単に移行できます!※MariaDB独自の機能を使用している場合は注意が必要です。
2024.05.25

ゲームソリューション部の えがわ です。

RDS MariaDBからTiDB DedicatedにAWS Database Migration Service(以降DMS)を使用してデータ移行を試してみます
TiDBはMySQL互換のデータベースですが、MariaDBでも移行できるのでしょうか!?
今回はMySQLには実装されていないSEQUENCEテーブルを作成して移行してみます。

環境

  • TiDB Dedicated(v7.5.1)
  • RDS MariaDB(10.11.6)
  • DMS

最初に結論

DMSを使用してデータの移行は行えましたが、MariaDB独自で実装されている機能については移行できませんでした。
TiDBではSEQUENCEテーブルは実装されていますが、DMSなどの移行システムではサポートされていないようです。
MariaDB独自の機能を使用している場合、どんな機能を使用しているか確認しておきましょう。

Both MariaDB and TiDB support CREATE SEQUENCE. However, it is currently not supported by DM. It is recommended that you do not create, modify, or remove sequences during the migration and test this specifically after migration.
【翻訳】MariaDBもTiDBもCREATE SEQUENCEをサポートしている。しかし、DMでは現在サポートされていない。移行中はシーケンスの作成、変更、削除を行わず、移行後に特別にテストすることを推奨する。

事前準備

MariaDBのサンプルデータを追加しておきます。
MySQLでは使用できない、SEQUENCEテーブルを使っています。

MariaDB(移行元)のデータ

移行元のMariaDBには以下のデータを追加しておきます。

CREATE SEQUENCE product_id_seq
START WITH 1
INCREMENT BY 1;

CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    color VARCHAR(50),
    warranty VARCHAR(50)
);

INSERT INTO products (id, name, price, color, warranty)
VALUES (NEXT VALUE FOR product_id_seq, 'Laptop', 999.99, 'Silver', '2 years');

INSERT INTO products (id, name, price, color, warranty)
VALUES (NEXT VALUE FOR product_id_seq, 'Smartphone', 499.99, 'Black', '1 year');
MariaDB [tidb_migrate]> SELECT id, name, price, color, warranty FROM products;
+----+------------+--------+--------+----------+
| id | name       | price  | color  | warranty |
+----+------------+--------+--------+----------+
|  1 | Laptop     | 999.99 | Silver | 2 years  |
|  2 | Smartphone | 499.99 | Black  | 1 year   |
+----+------------+--------+--------+----------+
2 rows in set (0.002 sec)

TiDB Dedicatedクラスターを作成

TiDBコンソールからDedicatedクラスターを作成します。

今回は以下の最小構成で作成します。

  • TiDB 4vCPU 8GB: 1台
  • TiKV 4vCPU 8GB, 200GB: 3台

パスワードの発行

Connect横の三点リーダーからSecurity Settingsを選択します。
Generateを押下してパスワード作成し、右下のApplyを押下します。
パスワード今後も使用するので控えておきましょう。

VPC Peering

AWSとTiDB Dedicatedを接続するため、VPC Peeringを使用します。

TiDB側で申請

TiDBのProjectSettingsから設定を行うことができます。

VPC Peeringには以下の情報が必要です。

  • AWSアカウントID
  • VPCのリージョン
  • VPC ID
  • VPC CIDR

Initializeで選択したAWSアカウントに申請を行うことができます。

AWS側で承認

TiDB側で申請を行うとAWSアカウントのピアリング接続から承認を行うことができます。

リクエストを承諾で接続しましょう。

ルートテーブル

ピアリング接続したからといって、まだ接続はできません。
VPCの各ルートテーブルにTiDBのルートを追加します。
送信先にはTiDBのCIDRを設定し、ターゲットはピザリング接続を選択しPeering IDを入力します。

同じVPCで起動した踏み台(EC2)からTiDBに接続してみます。

接続ができました。

データの移行

DMSでデータの移行を行います。

サブネットグループを作成

DMSインスタンスを起動するためのサブネットグループを作成します。
DMSのコンソールからサブネットグループを選択し、サブネットグループの作成を押下します。

サブネットグループを作成できました。

DMSインスタンスを作成します。

移行用のDMSインスタンスを作成します。
レプリケーションインスタンスの作成から作成画面に遷移します。
今回は以下の設定で作成します。

エンドポイントを作成

ソースエンドポイント(MariaDB)とターゲットエンドポイント(TiDB)を作成します。

ソースエンドポイントはRDS DBインスタンスの選択にチェックを入れることで簡単に設定を行えます。

ターゲットエンドポイントはターゲットエンジンにMySQLを設定します。
サーバー名にはホストを入力し、ポートやユーザー名などを適切に入力し作成します。

エンドポイントのアクションから接続のテストが行えます。
レプリケーションインスタンスを選択しテストの実行を行います。

ソースエンドポイント、ターゲットエンドポイントどちらもsuccessfulとなっていれば準備完了です。

移行してみる

準備が完了したので、移行作業を行います。

移行タスクの作成

データベース移行タスクからタスクの作成を行います。
設定は以下で行います。

テーブルマッピングで移行するデータベースを選択します。
画像で設定しているtidb_migrateはデータベース名です。

移行の実行

タスク作成時に作成時に自動的に行うにチェックをしていると自動で移行タスクが起動します。
しばらく待ってみます。

むむ、失敗しました。
MariaDB側のテーブル情報を確認してみます。

MariaDB [(none)]> SHOW TABLE STATUS FROM tidb_migrate;
+----------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+------------------+-----------+
| Name           | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation         | Checksum| Create_options | Comment | Max_index_length | Temporary |
+----------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+------------------+-----------+
| product_id_seq | InnoDB |      10 | Fixed      |    1 |          16384 |       16384 |               0 |            0 |         0 |           NULL | 2024-05-24 13:51:30 | NULL                | NULL       | latin1_swedish_ci |     NULL|                |         |                0 | N         |
| products       | InnoDB |      10 | Dynamic    |    2 |           8192 |       16384 |               0 |            0 |         0 |           NULL | 2024-05-24 13:51:30 | 2024-05-24 13:51:31 | NULL       | latin1_swedish_ci |     NULL|                |         |                0 | N         |
+----------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+------------------+-----------+

そういえばデフォルトの文字コードはlatin1だった...
ということで、文字コードと照合順序を変更して再度実行します。

ALTER DATABASE tidb_migrate CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE product_id_seq CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE products CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

ロードが完了しました!

移行後のデータベースを確認してみます。

productsは問題なく移行できていますが、SEQUENCEテーブルが移行できてないようです。
冒頭でも記載していますが、DMSなどの移行システムではサポートされていないようです。
TiDBではSEQUENCEテーブルは実装されているので、移行後に作成しましょう。

productsの中身を確認してみます。

問題なさそうです!

最後に

MariaDBからTiDB Dedicatedにデータの移行を行ってみました。
Aurora(MySQL)と同様にAWS DMSを使用することで簡単に移行が行えますが、MariaDB独自の機能を使用している場合は注意が必要です。
この記事がどなたかの参考になれば幸いです。