Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

MySQL-5.5/5.6でのレプリケーション利用者に伝えたい「RESET SLAVE」にまつわる怖い話

MySQL-5.5よりRESET SLAVE;の挙動が変わり、直後にCHANGE MASTER構文を
発行しないと場合によっては問題が発生するとMySQLのドキュメントに記載されていました。
さらに、RESET SLAVE ALL;というクエリもサポートされたようです。

どういう事なのでしょう?
調べてみました。

ドキュメントにさらっと何か書いてある

In MySQL 5.6 (unlike the case in MySQL 5.1 and earlier), RESET SLAVE does not change any replication connection parameters such as master host, master port, master user, or master password, which are retained in memory. This means that START SLAVE can be issued without requiring a CHANGE MASTER TO statement following RESET SLAVE. http://dev.mysql.com/doc/refman/5.6/en/reset-slave.html

怖い話

RESET SLAVE;だけ行い、CHANGE MASTER TOを発行せずにいた場合、
バイナリログ名やポジション情報はクリアされますが、
MASTER_HOSTやMASTER_USER、MASTER_PASSWORDはそのまま残ります。
故に、何かの拍子に mysqldを再起動が掛かったら、マスタのバイナリログの先頭から
レプリケーション自動開始となり、スレーブのデータに不整合が起きて青ざめる・・・。
なんていう事故が起きそうですよね。

まぁ、自分が開発環境で遭遇した現象なんですけどね。
注:故意ですので事故ではありません

RESET SLAVE ALL; とは

RESET SLAVE;とはクリア対象が異なります。具体的には以下の通り。
master_host, master_user, master_passwordに0が代入されます。

RESET SLAVE; RESET SLAVE ALL;
master_log_name master_log_name
master_log_pos master_log_pos
ssl_verify_server_cert ssl_verify_server_cert
heartbeat_period heartbeat_period
- master_host
- master_user
- master_password

MySQL-5.0や5.1の時のように、RESET SLAVE;の後に、
change master to master_host='';を打てば良いのでは?
と思う方もいらっしゃると思います。
しかし、MySQL-5.5からはこの構文が使えなくなくなりました。

mysql> change master to master_host='';
ERROR 1210 (HY000): Incorrect arguments to MASTER_HOST

そこで、やはりRESET SLAVE ALL;の出番となります。

まとめ

スレーブ設定をクリアする手順が5.5以降で異なります。
RESET SLAVE ALL;を覚えておきましょう!
my.cnfskip-slave-startと記述しておくとさらに安心ですね。

MySQL-5.0/5.1

  • STOP SLAVE;
  • CHANGE MASTER TO MASTER_HOST='';
  • RESET SLAVE;

MySQL-5.5/5.6

  • STOP SLAVE;
  • RESET SLAVE ALL;

参考記事