2015年12月8日火曜日

MySQL 5.5とそれ以前のマスターにMySQL 5.7のスレーブはぶら下げられない(5.7.13で修正)

出来ないのは仕様だそうです。ステータスは"Not a Bug"

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


という訳で、MySQL 5.7のmysql_upgradeでイケるにしてもレプリケーションに属するサーバーを全部いっぺんに上げない限りは5.5から5.7へはジャンプできないのでした(´・ω・`)


【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 件のコメント :

コメントを投稿