2013年2月12日火曜日

MySQL5.6のマスターにMySQL5.5(とそれ以前)のスレーブをぶら下げるとエラる

ぱっと見、誰も書いてなさそうなので。

MySQL 5.6ではバイナリログのチェックサム(binlog_checksum)が追加され、
しかもそれが5.6.5以降デフォルトで有効になっているので、
5.5をスレーブにして構成するとI/O ThreadがErr:1236で止まる。

mysql55> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: localhost
Master_User: replicator
Master_Port: 64056
Connect_Retry: 60
Master_Log_File: bin.000007
Read_Master_Log_Pos: 4
Relay_Log_File: relay.000004
Relay_Log_Pos: 144
Relay_Master_Log_File: bin.000007
Slave_IO_Running: No
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 4
Relay_Log_Space: 327
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Slave can not handle replication events with the checksum that master is configured to log; the first event 'bin.000006' at 120, the last event read from './bin.000007' at 120, the last byte read from './bin.000007' at 120.'
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1056
1 row in set (0.00 sec)
ワークアラウンドはもちろんbinlog_checksum = noneで起動することだけれども、
mysql56> SHOW GLOBAL VARIABLES LIKE 'binlog_checksum';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| binlog_checksum | CRC32 |
+-----------------+-------+
1 row in set (0.00 sec)

mysql56> SHOW MASTER STATUS;
+------------+----------+--------------+------------------+-------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------+----------+--------------+------------------+-------------------+
| bin.000007 |      462 |              |                  |                   |
+------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql56> SET GLOBAL binlog_checksum = none;
Query OK, 0 rows affected (0.03 sec)

mysql56> SHOW GLOBAL VARIABLES LIKE 'binlog_checksum';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| binlog_checksum | NONE  |
+-----------------+-------+
1 row in set (0.00 sec)

mysql56> SHOW MASTER STATUS;
+------------+----------+--------------+------------------+-------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------+----------+--------------+------------------+-------------------+
| bin.000008 |      120 |              |                  |                   |
+------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

チェックサムはバイナリログ単位で有効/無効化されるため、SET GLOBALで変えるとバイナリログがスイッチする。
もちろん、今までbinlog_checksum = crc32で記録されたバイナリログはチェックサム有効の状態で記録されているので、mysqlbinlogで吸い上げて当てるしかない。

わざわざ互換性の無い方をデフォルトにしなくても…とも思いつつ、



おっしゃるとおりです。。


【2013/02/14 12:46】
これもともとは循環レプリケーション内で1台だけやったら…という話がMLに上がっていたので試したメモなのです。
http://lists.mysql.com/mysql/228945

あと、MariaDB10.0のマルチソースレプリを試そうとしたら、MariaDB10.0は5.5ベースなので5.6にそのままぶら下げたらエラったのもありました。

レアケースですよね。


【2013/02/18 10:57】
更に前方互換性をなくす、ROWモードでのバイナリ非互換もあったみたい。。

@i_rethiさんがbinlog_rows_query_log_eventsのお試し中に気付いたそうな。

0 件のコメント :

コメントを投稿