※このブログは2023年10月11日に公開された英語ブログ「Migrating from MySQL to TiDB: A Practical Guide to Distributed SQL Adoption」の拙訳です。
前回の記事「MySQL 5.7サポート終了:MySQL代替データベースへの移行」では、差し迫ったMySQL 5.7のサポート終了 (EOL) 後のさまざまな代替案を検討しました。議論された代替案の中で、MySQLから高度なオープンソースの分散SQLデータベースであるTiDBへの移行はスケーラビリティ、高可用性、MySQLとの互換性を求める人にとって有望なソリューションとして浮上しました。特に大規模なデータを処理し、急速に進化するアプリケーションの要求に対応するのに適しています。
この記事はMySQLからTiDBにデータを移行するための実践的なガイドとして役立ちます。データ移行プロセスの複雑さを掘り下げ、移行をスムーズかつ成功させるためのさまざまなツールとベストプラクティスに焦点を当てます。
移行の準備
実際のデータ移行に入る前に、いくつかの必要な準備を行うことが重要です。このフェーズは移行プロセスが問題なくスムーズに実行されるようにするために重要です。データベースの準備、互換性の考慮、移行用のTiDBクラスタのセットアップに必要な手順を説明します。
データと互換性の評価
移行プロセスを開始する前に、移行するデータ量、テーブル構造、データ型を理解することが重要です。これは移行に適切なツールとモード (完全または増分) を選択するのに役立ちます。
さらに、TiDBはMySQLと互換性があるように設計されていますが、現在のMySQLのスキーマ、クエリとTiDBとの互換性を確認することが重要です。MySQLとの互換性の詳細についてはTiDBの互換性ドキュメントを参照してください。
TiDBクラスタのセットアップ
データを移行する前に、TiDBクラスタを準備する必要があります。好みや要件に応じてTiDBクラスタをオンプレミスまたはクラウドにセットアップできます。TiDBクラスタを起動して実行するにはTiDBドキュメントの指示に従ってください。
十分なリソースとバックアップの確保
移行先のTiDBクラスタに転送するデータを処理するのに十分なリソースがあることを確認してください。CPU、メモリ、ディスク容量、ネットワーク帯域幅を監視します。これは大規模なデータセットを扱う場合に特に重要です。
さらに、MySQLデータベースに変更を加える前にデータの完全なバックアップを作成することを強くお勧めします。移行プロセス中に何か問題が発生した場合、これによりデータベースを元の状態に復元できます。
セキュリティと権限の設定
MySQLとTiDBの両方で、データ転送に必要な権限が付与されていることを確認してください。これには通常MySQLデータベースからの読み取りとTiDBデータベースへの書き込みに必要な権限を持つユーザーアカウントをセットアップすることが含まれます。
また、移行中のデータのセキュリティについても考慮してください。特にインターネット経由またはクラウド間で移行する場合、データは安全な接続経由で転送する必要があります。必要に応じて暗号化を利用して機密データを確実に保護します。
ダウンタイムの計画
移行プロセスはアプリケーションに影響を与える可能性があることに注意してください。したがって潜在的なダウンタイムを計画し、新しいデータソース名 (DSN) または接続用の文字列を使用してアプリケーションを再設定する必要があります。もしくは、ゼロダウンタイムを実現するには重複しない主キーを生成し、ソースデータベースとターゲットデータベースの両方を設定してすべてのアプリケーションの”ローリングアップデート”を行います。
適切な移行ツールの選択
データを準備してTiDBクラスタをセットアップしたら、次の重要なステップはMySQLからTiDBにデータを移行するための適切なツールを選択することです。TiDBはTiDB Data Migration (DM)、TiDB Lightning、Dumplingなどデータ移行のための複数のオプションを提供しています。どのツールを選択するかはデータセットのサイズと、完全移行もしくは増分移行の要件によって異なります。
TiDB Data Migration (DM)
TiDB Data Migration (DM) は統合されたデータ移行タスク管理プラットフォームで、MySQL、MariaDB、Google Cloud MySQL、Aurora MySQLなどのMySQL互換データベースからTiDBへの完全なデータ移行と増分データレプリケーションの両方を処理できます。これは1TiB未満の小規模なデータセットの完全なデータ移行に特に役立ちます。1TiBを超えるデータセットの場合は、移行を迅速化するためにDMの物理インポートモードを使用することをお勧めします。あるいは、完全なデータのインポートにTiDB Lightningを検討してDMを使用して増分データを移行することもできます。DMの使用に関する包括的な案内についてはTiDB Data Migrationのドキュメントを参照してください。
TiDB Lightning
TiDB Lightningは大量のデータをTiDBクラスタに迅速にインポートするために使用されるツールです。これは主に完全なデータ移行、特にダンプされたデータのインポートに使用されます。
ただし、TiDB Lightningは大量のリソースを消費するためインポート中に対象のテーブルの操作が影響を受けることに注意してください。このツールの使用方法に関する包括的な案内についてはTiDB Lightningのドキュメントを参照してください。
Dumpling
DumplingはTiDB / MySQLデータベース全体をSQLファイルやCSVファイルなどのさまざまな形式で簡単にダンプできるデータエクスポートツールです。TiDB Lightningと組み合わせることで完全な移行ソリューションを実現できます。Dumplingを使用してデータをエクスポートする方法の詳細についてはDumplingのドキュメントを参照してください。
意思決定表
ここでは意思決定に役立つ簡単な概要をご紹介します。
ツール | 最適な用途 | データ量 | 移行タイプ |
DM | 増分変更を伴う小さなデータセット | 1TiB以下 | 完全 + 増分 |
TiDB Lightning | 大規模なデータセットと高速な完全移行 | 1TiB以上の大きなデータセット | 完全 |
Dumpling | SQLまたはCSV形式でのデータのエクスポート | 任意のサイズ | エクスポート (TiDB Lightningで使用するインポート用) |
データセットのサイズと移行要件に基づいて適切なツールを選択することで、より効率的でスムーズな移行プロセスを実現できます。移行オプションの包括的な概要については、TiDB移行ツールの概要を参照してください。
データの移行と検証
データセットのサイズと特定の要件に基づいて適切な移行ツールを選択したので、データ移行を実行します。このセクションでは完全なデータ移行のプロセスを段階的に説明し、小規模なデータセットと大規模なデータセットという2つの異なるMySQLからTiDBへの移行シナリオについて説明します。
小規模なデータセットの完全なデータ移行
1TiBより小さいデータセットの場合、TiDB DMはデータ移行の運用コストを削減しトラブルシューティングプロセスを簡素化するのに最適なツールです。DMを使用して小規模なデータセットを移行する方法は次のとおりです。
前提条件
- TiDBのクラスタ運用保守ツールであるTiUPを使用してDMクラスタをデプロイします
- 必要な権限を付与します
データソースの作成
- yamlファイルでデータソースを設定します。このファイルではホスト、ユーザー、パスワード、ポートなどのMySQLの設定を指定します。
# The ID must be unique.
source-id: "mysql-01"
# Configures whether DM-worker uses GTID to pull binlogs.
enable-gtid: true
from:
host: "${host}"
user: "root"
password: "${password}"
port: 3306
- tiup dmctlコマンドを使用してこのデータソース設定をDMクラスタにロードします。
tiup dmctl --master-addr ${advertise-addr} operate-source create source1.yaml
移行タスクの作成
移行タスクをyamlファイルで構成します。
name: "test"
task-mode: "all"
target-database:
host: "${host}"
port: 4000
user: "root"
password: "${password}"
# The configuration of all MySQL instances
mysql-instances:
-
source-id: "mysql-01"
block-allow-list: "listA"
# The global configuration of blocklist and allowlist.
block-allow-list:
listA: # name
do-tables: # Allowlist of the upstream table to be migrated.
- db-name: "test_db" # Schema name of the table to be migrated.
tbl-name: "test_table" # Name of the table to be migrated.
移行の開始
- ステータスを確認し、移行タスクを開始します。
tiup dmctl --master-addr ${advertise-addr} check-task task.yaml tiup dmctl --master-addr ${advertise-addr} start-task task.yaml
- 移行ステータスを確認します。[query-status] コマンドを使用して移行タスクを監視します。
tiup dmctl --master-addr ${advertise-addr} query-status ${task-name}
TiUPを使用してDMをデプロイするときにPrometheus、Alertmanager、およびGrafanaをデプロイしている場合はDMダッシュボードでDM関連の監視メトリクスを表示することもできます。
大規模なデータセットの完全なデータ移行
1TiBを超えるデータセットの場合は、完全なデータ移行のためにDumplingをTiDB Lightningと組み合わせて使用することをお勧めします。完全な移行が完了したらDMを使用して増分データをレプリケートできます。
前提条件
- DumplingとTiDB Lightningをインストールし、TiDBクラスタが適切にデプロイされていることと、インポートプロセスにリソースが割り当てられていることを確認します。詳細な要件については、TiDBの移行ドキュメントを参照してください。
- 増分データをレプリケートする必要がある場合はDMをインストールします。
- ソースデータベースとターゲットデータベースにTiDB Lightning、Dumpling、およびDMに必要な権限を付与します。
MySQLからのデータのエクスポート
Dumplingを使用してMySQLからデータをエクスポートします。Dumplingのパラメータの詳細についてはDumplingの概要を参照してください。
dumpling --host ${host} --user ${user} --password ${password} --port ${port} -o ${output_directory}
インポートタスクの作成
以下に示すようにtidb-lightning.tomlファイルを構成します。TiDB Lightningの設定の詳細については、TiDB Lightningの設定を参照してください。
[lightning]
# log.
level = "info"
file = "tidb-lightning.log"
[tikv-importer]
backend = "local" #"local": Default backend for importing large volumes.
sorted-kv-dir = "${sorted-kv-dir}" # Temporary storage directory for sorted KV files.
[mydumper]
data-source-dir = "${data-path}" # the export path in step 1.
[tidb]
# The target TiDB cluster information.
host = ${host} # e.g.: 172.16.32.1
port = ${port} # e.g.: 4000
user = "${user_name}" # e.g.: "root"
password = "${password}" # e.g.: "rootroot"
status-port = ${status-port} # e.g.: 10080
pd-addr = "${ip}:${port}" # e.g.: 172.16.31.3:2379
インポートの開始
1. tidb-lightningを実行してインポートを開始します。
2. TiDB Lightning Webインターフェイスで進行状況を確認するか、Prometheus、Alertmanager、およびGrafanaもデプロイしている場合はモニタリングダッシュボードで進行状況を確認します。
インポートの完了
TiDB Lightningはインポートを完了すると自動的に終了します。tidb-lightning.logの最後の行で完了した手順全体が含まれているかどうかを確認してください。”はい”の場合インポートは成功です。
データの検証
データ移行プロセスを開始した後は、移行の進行状況を監視しデータを検証して正確さと完全性を確保することが重要です。TiDBはMySQLのデータをTiDBのデータと比較したり、データを逆に比較したりできる強力なデータ検証ツールであるsync-diff-inspectorを提供しています。また、少量のデータに不整合があるシナリオでデータを修復するために使用することもできます。詳細についてはsync-diff-inspectorユーザーガイドを参照してください。
まとめ
データ移行は慎重な計画と実行が必要な重要なタスクです。MySQLからTiDBにデータを移行する場合、データの性質を理解し、ダウンタイムを計画し、適切な移行戦略を選択し、移行後にデータを検証することが重要な手順です。
これでMySQLからTiDBへの移行に関するガイドは終了です。ただし、すべての移行シナリオは固有であり、カスタム調整が必要になる場合があることに注意してください。
TiDBを体験するには、無料サインアップよりTiDB Serverlessをお試しください。日本語ドキュメントのTiDBクイックスタートガイド、または無料オンライントレーニングのご利用をお勧めします。ご不明な点などございましたら、お問い合わせフォームよりご連絡ください。 また、GitHubにて問題を報告することもできます。
TiDB Cloud Dedicated
TiDB Cloudのエンタープライズ版。
専用VPC上に構築された専有DBaaSでAWSとGoogle Cloudで利用可能。
TiDB Cloud Serverless
TiDB Cloudのライト版。
TiDBの機能をフルマネージド環境で使用でき無料かつお客様の裁量で利用開始。