主从复制1062错误解决方法

当复制中断的时候,我们常用的方法是跳过错误,比如SET GLOBAL SQL_SLAVE_SKIP_COUNTER
=1
或者直接slave-skip-errors=1062,这样确实解决了问题,恢复了复制。但是久而久之主从数据相差就很大了。对于复制正常以后,我们还需要使用pt-table-checksum数据效验,以及pt-table-sync同步数据,今天线上一个从库中断,查看了错误,发现是主键冲突,至于为何会发现这些情况,请阅读MySQL
Replication需要注意的问题


Last_Error: Error ‘Duplicate entry ‘192442‘ for key ‘PRIMARY‘‘ on query. Default database: ‘xxxxxxxxxxx‘. Query: ‘INSERT INTO xxxxxxxxxxxxx(playerId, `type`, `count`)
VALUES( NAME_CONST(‘pPlayerId‘,629014986), NAME_CONST(‘pType‘,8), 0)‘
Skip_Counter: 0
Exec_Master_Log_Pos: 1499475
Relay_Log_Space: 4829077512
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: 0
Last_IO_Error:
Last_SQL_Errno: 1062
Last_SQL_Error: Error ‘Duplicate entry ‘192442‘ for key ‘PRIMARY‘‘ on query. Default database: ‘xxxxxxxxxxxxxx‘. Query: ‘INSERT INTO xxxxxxxxxxx(playerId, `type`, `count`)
VALUES( NAME_CONST(‘pPlayerId‘,629014986), NAME_CONST(‘pType‘,8), 0)‘
1 row in set (0.00 sec)

于是根据提示,以及查看表结构,发现果然是主键冲突了,但是表的记录却不一致,所以往往我们跳过错误就会导致主从数据不一致的问题。

主库上的记录:


mysql> select * from xxxx.xxxx where id=192442;
+--------+-----------+------+-------+-------+---------------+
| id | playerId | type | count | total | lastResetTime |
+--------+-----------+------+-------+-------+---------------+
| 192442 | 629014986 | 8 | 0 | 0 | 0 |
+--------+-----------+------+-------+-------+---------------+
1 row in set (0.00 sec)

mysql>

从库上的记录:


mysql> select * from xxxx.xxxx where id=192442;
+--------+-----------+------+-------+-------+---------------+
| id | playerId | type | count | total | lastResetTime |
+--------+-----------+------+-------+-------+---------------+
| 192442 | 629015414 | 8 | 0 | 0 | 0 |
+--------+-----------+------+-------+-------+---------------+
1 row in set (0.00 sec)

mysql>

有时候我会手动删除从库上提示的相应记录,但是往往是比较麻烦的。因为可能不止一条记录重复,可能N条,所以我就简单的写了一个脚本,删除主键冲突的记录,这个脚本只适合主键冲突的情况。


#!/bin/bash
#Delete duplicate records primary key conflict
#Write by yayun 2014-05-17

mysql=/usr/local/mysql-5.1.66/bin/mysql
sock=/data/mysql-slave-3311/mysql.sock
passwd=123456

while true
do
SQL_THREAD=`$mysql -uroot -p$passwd -S $sock -e ‘show slave status\G‘ | egrep ‘Slave_SQL_Running‘ | awk ‘{print $2}‘`
LAST_ERROR=`$mysql -uroot -p$passwd -S $sock -e ‘show slave status\G‘ | egrep Last_Errno | awk ‘{print $2}‘`
duplicate=`$mysql -uroot -p$passwd -S $sock -e ‘show slave status\G‘ | grep Last_Error | awk ‘/Duplicate entry/{print $5}‘ | awk -F "‘" ‘{print $2}‘`
DATABASE=`$mysql -uroot -p$passwd -S $sock -e ‘show slave status\G‘ | grep Last_Error | awk ‘{print $13}‘ | awk -F "‘" ‘{print $2}‘`
TABLE=`$mysql -uroot -p$passwd -S $sock -e ‘show slave status\G‘ | grep Last_Error | awk -F ":" ‘{print $4}‘ | awk -F "(" ‘{print $1}‘ | awk ‘{print $NF}‘`

$mysql -uroot -p$passwd -S $sock -e ‘show slave status\G‘ | grep HA_ERR_FOUND_DUPP_KEY
if [ $? -eq 1 ]
then
if [ "$SQL_THREAD" == No ] && [ "$LAST_ERROR" == 1062 ]
then
FILED=`$mysql -uroot -p$passwd -S $sock -Nse "desc $DATABASE.$TABLE" | grep PRI | awk ‘{print $1}‘`
$mysql -uroot -p$passwd -S $sock -e "delete from $DATABASE.$TABLE where $FILED=$duplicate"
$mysql -uroot -p$passwd -S $sock -e "start slave sql_thread"
else
echo "====================== ok ========================"
$mysql -uroot -p$passwd -S $sock -e ‘show slave status\G‘ | egrep ‘Slave_.*_Running‘
echo "====================== ok ========================"
break
fi
fi
done

脚本随便写的。大家可以再自己相应的扩展一下。^_^

时间: 2024-08-27 20:19:41

主从复制1062错误解决方法的相关文章

MySQL主从复制出错的解决方法

MySQL主从复制出错的解决方法 主从复制中若是出现错误可以通过几个方法来进行解决 1.如果主从复制时发生了主键冲突,从而阻止了主从复制,可以使用sql_slave_skip_counter这个变量来忽略错误将其排除 2.如果发生了较大的错误,可以考虑使用reset slave的方法重新配置从服务器来恢复错误 以下演示如何使用这两种方法解决错误,及相关操作的详细说明 reset slave的使用方法 环境准备搭建主从同步 主节点配置 1.修改配置文件 [[email protected] ~]#

阿里云Windows server 2008服务器搭建VPN 图文教程,购买境外服务器自建vpn,Win8/win10 连接VPN被阻止,出现812错误解决方法

阿里云Windows server 2008服务器搭建VPN 图文教程(超详细) 第一步:购买阿里云服务器,本文使用的是Windows Server 2008 R2 企业版64位中文版 IP地址:47.88.151.129,所属节点:亚太(新加坡) 服务器配置:2核,4GB,带宽10Mbps 第二步: 打开服务器管理器,点击添加角色,如下图: 本帖隐藏的内容然后弹出如下图所示,点击下一步: 点击后,如下图,勾选网络策略和网络服务,然后点击下一步: 接着继续点击下一步,直到弹出如下图所示的页面,勾

mysql Access denied for user [email protected]错误解决方法总结(转)

mysql Access denied for user [email protected]错误解决方法总结(转) mysql Access denied for user \'root\'@\'localhost\'”解决办法总结,下面我们对常见的出现的一些错误代码进行分析并给出解决办法,有需要的朋友可参考一下. 错误代码 1045 Access denied for user 'root'@'localhost' (using password:YES) 解决办法是重新设置root用户密码,

项目部署到tomcat6.0启动成功后访问页面报500错误解决方法

如题:项目部署到tomcat6.0启动成功后访问页面报500错误解决方法,很奇葩,启动的时候没有任何问题,但输入访问地址后报500,去年国庆放假前夕,为这个问题伤神了半天最后解决了,今天又碰到了,乍一看摸不着头,后面仔细回想了下,迅速解决了问题. 原因:项目里面的jar和tomcat里面lib里面的jar重复了. 解决方法: 1.要么更换tomcat7或之后的版本,之后的版本就不会出现这个问题. 2.去部署之后的tomcat的webapps\项目名\WEB-INF\lib 里面删掉jsp-api

error at ::0 can't find referenced pointcut pointCutName 错误解决方法

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public final void org.mybatis.spring.support.SqlSessionDaoSupport.setSqlSessionTemplate(org.mybatis.spring.SqlSessionTemplate); nested exception is java.la

apache指定的网络名不再可用错误解决方法

系统平台:  window server 2003  R2 service Pack 2 网站服务器环境:wamp [ apache:2.4.4 ]; 问题描述:服务器工作一点时间就出现假死状态,网站无法访问.查看apache错误日志出现如下错误: 在google上找到如下系列文章:http://jingyan.baidu.com/article/154b4631a9d5b828ca8f4198.html http://hi.baidu.com/h_appy/item/ed13fb2ad0fa2

GoldenGate 1403错误解决方法

OGG  oracle goldengate 1403错误解决方法 1. 错误描述WARNING OGG-01154 Oracle GoldenGate Delivery for Oracle, repyxb.prm: SQL error 1403 mapping SGPM.P_SMS_SEND to SGPM.P_SMS_SEND.WARNING OGG-01003 Oracle GoldenGate Delivery for Oracle, repyxb.prm:  Repositionin

ORA-01157 错误解决方法

对Oracle 11g数据库进行数据迁移时出现如下错误: ORA-01157: cannot identify/lock data file 1 - see DBWR trace file ORA-01110: data file 1: 'F:\ORACLE\SID\SAPDATA1\SYSTEM_1\SYSTEM.DATA1' 说明已经很清楚了,直接查看相关的错误解决方法: http://www.eygle.com/pdf/Ora-1157.Error.Correct.pdf 如果连接打不开可

linux上的mysql报Table 'xxx' doesn't exist的错误解决方法

linux上的mysql报Table 'xxx' doesn't exist的错误解决方法 问题:程序报Table 'xxx' doesn't exist 的错误,但是查看数据库发现该表已经存在且字母也没有拼错. 原因:linux 上的mysql 默认是区分大小写导致的. 解决:改动mysql的配置文件,在my.cnf中的[mysqld]下面(位置不能错)加上lower_case_table_name=1这句(1表示不区分大小写,0区分大小写),保存重新启动mysql. 没有my.cnf文件,如