レプリケーション中にスレーブサーバーは、マスターからスレーブにリレーされるバイナリログイベントを保持し、現在のステータスとリレーログ内の位置に関する情報を記録するいくつかのログを作成します。処理に使用されるログには、ここで示すように 3 つのタイプがあります。
リレーログは、スレーブ I/O スレッドによってマスターのバイナリログから読み取られ、書き込まれるイベントから構成されます。リレーログ内のイベントは、SQL スレッドの一部としてスレーブ上で実行されます。
-
マスター情報ログ には、スレーブのマスターへの接続に関するステータスと現在の構成情報が含まれます。このログは、マスターホスト名、ログイン資格証明、およびスレーブがマスターのバイナリログからどのくらい離れて読み取ったかを示す座標に関する情報を保持します。
MySQL 5.6 より前では、このログは常にファイル (
master.info
) でしたが、MySQL 5.6 以降では、スレーブを--master-info-repository=TABLE
で起動することで、このログをファイルにではなくmysql.slave_master_info
テーブルに書き込むことができます。 -
リレーログ情報 は、スレーブのリレーログ内の実行ポイントに関するステータス情報を保持します。
MySQL 5.6 より前では、このログは常にファイル (
relay-log.info
) でしたが、MySQL 5.6 以降では、スレーブを--relay-log-info-repository=TABLE
で起動することで、このログをファイルにではなくmysql.slave_relay_log_info
テーブルに書き込むことができます。
MySQL 5.6.7 より前では、slave_master_info
および slave_relay_log_info
テーブルの Master_id
カラムは、マスターのサーバー ID ではなくスレーブのサーバー ID を示していました。(Bug #12334346)
クラッシュセーフレプリケーション
ステータスおよびリレー情報のログのためにテーブルを使用するときにレプリケーションがクラッシュセーフであるためには、これらのテーブルは InnoDB
などのトランザクションストレージエンジンを使用する必要があります。MySQL 5.6.6 以降では、これらのテーブルは InnoDB
を使用して作成されます。(Bug #13538891)
このため、スレーブでのクラッシュ安全性を保証するには、--relay-log-recovery
が有効な状態でスレーブを実行し、さらに --relay-log-info-repository
を TABLE
に設定する必要があります。
MySQL 5.6.6 より前では、mysqld がレプリケーションロギングテーブルを初期化できなかった場合、スレーブは起動を拒否しました。MySQL 5.6.6 以降では、これが発生すると警告が出されますが、スレーブは起動を続けることが許可されます。(Bug #13971348) この状況が発生する可能性が高いのは、スレーブロギングテーブルをサポートしないバージョンの MySQL からサポートされるバージョンにアップグレードするときです。
MySQL 5.6.5 以前では、slave_master_info
および slave_relay_log_info
テーブルがデフォルトで MyISAM
を使用していて、これはレプリケーションを開始する前にここで示すように ALTER TABLE ... ENGINE=InnoDB
を発行することで、これらのテーブルが使用するストレージエンジンを変更する必要がありました。
ALTER TABLE mysql.slave_master_info ENGINE=InnoDB;
ALTER TABLE mysql.slave_relay_log_info ENGINE=InnoDB;
ALTER TABLE
ステートメントは、mysql
データベースで適切な権限を持つ MySQL root
またはほかのユーザーアカウントで実行される必要があります。レプリケーションの実行中にこれを実行しようとしてはいけません。MySQL 5.6.3 以降では、レプリケーションの進行中にこれらのいずれかのテーブルで ALTER TABLE
を実行しようとすることは許可されません。MySQL 5.6.4 以降では、これらのテーブルのいずれかまたは両方で書き込みロックを必要とするステートメントを実行することは、レプリケーションの進行中は許可されませんが、読み取りのみを実行するステートメントはいつでも許可されます。
slave_master_info
または slave_relay_log_info
テーブルで手動で行を更新または挿入しようとしないでください。そのようにすることは、未定義の動作になる可能性があり、サポートされていません。
MySQL 5.6.4 より前では、mysqldump はレプリケーションログテーブルをダンプしませんでした (それらが名前で指定されて --master-data
オプションが使用された場合を除く)。