MySQL Clone Plugin:mysqldumpを待つ必要なし!数百GBのデータベースを「一瞬」でコピーする方法

MySQL tutorial - IT technology blog
MySQL tutorial - IT technology blog

データベース肥大化時の「mysqldump」という悪夢

数百GBのデータベースに対して mysqldump の進捗バーが亀のような速さで5〜10時間も進むのを眺めるのは、非常にストレスのたまる体験です。この伝統的な手法(ロジカルバックアップ)は、実際には各レコードを読み取ってSQLの INSERT 文としてファイルに書き出すものです。リストア時には、MySQLはそれら数百万ものコマンドを必死に実行してインデックスを再構築しなければならず、CPUとIOを激しく消費します。

私はかつて、約100GBのデータを保持するMySQL 8.0システムを管理していました。以前は、サーバーを移設するたびに一晩中付きっきりでした。しかし、Clone Pluginを使い始めてから、すべてが変わりました。4時間のダンプと6時間のリストアに費やす代わりに、今では完全なレプリカの作成がわずか15〜20分ほどで完了します。スレーブサーバーを素早く構築したい場合や、ダウンタイムを最小限に抑えてデータを移行したい場合、これがナンバーワンの解決策です。

なぜMySQL Clone Pluginはこれほどまでに速いのか?

バージョン8.0.17で登場したClone Pluginは、サーバーを停止することなく Donor(ソース)から Recipient(ターゲット)へ直接データをコピーすることを可能にします。その仕組みは従来とは大きく異なります。

これは 物理バックアップ(Physical Backup) を行います。データをテキストに変換する代わりに、物理ファイル(InnoDBテーブルスペース、redoログなど)を一方のサーバーのディスクからもう一方へそのまま運びます。この時、速度はMySQLのSQL処理能力には依存しません。ネットワーク帯域幅とSSDの読み書き速度にのみ依存します。

mysqldumpを時代遅れにする3つのメリット:

  • 帯域幅の限界に到達: コピー速度は通常、ネットワークカードの制限の80〜90%に達します(例:1Gbpsのネットワークなら約100MB/s)。
  • 中間ファイルが不要: データがソースからターゲットへ直接流れるため、ダンプファイル用のディスク容量を節約できます。
  • 完全自動化: ターゲットサーバーは、手動の介入なしに新しいデータで自動的に構成され、再起動します。

Clone Pluginを「運用」するための条件

すぐにコマンドを打たないでください。途中でエラーが発生しないよう、両方のサーバーで以下の項目が一致していることを確認しましょう:

  1. バージョン: 両方のサーバーが正確に同じバージョンである必要があります(例:8.0.35)。
  2. プラットフォーム: 同じオペレーティングシステムである必要があります(両方ともLinux x64、または両方ともWindows)。
  3. InnoDBの設定: innodb_page_size パラメータが完全に一致している必要があります。
  4. プラグイン: 両方のサーバーに mysql_clone.so ファイルがインストールされている必要があります。

実戦:ネットワーク経由でデータをクローンする4つのステップ

サーバー Donor (192.168.1.10) にデータがあり、 Recipient (192.168.1.20) が新しいサーバーであると仮定します。

ステップ1:プラグインの有効化

両方のサーバーでこのコマンドを実行します:

INSTALL PLUGIN clone SONAME 'mysql_clone.so';

ステップ2:ユーザー権限の設定

Donor 側で、システムファイルを読み取る権限を持つユーザーを作成します:

CREATE USER 'clone_user'@'192.168.1.20' IDENTIFIED BY 'PassSieuKho';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'192.168.1.20';

Recipient 側で、データの書き換えを実行する権限を付与します:

CREATE USER 'rcp_user'@'localhost' IDENTIFIED BY 'PassSieuKho';
GRANT CLONE_ADMIN ON *.* TO 'rcp_user'@'localhost';

ヒント: CLONE_ADMIN 権限を与えると、クローン完了後に自動的に SHUTDOWN コマンドが実行され、サーバーが新しいデータを自動でロードします。

ステップ3:信頼できるソースの宣言

ターゲットサーバーで、このソースサーバーからのみデータを受け取ることを設定します:

SET GLOBAL clone_valid_donor_list = '192.168.1.10:3306';

ステップ4:「コピー」実行

Recipient サーバーから、クローンコマンドを実行します:

CLONE INSTANCE FROM 'clone_user'@'192.168.1.10':3306 IDENTIFIED BY 'PassSieuKho';

進捗状況の確認方法 (Performance Schema)

大規模なデータベースでは、何が行われているかわからずに待ち続けるのは非常に不安なものです。新しいターミナルタブを開いて、次のテーブルをクエリしてください:

-- コピー済みのデータ容量(MB)を確認する
SELECT STAGE, STATE, CAST(BEGIN_TIME AS DATETIME) AS START, 
       CONCAT(TRUNCATE(DATA/1024/1024,2), ' MB') AS DATA_TRANSFERRED 
FROM performance_schema.clone_progress;

実務上の経験:クローンコマンドは常に screentmux の中で実行してください。途中でSSH接続が切れ、コマンドが中断されると、ターゲット側のデータが不完全な状態で削除されてしまうため、最初からやり直す手間がかかります。

「手痛い経験」に基づく注意事項

非常に強力ですが、データ損失を避けるために注意すべき点がいくつかあります:

  • ターゲットのデータは完全に消去されます: CLONE INSTANCE コマンドは、新しいデータをコピーする前に、Recipientにある既存のデータベースをすべて削除します。ターゲットサーバーが空であることを必ず確認してください。
  • ネットワーク帯域幅: 1Gbpsのカードを使用している場合、最高速度は110MB/sです。1TBのデータベースの場合、やはり約2.5時間かかります。10Gbps의 네트워크があれば、時間は20分足らずに短縮されます。
  • Dockerの再起動ポリシー: プラグインは再起動のためにMySQLをシャットダウンするため、Dockerを使用していて restart: always を設定していない場合、クローン後にコンテナが停止したままになります。

終わりに

MySQL Clone Pluginは、DBAにとって画期的な進歩です。データベースの移行を、悪夢から快適なタスクへと変えてくれます。50GBを超えるデータベースを管理しているなら、今すぐダンプファイルを使う習慣を捨て、最新のハードウェアのパワーを最大限に活用できる Clone Pluginに切り替えましょう。

Share: