mysql同步错误:Last_Errno: 1677
问题:
mysql数据库双主同步遇到1677错误:
1
2 Last_Errno: 1677
Last_Error: Column 5 of table 'test.users' cannot be converted from type 'int(11)' to type 'varchar(128)'
遇到这个错误比较奇怪,按错误的字面意思大概说是字段类型的转换出了错。明胆是两台数据库,一样的表结构,怎么会出现类型转换问题呢。
连设置slave-skip-errors=1677都不能跳过这个错误:
1 slave-skip-errors=1677
原因:
GOOGLE搜索了好久也说是mysql5.7版本以前存在这个BUG,建议升级mysql版本。
我试着去分析了一下错误原因,发现是因为之前在服务器上加了新字段引起的问题(修改字段类型也可能引起该问题)。
假设我的两台服务器分别是A和B,A和B做的双主同步。
A和B中test.users结构如下:
1
2
3
4
5
6
7
8
9 +--------------------+---------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+---------------------+------+-----+---------------------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| site_id | int(11) | NO | MUL | 0 | |
| source_book_id | varchar(100) | NO | MUL | 0 | |
| read_times | int(11) | NO | MUL | 0 | |
| fav_times | int(11) | NO | MUL | 0 | |
+--------------------+---------------------+------+-----+---------------------+----------------+
因为在其中一台服务器A上的test.users上加了一个字段,加字段之后的表结构如下:
1
2
3
4
5
6
7
8
9
10 +--------------------+---------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+---------------------+------+-----+---------------------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| site_id | int(11) | NO | MUL | 0 | |
| source_book_id | varchar(100) | NO | MUL | 0 | |
| read_times | int(11) | NO | MUL | 0 | |
| last_chapter_title | varchar(128) | NO | | | |
| fav_times | int(11) | NO | MUL | 0 | |
+--------------------+---------------------+------+-----+---------------------+----------------+
因为加字段的时候表test.users还有大量数据没有完全同步到A上来,加了字段后还需要将之前的数据进行同步,解析了一下mysql的binlog里面的插入sql格式如下:
1 INSERT INTO test.users VALUES (1, 2, 1, 99, 6);
从上面的sql明显可以看出来,第5个字段的值是6,原本这个6对应的是fav_times的值,表的字段个数和第5个字段的类型都不一样了,所以同步会出错。
解决方法
将新加的字段last_chapter_title从A上先删除掉,等表数据然全同步完之后再次加了新字段。
发表评论
| Trackback