网站地图

mysql同步错误:Last_Errno: 1677

2013年6月18日 | 分类: mysql使用 | 标签: , ,

问题:
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上先删除掉,等表数据然全同步完之后再次加了新字段。

目前还没有任何评论.