mysql>show slave status\G
Master_Log_File: binlog.000233
Read_Master_Log_Pos: 274415020
Relay_Log_File: relay-bin.000253
Relay_Log_Pos: 175535154
Relay_Master_Log_File: binlog.000233
Slave_IO_Running: Yes
Slave_SQL_Running: No
.................:
Last_Errno: 1677
Last_Error: Column 28 of table 'test.test_tab_t1' cannot be converted from type 'varchar(30)(bytes))' to type 'varchar(400(bytes) gbk)'
Skip_Counter: 0
Exec_Master_Log_Pos: 175536357
Relay_Log_Space: 274410464
MySQL告警日志的报错信息:
2020-03-24T16:53:16.051244Z 11686 [ERROR] Slave SQL for channel '': Column 28 of table 'test.test_tab_t1' cannot be converted from type 'varchar(30(bytes))' to type 'varchar(400(bytes) gbk)', Error_code: 1677
2020-03-24T16:53:16.051269Z 11686 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'binlog.000233' position 175536357.
三、诊断过程1、根据MySQL Replication Breaks With Error 1677: Column .. of Table '...' Cannot Be Converted (Doc ID 2037712.1)文档来看报错信息err1677分析来看test.test_tab_t1表的某个列(Column 28),出现了字符集相关的转换错误。
首先对比(master1-master2)的字符集设置信息:
之后对比(master1-master2)库级,表级,列级的字符集信息:MASTER1 库级,表级,列级的字符集信息:
mysql>select from information_schema.schemata where schema_name='test';
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| def | test | gbk | gbk_general_ci | NULL | NO |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
mysql>select table_schema,table_name,table_type,table_collation from information_schema.tables where table_name='test_tab_t1';
+--------------+------------+------------+-----------------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | TABLE_COLLATION |
+--------------+------------+------------+-----------------+
| test | test_tab_t1| BASE TABLE | gbk_chinese_ci |
+--------------+------------+------------+-----------------+
mysql>select table_name,column_name,character_maximum_length,character_octet_length,character_set_name,collation_name
from information_schema.columns where table_name='test_tab_t1' and table_schema='test' and ordinal_position=29;
+------------+-------------+--------------------------+------------------------+--------------------+----------------+
| TABLE_NAME | COLUMN_NAME | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | CHARACTER_SET_NAME | COLLATION_NAME |
+------------+-------------+--------------------------+------------------------+--------------------+----------------+
| test_tab_t1| BXXX | 200 | 400 | gbk | gbk_chinese_ci |
+------------+-------------+--------------------------+------------------------+--------------------+----------------+
MASTER2 库级,表级,列级的字符集信息:
mysql>select from information_schema.schemata where schema_name='test';
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| def | test | gbk | gbk_general_ci | NULL | NO |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
mysql>select table_schema,table_name,table_type,table_collation from information_schema.tables where table_name='test_tab_t1';
+--------------+------------+------------+-----------------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | TABLE_COLLATION |
+--------------+------------+------------+-----------------+
| test | test_tab_t1| BASE TABLE | gbk_chinese_ci |
+--------------+------------+------------+-----------------+
mysql>select table_name,column_name,character_maximum_length,character_octet_length,character_set_name,collation_name
from information_schema.columns where table_name='test_tab_t1' and table_schema='test' and ordinal_position=29;
+------------+-------------+--------------------------+------------------------+--------------------+----------------+
| TABLE_NAME | COLUMN_NAME | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | CHARACTER_SET_NAME | COLLATION_NAME |
+------------+-------------+--------------------------+------------------------+--------------------+----------------+
| test_tab_t1| BXXX | 200 | 400 | gbk | gbk_chinese_ci |
+------------+-------------+--------------------------+------------------------+--------------------+----------------+
根据文档((Doc ID 2037712.1)来看确实是系统升级变更表字段所对应的列(ALTER TABLE TEST.TEST_TAB_T1 MODIFY BXXX VARCHAR(200);)出现了问题。报错:Last_Error: Column 28 of table 'test.test_tab_t1' cannot be converted from type 'varchar(30(bytes))' to type 'varchar(400(bytes) gbk)就是test.test_tab_t1表变更的字段bxxx(ordinal_position=29)在复制过程中出现了字符集问题,gbk的字节大小是2,变更前bxxx确实是varchar(15)。
mysql> select * from information_schema.character_sets where character_set_name='gbk';
+--------------------+----------------------+------------------------+--------+
| CHARACTER_SET_NAME | DEFAULT_COLLATE_NAME | DESCRIPTION | MAXLEN |
+--------------------+----------------------+------------------------+--------+
| gbk | gbk_chinese_ci | GBK Simplified Chinese | 2 |
+--------------------+----------------------+------------------------+--------+
mysqlbinlog --no-defaults --start-position=175536357 --database=test /opt/mysql/log/binlog/binlog.000233 --verbose at 175536357200325 0:53:16 server id 1 end_log_pos 175536422 CRC32 0xddd5d37 Anonymous_GTID last_committed=271185 sequence_number=27186 rbr_only=yes
/!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED//*!/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/!*/; at 175536422200325 0:53:16 server id 1 end_log_pos 175536505 CRC32 0x3799f3b Query thread_id=14154792 exec_time=0 error_code=0
SET TIMESTAMP=1585068796/!/;
SET @@session.pseudo_thread_id=14154792/*!/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/!*/;
SET @@session.sql_mode=1075838976/!/;
SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=2/*!/;
/!\C gbk *//!/;
SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=28/*!/;
SET @@session.lc_time_names=0/!*/;
SET @@session.collation_database=DEFAULT/!/;
BEGIN
/*!/; at 175536505200325 0:53:16 server id 1 end_log_pos 175536685 CRC32 0xe3db6b6b Table_map: test.test_tab_t1 mapped to number 23434 at 175536685200325 0:53:16 server id 1 end_log_pos 175537481 CRC32 0xf1343123 Update_rows: table id 2334 flags: STMT_END_F UPDATE test.test_tab_t1 WHERE @1='........' .......... @29='........' .......... @40='...' SET @1='........' .......... @29='........' .......... @40='...'