mysql 错误1062_mysql主从切换步骤

mysql 错误1062_mysql主从切换步骤周末的时候,突然收到报警的短信,是一台slave服务器sql_thread不为YES,唉,还能不能愉快的过周末啊。上服务器一看是,是主键冲突导致从库中断,也是Last_SQL_Errno:1062错误,我们常用的方法是跳过错误,比如SETGLOBALSQL_SLAVE_SKIP_COUNTER=1或者直接slave-skip-errors=1062,这样确实解决了问题,恢复了复制。但是久而…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

周末的时候,突然收到报警的短信,是一台slave服务器sql_thread不为YES,唉,还能不能愉快的过周末啊。上服务器一看是,是主键冲突导致从库中断,也是Last_SQL_Errno: 1062错误,我们常用的方法是跳过错误,比如SET GLOBAL SQL_SLAVE_SKIP_COUNTER =1或者直接slave-skip-errors=1062,这样确实解决了问题,恢复了复制。但是久而久之主从数据相差就很大了。对于复制正常以后,我们还需要使用数据效验,用校验数据的完整性,以及pt-table-sync同步数据。

以下是报错时的截图:

b6acfbb1abccc7f752133ad20a98c191.png

错误分析:当发生这样的错误时,可以在master库上的xxxx库下对应的表,用desc查看一个表结构,找出主键对应的列名,然后把对应的记录找出来

master的记录是:

mysql> select * from xxxx.xxxx where id=120383;+——–+———-+———-+————+————-+———-+————+———————+——+——+——+——+——+——+

| id | log_type | log_user | log_server | log_channel | log_data | log_result | log_time | f1 | f2 | f3 | f4 | f5 | f6 |

+——–+———-+———-+————+————-+———-+————+———————+——+——+——+——+——+——+

| 120383 | 8 | 0 | 411 | 2 | 0 | 0 | 2015-01-10 03:34:00 | | | | | | |

+——–+———-+———-+————+————-+———-+————+———————+——+——+——+——+——+——+

1 row in set (0.00sec)

mysql>

slave库上的记录是:

mysql> select * from xxxx.xxxx where id=120383;+——–+———-+———-+————+————-+———-+————+———————+——+——+——+——+——+——+

| id | log_type | log_user | log_server | log_channel | log_data | log_result | log_time | f1 | f2 | f3 | f4 | f5 | f6 |

+——–+———-+———-+————+————-+———-+————+———————+——+——+——+——+——+——+

| 120383 | 8 | 0 | 411 | 2 | 0 | 1 | 2015-01-10 03:34:00 | | | | | | |

+——–+———-+———-+————+————-+———-+————+———————+——+——+——+——+——+——+

1 row in set (0.00sec)

mysql>

可以看到slave的记录与主库不一样,当然以主库的记录为准啦,所以要在slave库上把主键冲突的记录删除掉,如果一两条,手动删除倒没什么问题,但比较多的时候,手动删除的效率是灰常慢的,下面写了个小脚本:

#!/bin/bash

#Delete duplicate records primary key conflict

#Write by xuanzhi2015-01-12mysql=/usr/local/mysql-5.1.66-3310/bin/mysql

sock=/data/mysql-slave-3310/mysql.sockpasswd=123456

while true

doSQL_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’ | grepHA_ERR_FOUND_DUPP_KEYif [ $? -eq 1]then

if [ “$SQL_THREAD” == No ] && [ “$LAST_ERROR” == 1062]thenFILED=`$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 ========================”breakfi

fi

done

如果slave是完全跟上master了,运行该脚本,会循环删除,但如果从库还没跟上主库,当slave读取中继日志,还有主键冲突,又会出现主从中断的,这时可能要结合任务计划crontal来执行删除操作了(该脚本还有可以优化和完善的地方,如果有更好的想法,请分享下)。

参考资料:http://www.cnblogs.com/gomysql/p/3734087.html

作者:陆炫志

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179231.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月30日 上午9:36
下一篇 2022年8月30日 上午9:36


相关推荐

  • Java高级面试题!69个经典Java面试题和答案详解

    Java高级面试题!69个经典Java面试题和答案详解拼多多一面首先自我介绍参加过哪些项目并发编程三要素?实现可见性的方法有哪些?多线程的价值?创建线程的三种方式的对比?画出线程的状态流转图常用的并发工具类有哪些?CyclicBarrier和CountDownLatch的区别CAS的问题:1、CAS容易造成ABA问题2、不能保证代码块的原子性3、CAS造成CPU利用率增加ReadWriteLock是什么一面面试题答案:拼多多二面自我介绍什么是工厂模式?如何实现单链表的增删操作?让我说意思JVM的分为哪几块

    2022年8月21日
    7
  • Pyhton Cookbook 学习笔记 ch9_02 元编程[通俗易懂]

    Pyhton Cookbook 学习笔记 ch9_02 元编程[通俗易懂]【传送门】9.8将装饰器定义为类的一部分问题:想在类中定义装饰器,并作用在其他的函数上方案:在类中定义装饰器首先要确定它的使用方法,是作为一个实例方法还是作为一个类方法fromfunctoolsimportwrapsclassA:#作为一个实例方法defdecorator1(self,func):@wraps(func)…

    2022年6月3日
    35
  • qmake:配置qmake

    qmake:配置qmake一、属性qmake有一个持久化配置系统,它允许在qmake中设置一次属性,并在每次调用qmake时查询它。可以在qmake中设置一个属性:qmake-setPROPERTYVALUE您可以从qmake检索此信息,如下所示:qmake-queryPROPERTYqmake-query//列出内置属性以下是内置属性:QMAKE_SPEC:在主机构建期间解析并存储在QMAKESPEC变量中的主机mkspec的短名称

    2022年5月19日
    68
  • Nano Banana 的22个酷炫用法

    Nano Banana 的22个酷炫用法

    2026年3月13日
    3
  • java依赖jar包的方式_java打包命令

    java依赖jar包的方式_java打包命令大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的mainclass作为你这个jar包的程序入口。具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件。比如有个叫做test.jar的jar包,里面有一个拥有main函数的mainclass:test.someClassName。我们就只要在MANIFEST.MF里面添加如下一句话:…

    2026年4月15日
    4
  • java中含中文字符串的编码和解码问题。

    java中含中文字符串的编码和解码问题。1、在Java开发中经常被文字乱码的问题困扰。下面全面解释下字符串的编码和解码。如Stringstr=”中国”编码:byte[]bts=str.getBytes(“编码方式”);//常用编码方式gbk、utf-8、gb2312、iso-8859-1等等。解码:Stringb=newString(bts,”解码方式”);//解码方式对应常用编码方式。2

    2022年7月8日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号