ソースデータベースに既存のデータが含まれている場合、このデータを各レプリカにコピーする必要があります。 ソースデータベースからデータをダンプするには、様々な方法があります。 次の各セクションでは、使用可能なオプションについて説明します。
データベースをダンプする適切な方法を選択するには、次のいずれかのオプションを選択します:
mysqldump ツールを使用して、レプリケートするすべてのデータベースのダンプを作成します。 これは、特に
InnoDB
を使用する場合に推奨される方法です。データベースがバイナリポータブルファイルに格納されている場合は、RAW データファイルをレプリカにコピーできます。 これは、
INSERT
ステートメントのリプレイ時にインデックスの更新のオーバーヘッドがスキップされるため、mysqldump を使用して各レプリカにファイルをインポートするよりも効率的です。InnoDB
などのストレージエンジンでは、これはお勧めしません。MySQL Server クローンプラグインを使用して、既存のレプリカからクローンにすべてのデータを転送します。 この方法の使用手順は、セクション5.6.7.6「レプリケーション用のクローニング」 を参照してください。
MySQL の複数のインスタンスをデプロイするには、MySQL Shell で MySQL サーバーインスタンスのグループを簡単に管理できるようにする InnoDB クラスタ を使用できます。InnoDB クラスタ は MySQL Group Replication をプログラム環境でラップするため、MySQL インスタンスのクラスタを簡単にデプロイして高可用性を実現できます。 また、InnoDB クラスタ は MySQL Router とシームレスにインタフェースするため、アプリケーションは独自のフェイルオーバープロセスを記述せずにクラスタに接続できます。 ただし、高可用性を必要としない同様のユースケースでは、InnoDB ReplicaSet を使用できます。 MySQL Shell のインストール手順は、here にあります。
既存のソースデータベースにデータのスナップショットを作成するには、mysqldump ツールを使用します。 データダンプが完了したら、レプリケーションプロセスを開始する前に、このデータをレプリカにインポートします。
次の例では、すべてのデータベースを dbdump.db
という名前のファイルにダンプし、レプリケーションプロセスを開始するためにレプリカに必要な CHANGE REPLICATION SOURCE TO
|CHANGE MASTER TO
ステートメントを自動的に追加する --master-data
オプションを含めます:
shell> mysqldump --all-databases --master-data > dbdump.db
--master-data
を使用しない場合は、別のセッションですべてのテーブルを手動でロックする必要があります。 セクション17.1.2.4「レプリケーションソースのバイナリログ座標の取得」を参照してください。
mysqldump ツールを使用して、特定のデータベースをダンプから除外できます。 ダンプに含めるデータベースを選択する場合は、--all-databases
を使用しないでください。 次のいずれかのオプションを選択します:
--ignore-table
オプションを使用して、データベース内のすべてのテーブルを除外します。--databases
オプションを使用してダンプするデータベースのみに名前を付けます。
デフォルトでは、GTID がソース (gtid_mode=ON
) で使用されている場合、mysqldump はソース上の gtid_executed
セットの GTID をダンプ出力に含めて、レプリカ上の gtid_purged
セットに追加します。 特定のデータベースまたはテーブルのみをダンプする場合、mysqldump に含まれる値には、データベースの抑制された部分を変更したトランザクションや、部分ダンプに含まれていないサーバー上のその他のデータベースであっても、ソース上の gtid_executed
セット内のすべてのトランザクションの GTID が含まれることに注意してください。 mysqldump --set-gtid-purged
オプションの説明を確認して、使用している MySQL Server バージョンのデフォルト動作の結果、およびこの結果が状況に適していない場合の動作の変更方法を確認します。
詳細は、セクション4.5.4「mysqldump — データベースバックアッププログラム」を参照してください。
データをインポートするには、ダンプファイルをレプリカにコピーするか、レプリカにリモート接続するときにソースからファイルにアクセスします。
このセクションでは、データベースを構成する RAW ファイルを使用してデータスナップショットを作成する方法について説明します。 複雑なキャッシュまたはロギングアルゴリズムを持つストレージエンジンを使用するテーブルでこの方法を使用するには、完全な「「ポイントインタイム」」スナップショットを生成するための追加のステップが必要です: 最初のコピーコマンドでは、グローバル読取りロックを取得した場合でも、キャッシュ情報およびロギング更新を除外できます。 ストレージエンジンがこれにどのように反応するかは、そのクラッシュリカバリ能力によります。
InnoDB
テーブルを使用する場合、MySQL Enterprise Backup コンポーネントから mysqlbackup コマンドを使用して、一貫性のあるスナップショットを作成できます。 このコマンドは、レプリカで使用されるスナップショットに対応するログ名とオフセットを記録します。 MySQL Enterprise Backup は MySQL Enterprise サブスクリプションの一部として同梱される製品です。 詳細は、セクション30.2「MySQL Enterprise Backup の概要」を参照してください。
この方法は、ソースとレプリカの値が ft_stopword_file
、ft_min_word_len
または ft_max_word_len
で異なり、全文インデックスを持つテーブルをコピーしている場合にも確実に機能しません。
前述の例外がデータベースに適用されない場合は、cold backup 手法を使用して、InnoDB
テーブルの信頼性のあるバイナリスナップショットを取得: MySQL Server の slow shutdown を実行してから、データファイルを手動でコピーします。
MySQL データファイルが単一のファイルシステムに存在する場合に MyISAM
テーブルの RAW データスナップショットを作成するには、cp や copy などのアーカイブツール、scp や rsync などのリモートコピーツール、または zip または tar、または dump のようなファイルシステムスナップショットツールを使用できます。 特定のデータベースだけを複製する場合、それらのテーブルに関係するファイルだけをコピーします。 InnoDB
の場合、innodb_file_per_table
オプションを有効にしないかぎり、すべてのデータベースのすべてのテーブルが system tablespace ファイルに格納されます。
次のファイルはレプリケーションには必要ありません:
mysql
データベースに関連するファイル。レプリカ接続メタデータリポジトリファイル
master.info
が使用されている場合、このファイルの使用は非推奨になりました (セクション17.2.4「リレーログおよびレプリケーションメタデータリポジトリ」 を参照)。これを使用してレプリカのソースバイナリログ座標を検索する場合は、バイナリログインデックスファイルを除き、ソースリグファイル。
リレーログファイル。
InnoDB
テーブルを使用しているかどうかに応じて、次のいずれかを選択します:
InnoDB
テーブルを使用していて、RAW データスナップショットと最も一貫性のある結果を得るには、プロセス中に次のようにソースサーバーを停止します:
読取りロックを取得し、ソースステータスを取得します。 セクション17.1.2.4「レプリケーションソースのバイナリログ座標の取得」を参照してください。
-
別のセッションで、ソースサーバーを停止します:
shell> mysqladmin shutdown
-
MySQL データファイルのコピーを作成します。 次の例では、これを行うための一般的な方法を示します。 この中の 1 つだけを選択する必要があります。
shell> tar cf /tmp/db.tar ./data shell> zip -r /tmp/db.zip ./data shell> rsync --recursive ./data /tmp/dbdata
ソースサーバーを再起動します。
InnoDB
テーブルを使用していない場合は、次の手順で説明するように、サーバーをシャットダウンせずにソースからシステムのスナップショットを取得できます:
読取りロックを取得し、ソースステータスを取得します。 セクション17.1.2.4「レプリケーションソースのバイナリログ座標の取得」を参照してください。
-
MySQL データファイルのコピーを作成します。 次の例では、これを行うための一般的な方法を示します。 この中の 1 つだけを選択する必要があります。
shell> tar cf /tmp/db.tar ./data shell> zip -r /tmp/db.zip ./data shell> rsync --recursive ./data /tmp/dbdata
-
読み取りロックを獲得したクライアントでは、ロックを解除します。
mysql> UNLOCK TABLES;
データベースのアーカイブまたはコピーを作成したら、レプリケーションプロセスを開始する前に各レプリカにファイルをコピーします。