既存のレプリケーション構成に別のスレーブを追加する場合は、マスターを停止することなく実行できます。代わりに、既存のスレーブのコピーを作成することで新しいスレーブをセットアップしますが、新しいスレーブは別の server-id
値で構成します。
既存のスレーブを複製するには、次のようにします。
-
既存のスレーブをシャットダウンします。
shell> mysqladmin shutdown
-
既存のスレーブから新しいスレーブにデータディレクトリをコピーします。これを行うには、tar または
WinZip
を使用してアーカイブを作成するか、cp、rsync などのツールを使用して直接コピーを実行します。ログファイルとリレーログファイルを確実にコピーしてください。新しいレプリケーションスレーブを追加するときに直面するよくある問題は、次のような一連の警告またはエラーメッセージで新しいスレーブが失敗することです。
071118 16:44:10 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=new_slave_hostname-relay-bin' to avoid this problem. 071118 16:44:10 [ERROR] Failed to open the relay log './old_slave_hostname-relay-bin.003525' (relay_log_pos 22940879) 071118 16:44:10 [ERROR] Could not find target log during relay log initialization 071118 16:44:10 [ERROR] Failed to initialize the master info structure
これは、
--relay-log
オプションが指定されていない場合、リレーログファイルにそれらのファイル名の一部としてホスト名が含まれているためです。(これは、--relay-log-index
オプションが使用されていない場合のリレーログインデックスファイルにも当てはまります。これらのオプションの詳細については、セクション17.1.4「レプリケーションおよびバイナリロギングのオプションと変数」を参照してください。この問題を回避するには、新しいスレーブの
--relay-log
に対して、既存のスレーブで使用されたものと同じ値を使用します。(このオプションが既存のスレーブで明示的に設定されなかった場合は、
を使用します。)これができない場合、既存のスレーブのリレーログインデックスファイルを新しいスレーブにコピーし、新しいスレーブのexisting_slave_hostname
-relay-bin--relay-log-index
オプションを既存のスレーブで使用されていたものに設定します。(このオプションが既存のスレーブで明示的に設定されなかった場合は、
を使用します。)また、すでに新しいスレーブを起動しようとして (このセクションの残りの手順に従ったあとに)、前に説明したものと同じようなエラーが発生した場合は、次の手順を実行します。existing_slave_hostname
-relay-bin.index-
まだそのようにしていなかった場合は、新しいスレーブで
STOP SLAVE
を発行します。すでに既存のスレーブを再度起動した場合は、既存のスレーブでも
STOP SLAVE
を発行します。 既存のスレーブのリレーログインデックスファイルの内容を新しいスレーブのリレーログインデックスファイルにコピーして、確実にファイルの既存の内容を上書きします。
このセクションの残りの手順に進みます。
-
マスター情報およびリレーログ情報リポジトリを既存のスレーブから新しいスレーブにコピーします (セクション17.2.2「レプリケーションリレーおよびステータスログ」を参照してください)。これらは、マスターのバイナリログとスレーブのリレーログの現在のログ座標を保持しています。
既存のスレーブを起動します。
新しいスレーブで構成を編集し、マスターまたは既存のスレーブのいずれかで使用されていない一意
server-id
を新しいスレーブに割り当てます。新しいスレーブを起動します。スレーブは、そのマスター情報リポジトリ内の情報を使用して、レプリケーションプロセスを開始します。