MySQL Bugs: #79272: MySQl 5.5 master fails to replicate to MySQL 5.7.9
【2016/07/08 12:04】
MySQL Bugs: #80962: Replication does not work when @@GLOBAL.SERVER_UUID is missing on the master で改めてFIXされました。 5.7.13から5.5系のマスターにつなげるようになっています。
これはレプリケーションの開始時にI/Oスレッドがマスターのserver_uuidサーバー変数を参照しに行くんだけど、その値が取れなくてエラーになる。
…あれ、これどこかで聞いたことある気がする。と思ったら5.6の時に軽く調べてた。
日々の覚書: MySQL 5.6より前のマスターにMySQL 5.6のスレーブをぶら下げるとワーニングが出る(Err: 1193)
MySQL 5.6からMySQL 5.5は同じくserver_uuid変数を参照するものの、I/Oスレッドはアボートせずワーニング止まりだった。それがMySQL 5.7では止まる。
試しにMySQL::Sandboxで5.5.46, 5.6.27, 5.7.9を浮かしてみると
mysql [localhost] {msandbox} ((none)) > CHANGE MASTER TO master_host= '127.0.0.1', master_port= 5627, master_user= 'rsandbox', master_password= 'rsandbox', master_log_file= 'bin.000001', master_log_pos= 1 FOR CHANNEL 'mysql56'; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql [localhost] {msandbox} ((none)) > CHANGE MASTER TO master_host= '127.0.0.1', master_port= 5546, master_user= 'rsandbox', master_password= 'rsandbox', master_log_file= 'bin.000001', master_log_pos= 1 FOR CHANNEL 'mysql55'; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql [localhost] {msandbox} ((none)) > START SLAVE; Query OK, 0 rows affected (0.01 sec) mysql [localhost] {msandbox} (performance_schema) > SELECT * FROM performance_schema.replication_connection_status; +--------------+------------+--------------------------------------+-----------+---------------+---------------------------+--------------------------+--------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+ | CHANNEL_NAME | GROUP_NAME | SOURCE_UUID | THREAD_ID | SERVICE_STATE | COUNT_RECEIVED_HEARTBEATS | LAST_HEARTBEAT_TIMESTAMP | RECEIVED_TRANSACTION_SET | LAST_ERROR_NUMBER | LAST_ERROR_MESSAGE | LAST_ERROR_TIMESTAMP | +--------------+------------+--------------------------------------+-----------+---------------+---------------------------+--------------------------+--------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+ | mysql55 | | | NULL | OFF | 0 | 0000-00-00 00:00:00 | | 1593 | Fatal error: The slave I/O thread stops because a fatal error is encountered when it tries to get the value of SERVER_UUID variable from master. | 2015-12-08 15:54:40 | | mysql56 | | 9b2a8e7a-9d57-11e5-8f87-02018582356a | 42 | ON | 2 | 2015-12-08 15:55:40 | | 0 | | 0000-00-00 00:00:00 | +--------------+------------+--------------------------------------+-----------+---------------+---------------------------+--------------------------+--------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+ 2 rows in set (0.00 sec)
5.7と5.5は確かにエラった。
5.6から5.5だと
mysql [localhost] {msandbox} ((none)) > CHANGE MASTER TO master_host= '127.0.0.1', master_port= 5546, master_user= 'rsandbox', master_password= 'rsandbox', master_log_file= 'bin.000001', master_log_pos= 1; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql [localhost] {msandbox} ((none)) > START SLAVE; Query OK, 0 rows affected (0.02 sec) mysql [localhost] {msandbox} ((none)) > SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 127.0.0.1 Master_User: rsandbox Master_Port: 5546 Connect_Retry: 60 Master_Log_File: bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: mysql_sandbox5627-relay-bin.000002 Relay_Log_Pos: 264 Relay_Master_Log_File: bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes ..
エラーにはならない。コードを眺めてみると、5.6では "SHOW VARIABLES LIKE 'SERVER_UUID'"して、ちゃんとserver_uuidが返ってくる(server_uuidをサポートしている5.6以上)かエラーになる(予期しない想定外の事態なんだと思う)か空の結果セットが返ってくる(5.5とそれより前の、server_uuidをサポートしていないバージョン)かの3択で切り分けていた。
https://github.com/mysql/mysql-server/blob/12ec343846f2c1ed9f0454ccca8997afc4a0bb5f/sql/rpl_slave.cc#L1877-L1880
それが5.7だと"SELECT @@GLOBAL.SERVER_UUID"で取ろうとするので、server_uuidをサポートしていないバージョンだと"Unknown system variable"で一発エラーになってFatalでI/Oスレッドが止まる。
mysql [localhost] {msandbox} ((none)) > SELECT @@GLOBAL.SERVER_UUID; ERROR 1193 (HY000): Unknown system variable 'SERVER_UUID'
https://github.com/mysql/mysql-server/blob/ef4fcf760a2d3b098a475323e289a6cab57020ab/sql/rpl_slave.cc#L2356-L2358
【2016/07/08 12:04】
5.7.13で5.5とそれ以前のマスターのスレーブになれるようになりました。
MySQL Bugs: #80962: Replication does not work when @@GLOBAL.SERVER_UUID is missing on the master
> Replication: Slaves running MySQL 5.7 could not connect to a MySQL 5.5 master due to an error retrieving the server_uuid, which is not part of MySQL 5.5. This was caused by changes in the method of retrieving the server_uuid. (Bug #22748612)
http://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-13.html
とはいえそもそも2世代またいだレプリケーションはサポート対象外ではある。
しかし、 MySQL Bugs: #79272: MySQl 5.5 master fails to replicate to MySQL 5.7.9 の "Not a Bug" は何だったのか。
0 件のコメント :
コメントを投稿