Quantcast
Channel: 日々の覚書
Viewing all articles
Browse latest Browse all 581

MySQL 5.5とそれ以前のマスターにMySQL 5.7のスレーブはぶら下げられない

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

MySQL Bugs: #79272: MySQl 5.5 master fails to replicate to MySQL 5.7.9


これはレプリケーションの開始時に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へはジャンプできないのでした(´・ω・`)

Viewing all articles
Browse latest Browse all 581

Trending Articles