2013年5月10日金曜日

MySQL 5.6より前のマスターにMySQL 5.6のスレーブをぶら下げるとワーニングが出る(Err: 1193)

知らなかったのでメモる。
ネタ提供は @kenjiskywalker さん。

今日もありがとうございます(*-人-)


5.5, 5.1, 5.0のマスターに5.6のスレーブをぶら下げてSTART SLAVEすると、こんなワーニングが出る。

2013-05-10 12:45:45 15820 [Warning] Slave I/O: Notifying master by SET @master_binlog_checksum= @@global.binlog_checksum faile
d with error: Unknown system variable 'binlog_checksum', Error_code: 1193
2013-05-10 12:45:45 15820 [Warning] Slave I/O: Unknown system variable 'SERVER_UUID' on master. A probable cause is that the v
ariable is not supported on the master (version: 5.5.31-log), even though it is on the slave (version: 5.6.11-log), Error_code
: 1193

これ自体はWarningで動作に問題はないけど、なんでMySQL 5.6で追加されたbinlog_checksumと
SERVER_UUIDが`MySQL 5.6のエラーログ'に出るんだろうとふと思って調べてみる。

取り敢えず覗いてみると、sql/rpl_slave.cc:get_master_version_and_clock にこんなところを発見。

2047     const char query[]= "SET @master_binlog_checksum= @@global.binlog_checksum";
2048     master_res= NULL;
2049     mi->checksum_alg_before_fd= BINLOG_CHECKSUM_ALG_UNDEF; //initially undefined
..
2056     rc= mysql_real_query(mysql, query, strlen(query));
2057     if (rc != 0)
..
2063       if (mysql_errno(mysql) == ER_UNKNOWN_SYSTEM_VARIABLE)
2064       {
2065         // this is tolerable as OM -> NS is supported
2066         mi->report(WARNING_LEVEL, mysql_errno(mysql),
2067                    "Notifying master by %s failed with "
2068                    "error: %s", query, mysql_error(mysql));

マスターに向かって、"SET @master_binlog_checksum= @@global.binlog_checksum"を放って、
リターンコードでものによってはワーニングにしたりFatalでI/Oスレッドとめたり。

MySQL 5.5以前はbinlog_checksum変数がないから、ER_UNKNOWN_SYSTEM_VARIABLEで必ずエラーになるはず。


SERVER_UUIDのところは sql/rpl_slave.cc:get_master_uuid から

1541   if (!mysql_real_query(mysql,
1542                         STRING_WITH_LEN("SHOW VARIABLES LIKE 'SERVER_UUID'")) &&
1543       (master_res= mysql_store_result(mysql)) &&
1544       (master_row= mysql_fetch_row(master_res)))
1545   {
..

1587   else if (!master_row && master_res)
1588   {
1589     mi->report(WARNING_LEVEL, ER_UNKNOWN_SYSTEM_VARIABLE,
1590                "Unknown system variable 'SERVER_UUID' on master. "
1591                "A probable cause is that the variable is not supported on the "
1592                "master (version: %s), even though it is on the slave (version: %s)",
1593                mysql->server_version, server_version);
1594   }

マスターに向かって"SHOW VARIABLES LIKE 'SERVER_UUID'"を放って、結果セットを空っぽでもらってこのワーニングになる、と。


で、この2つの関数は sql/rpl_slave.cc:handle_slave_ioからこんな風に

4056 connected:
..
4067   mysql_mutex_lock(&mi->run_lock);
4068   mi->slave_running= MYSQL_SLAVE_RUN_CONNECT;
4069   mysql_mutex_unlock(&mi->run_lock);
4070
4071   thd->slave_net = &mysql->net;
4072   THD_STAGE_INFO(thd, stage_checking_master_version);
4073   ret= get_master_version_and_clock(mysql, mi);
4074   if (!ret)
4075     ret= get_master_uuid(mysql, mi);
4076   if (!ret)
4077     ret= io_thread_init_commands(mysql, mi);

呼ばれていて、呼び出し元をたどっていくと sql/rpl_slave.cc:start_slave_threads にたどり着く。

OK、START SLAVEすると毎回出るのね。
しかしこんな処理追加になってたのか。。
楽しかった。

0 件のコメント :

コメントを投稿