ネタ提供は @kenjiskywalker さん。
5.0から5.6でレプリケーション、Unknown system variable 'binlog_checksum', Error_code: 119 って言われててつらい感じする
— 私の頭の中の弥勒菩薩さん (@kenjiskywalker) 2013年5月10日
今日もありがとうございます(*-人-)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 件のコメント :
コメントを投稿