web-dev-qa-db-ja.com

MySQL:フェイルオーバー後にマスターをスレーブから復元する

2つの別個のサーバー上の2つのMySQLインスタンス間でレプリケーションを実行しています。 MがマスターでSがスレーブであるとしましょう。一方向レプリケーションM-> Sとしてセットアップされます。現在、Sは読み取り専用で、-log-binオプションを使用してバイナリログを書き込んでいます。 Mがダウンしたため、Sにフェイルオーバーする必要があるとします。 Mを再びSと同期するようにMを回復する手順は何ですか?そして、Sは再びスレーブになることができますか?

次のスレッドを見ましたが、それらは循環レプリケーションに依存しています。
https://serverfault.com/questions/350756/recover-a-crashed-mysql-master-server-from-the-slavehttps:// serverfault .com/questions/350756/recover-a-crashed-mysql-master-server-from-the-slave

これまでにSをマスターに昇格させるための手順:

STOP SLAVE IO_THREAD;
SHOW PROCESSLIST; check 'has read all relay log' status
STOP SLAVE;
SET GLOBAL read_only=0;
UNLOCK TABLES;
RESET MASTER;

コマンドの更新されたリスト:

On Master:
CHANGE MASTER TO MASTER_Host=slave.com, MASTER_LOG_FILE=MASTER_LOG_FILE, MASTER_LOG_POS=MASTER_LOG_POS, ....
START SLAVE;
# Wait till caught up;
STOP SLAVE;
RESET MASTER;

On Slave:
CHANGE MASTER TO <original slave settings>;
START SLAVE;
USE mydb;
FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only=1;
2
postelrich

Read_only = 0に設定し、スレーブ(新しいマスター)へのポイント接続を実行する前に、

show master status;

それらの番号をメモします。

マスターサーバーを回復したら、実行できます

CHANGE MASTER TO MASTER_Host=myslavehost.example.com, MASTER_LOG_FILE=[take it from your notes],MASTER_LOG_POS=[take it from your notes], MASTER_USER='replication_user', MASTER_PASSWORD='replication_password';
START SLAVE;

次に、古いマスターが新しいマスターから複製を開始し、追いつきます。

注意すべき点がいくつかあります。

  • Expire_logs_days設定が、リカバリーにかかる日数よりも多く設定されていることを確認してください。そうしないと、binlogが失われ、古いマスターを最初からセットアップする必要があります
  • レプリケーションのユーザーとパスワードを確認してください。そうでない場合は、次の方法で回復できます。

    • リポジトリテーブル(master_info_repository = TABLEの場合)

      mysql.slave_master_infoからUser_name、User_passwordを選択します。

    • master.infoファイル(5行目と6行目)

  • マスターがクラッシュした場合、スレーブが少し遅れている可能性があるため、マスターをスレーブから複製するように設定した後、自動インクリメントの競合が発生します。 pt-table-syncを使用すると、この状況を改善できます。
2
Károly Nagy