データベースが大きい場合、ローデータファイルをコピーする方が、mysqldump を使用して各スレーブでファイルをインポートするよりも、効率が高くなる場合があります。この方法では、INSERT
ステートメントが繰り返されたときのインデックス更新のオーバーヘッドが省かれます。
複雑なキャッシュまたはロギングアルゴリズムを持つストレージエンジンのテーブルでこの方法を使用すると、完全な「ポイントインタイム」スナップショットを作成するための追加手順が必要となります。グローバル読み取りロックを獲得した場合、最初のコピーコマンドはキャッシュ情報とロギング更新が除外する場合があります。ストレージエンジンがこれにどのように反応するかは、そのクラッシュリカバリ能力によります。
マスターとスレーブで ft_stopword_file
、ft_min_word_len
、または ft_max_word_len
の値が異なり、全文インデックスを持つテーブルをコピーする場合も、この方法が確実に機能するとはかぎりません。
InnoDB
テーブルを使用する場合、MySQL Enterprise Backup コンポーネントから mysqlbackup コマンドを使用して、一貫性のあるスナップショットを作成できます。このコマンドは、あとでスレーブで使用するために、スナップショットに対応するログ名とオフセットを記録します。MySQL Enterprise Backup は MySQL Enterprise サブスクリプションの一部として同梱される製品です。詳細は、セクション25.2「MySQL Enterprise Backup」を参照してください。
または、コールドバックアップ技術を使用して InnoDB
テーブルの信頼できるバイナリスナップショットを取得します。MySQL Server のスローシャットダウン を実行したあとにすべてのデータファイルをコピーします。
MyISAM
テーブルのローデータスナップショットを作成するには、MySQL データファイルが単一ファイルシステム上に存在するという条件で、cp、copy などの標準コピーツール、scp、rsync などのリモートコピーツール、zip、tar などのアーカイブツール、dump などのファイルシステムスナップショットツールを使用できます。特定のデータベースだけを複製する場合、それらのテーブルに関係するファイルだけをコピーします。(InnoDB
の場合、すべてのデータベースのすべてのテーブルは、innodb_file_per_table
オプションを有効にしている場合を除いて、system tablespace ファイルに格納されます。)
次のファイルは明確にアーカイブから除外することをお勧めします。
mysql
データベースに関連するファイル。(使用する場合) マスター情報リポジトリファイル (セクション17.2.2「レプリケーションリレーおよびステータスログ」を参照してください)。
マスターのバイナリログファイル。
リレーログファイル。
ローデータスナップショットでもっとも一貫性のある結果を得るには、次のように、プロセス中にマスターサーバーをシャットダウンします。
読み取りロックを獲得してマスターのステータスを取得します。セクション17.1.1.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.1.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;
データベースのアーカイブまたはコピーを作成したあと、スレーブレプリケーションプロセスを開始する前に、各スレーブにファイルをコピーします。