一例mysql ERROR 1062错误的原因和解决办法

分类: 技术随笔 |
两个mysql DB
instance,DB的内容完全相同,执行一条SQL语句向一个临时表中插入数据,插入的数据是从另一个表中通过group
by的方式查询出来的,SQL语句类似为:
INSERT INTO tbl_temporary (SELECT * FROM tbl_data_source WHERE condition=1 GROUP BY some_field1,some_filed2 ORDER BY pk_id);
tbl_data_source的数据规模较大,百万级别。结果一个运行正常,另一个报1062错误:Duplicate entry 'WLBAG-1006-614374664' for key 'group_key',而且每次执行报错的duplicate entry并不相同,具有一定的随机性。网上查找很多似乎没有直接符合这个情况的原因,于是从两个DB instance的不同点着手。
两个instance的版本接近,猜测不是版本问题。执行sql语句的两个DB用同样的方式导入,于是怀疑是数据库的字符集问题。
检查mysql的字符集配置:
show variables like 'collation_%';
show variables like 'character_set_%';
结果运行正常的utf-8,报错的是latin1,如下图。
http://s8/mw690/6ff63125tcc38518cb927&690ERROR1062错误的原因和解决办法" TITLE="一例mysql ERROR 1062错误的原因和解决办法" />
于是修改mysql字符集配置。
1. 打开mysql的配置文件my.cnf
2. 在[client]下面加上一行:default-character-set=utf8
3. 在[mysqld]下面也加上:default-character-set=utf8
4. 保存关闭后重启mysql:service mysql restart
再次查看mysql的字符集,应该变成utf8了。
若mysql版本为5.5.x,OS为ubuntu12.04,可能会出现按上述配置后mysql服务无法启动的情况。此时将步骤3中[mysqld]的改动替换为:
3. 在[mysqld]下面加上:character-set-server=utf8
保存后重启就应该正常了。
前一篇:C++中计算程序运行的时间