Aurora MySQLのスナップショットを使用してTiDB Serverlessにデータを移行してみた
ゲームソリューション部の えがわ です。
Aurora MySQLのスナップショットを使用してTiDB Serverlessにデータを移行してみました。
AWS DMSを使用する場合はこちら
環境
- TiDB Serverless (v7.1.1)
- EC2(Amazon Linux 2023) 踏み台として使用します。
- Aurora MySQL(8.0.mysql_aurora.3.04.1)
注意点
以下の説明は本筋ではないため割愛しています。
- IAMロールやKMS
- スキーマやスナップショット保存用のバケットの作成
事前準備
Aurora MySQL(移行元)のデータ
移行元のAuroraには以下のデータを追加しておきます。
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE orders ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, product_name VARCHAR(255) NOT NULL, quantity INT NOT NULL, order_date DATE NOT NULL, FOREIGN KEY (user_id) REFERENCES users(id) );
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com'), ('Bob', 'bob@example.com'), ('Charlie', 'charlie@example.com'), ('David', 'david@example.com'), ('Eve', 'eve@example.com'), ('Frank', 'frank@example.com'), ('Grace', 'grace@example.com'), ('Hannah', 'hannah@example.com'), ('Ivy', 'ivy@example.com'), ('Jack', 'jack@example.com'); INSERT INTO orders (user_id, product_name, quantity, order_date) VALUES (1, 'Laptop', 1, '2023-01-15'), (2, 'Mouse', 2, '2023-01-16'), (1, 'Keyboard', 1, '2023-01-17'), (3, 'Monitor', 1, '2023-01-18'), (4, 'USB Cable', 3, '2023-01-19'), (3, 'Webcam', 1, '2023-01-20'), (5, 'Headphones', 1, '2023-01-21'), (6, 'Desk Lamp', 1, '2023-01-22'), (7, 'Notebook', 5, '2023-01-23'), (8, 'Pen', 10, '2023-01-24');
文字セットの照合順序の統一(必要な方のみ)
TiDB Serverless(v7.1.1)のデフォルトの照合順序はutf8mb4_general_ci
となっています。
※v7.4でutf8mb4_0900_ai_ci
に変更されています。
今回はAurora側の照合順序を変更します。
文字セットの照合順序をutf8mb4_general_ci
に変更します。
MySQL [tidb_migrate]> ALTER DATABASE tidb_migrate CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; Query OK, 1 row affected (0.005 sec)
各テーブルの照合順序をutf8mb4_general_ci
に変更します。
吐き出されたSQLを実行することで変更が可能です。
MySQL [tidb_migrate]> SELECT CONCAT('ALTER TABLE `', table_name, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') AS _sql FROM information_schema.TABLES WHERE table_schema = 'tidb_migrate'; +-----------------------------------------------------------------------------------+ | _sql | +-----------------------------------------------------------------------------------+ | ALTER TABLE `orders` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; | | ALTER TABLE `users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; | +-----------------------------------------------------------------------------------+ 2 rows in set (0.001 sec)
tiupの設定
踏み台サーバーでtiupの設定をします。
tiupをインストール
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh source ~/.bash_profile
DumplingとLightningをインストール
dumplingとtidb-lightningをインストールします。
tiup install dumpling tidb-lightning
$ tiup tidb-lightning -V Starting component tidb-lightning: /home/ssm-user/.tiup/components/tidb-lightning/v7.6.0/tidb-lightning -V Release Version: v7.6.0 Git Commit Hash: 52794d985ba6325d75a714d4eaa0838d59425eb6 Git Branch: heads/refs/tags/v7.6.0 Go Version: go1.21.5 UTC Build Time: 2024-01-22 14:15:25 Race Enabled: false
$ tiup dumpling -V Starting component dumpling: /home/ssm-user/.tiup/components/dumpling/v7.6.0/dumpling -V Release version: v7.6.0 Git commit hash: 52794d985ba6325d75a714d4eaa0838d59425eb6 Git branch: heads/refs/tags/v7.6.0 Build timestamp: 2024-01-22 02:14:07Z Go version: go version go1.21.5 linux/amd64
DDLのエクスポート
Auroraのスナップショットには DDLが含まれていないため、Dumplingを使用してAuroraからスキーマをエクスポートする必要があります。
tiupコマンドでDumplingを実行します。
$ tiup dumpling --host ${host} --port 3306 --user admin --password ${password} --database tidb_migrate --consistency none --no-data --output 's3://${my-bucket}/schema-backup' Starting component dumpling: /home/ssm-user/.tiup/components/dumpling/v7.6.0/dumpling --host {host} --port 3306 --user admin --password ${password} --database tidb_migrate --consistency none --no-data --output s3://my-bucket/schema-backup Release version: v7.6.0 Git commit hash: 52794d985ba6325d75a714d4eaa0838d59425eb6 Git branch: heads/refs/tags/v7.6.0 Build timestamp: 2024-01-22 02:14:07Z Go version: go version go1.21.5 linux/amd64 中略... [2024/03/06 02:22:26.218 +00:00] [INFO] [main.go:82] ["dump data successfully, dumpling will exit now"]
DDLが指定したS3バケットにエクスポートされました。
吐き出したDDLをTiDBにインポート
インポートを行うにはLightningを使用します。
Lightningを実行するために設定ファイルを作成します。
今回は以下の設定で行います。
tidb-lightning-schema.toml
[tidb] host = ${host} port = ${port} user = ${user} password = ${password} tls = "cluster" [tikv-importer] backend = "tidb" [mydumper] data-source-dir = "s3://${my-bucket}/schema-backup" [security] ca-path = "/etc/pki/tls/certs/ca-bundle.crt"
TiDBの接続情報はTiDBのコンソール画面から確認できます。
設定ファイルを指定しLightningを実行します。
$ tiup tidb-lightning -config tidb-lightning-schema.toml Starting component tidb-lightning: /home/ssm-user/.tiup/components/tidb-lightning/v7.6.0/tidb-lightning -config tidb-lightning-schema.toml +---+----------------------------------------------+-------------+--------+ | # | CHECK ITEM | TYPE | PASSED | +---+----------------------------------------------+-------------+--------+ | 1 | Source data files size is proper | performance | true | +---+----------------------------------------------+-------------+--------+ | 2 | the checkpoints are valid | critical | true | +---+----------------------------------------------+-------------+--------+ | 3 | Cluster version check passed | critical | true | +---+----------------------------------------------+-------------+--------+ | 4 | Lightning has the correct storage permission | critical | true | +---+----------------------------------------------+-------------+--------+ tidb lightning exit successfully
スキーマのインポートが完了しました。
スナップショットからTiDBに復元
スキーマのインポートと同様にLightningを使用します。
先ほどとは別で設定ファイルを作成します。
data-source-dirにスナップショットの保存先を指定します。
tidb-lightning-data.toml
[tidb] host = ${host} port = ${port} user = ${user} password = ${password} tls = "cluster" [tikv-importer] backend = "tidb" [mydumper] data-source-dir = "s3://${my-bucket}/sql-backup/tidb-migrate-ss/" [[mydumper.files]] pattern = '(?i)^(?:[^/]*/)*([a-z0-9_]+)\.([a-z0-9_]+)/(?:[^/]*/)*(?:[a-z0-9\-_.]+\.(parquet))$' schema = '$1' table = '$2' type = '$3' [security] ca-path = "/etc/pki/tls/certs/ca-bundle.crt"
$ tiup tidb-lightning -config tidb-lightning-data.toml +---+----------------------------------------------+-------------+--------+ | # | CHECK ITEM | TYPE | PASSED | +---+----------------------------------------------+-------------+--------+ | 1 | Source data files size is proper | performance | true | +---+----------------------------------------------+-------------+--------+ | 2 | the checkpoints are valid | critical | true | +---+----------------------------------------------+-------------+--------+ | 3 | Cluster version check passed | critical | true | +---+----------------------------------------------+-------------+--------+ | 4 | Lightning has the correct storage permission | critical | true | +---+----------------------------------------------+-------------+--------+ tidb lightning exit successfully
移行が完了したので、データを確認してみます。
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 744567 Server version: 5.7.28-TiDB-Serverless TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [tidb_migrate]> select * from users; +----+---------+---------------------+---------------------+ | id | name | email | created_at | +----+---------+---------------------+---------------------+ | 1 | Alice | alice@example.com | 2024-03-06 01:34:15 | | 2 | Bob | bob@example.com | 2024-03-06 01:34:15 | | 3 | Charlie | charlie@example.com | 2024-03-06 01:34:15 | | 4 | David | david@example.com | 2024-03-06 01:34:15 | | 5 | Eve | eve@example.com | 2024-03-06 01:34:15 | | 6 | Frank | frank@example.com | 2024-03-06 01:34:15 | | 7 | Grace | grace@example.com | 2024-03-06 01:34:15 | | 8 | Hannah | hannah@example.com | 2024-03-06 01:34:15 | | 9 | Ivy | ivy@example.com | 2024-03-06 01:34:15 | | 10 | Jack | jack@example.com | 2024-03-06 01:34:15 | +----+---------+---------------------+---------------------+ 10 rows in set (0.008 sec) MySQL [tidb_migrate]> select * from orders; +----+---------+--------------+----------+------------+ | id | user_id | product_name | quantity | order_date | +----+---------+--------------+----------+------------+ | 1 | 1 | Laptop | 1 | 2023-01-15 | | 2 | 2 | Mouse | 2 | 2023-01-16 | | 3 | 1 | Keyboard | 1 | 2023-01-17 | | 4 | 3 | Monitor | 1 | 2023-01-18 | | 5 | 4 | USB Cable | 3 | 2023-01-19 | | 6 | 3 | Webcam | 1 | 2023-01-20 | | 7 | 5 | Headphones | 1 | 2023-01-21 | | 8 | 6 | Desk Lamp | 1 | 2023-01-22 | | 9 | 7 | Notebook | 5 | 2023-01-23 | | 10 | 8 | Pen | 10 | 2023-01-24 | +----+---------+--------------+----------+------------+ 10 rows in set (0.004 sec)
無事に移行が完了しています!
最後に
DumplingとLightningを使用してAurora MySQLからTiDB Serverlessにデータを移行してみました。
2テーブル、数十行のレコードとはいえ、簡単かつ迅速に移行を行うことができました。
S3バケット名のタイポで3時間詰まっていたことは秘密