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.cnf
にskip-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;
参考記事
- MySQL :: MySQL 5.6 Reference Manual :: 13.4.2.3 RESET SLAVE Syntax
http://dev.mysql.com/doc/refman/5.6/en/reset-slave.html - Disconnecting a replication slave is easier with MySQL 5.5+ (RESET SLAVE vs. RESET SLAVE ALL)
http://www.mysqlperformanceblog.com/2013/04/17/reset-slave-vs-reset-slave-all-disconnecting-a-replication-slave-is-easier-with-mysql-5-5/