MySQL复制 -- 复制出错怎么办?
假如我们生产环境复制出错?该怎么办呢?
下面提供几种办法:
1. 手工处理,补回不一致数据(可以利用主库来补数据、也可以利用binlog来补数据)
2.用开源工具来解决一致性问题
3.自己造轮子,解决一致性问题
至于如何通过手工方式来修复不一致数据,我就不一一说了,大概就是缺啥补撒把,要是大量的不一致,那么手工来搞必然会累的半死,而且也不科学,本文主要介绍一下三方工具pt-table-sync
Pt-table-sync 原理:
1.在主库上分析表结构,把说有字段转换成varchar类型
2.根据表上的索引,把表数据分成一个个的chunck
3.对于每个chunck,把字段利用 concat_ws() 函数链接到一起,然后对这个值计算 MD5值,存到统计表(test库下边)
4.由于复制关系,这个统计数据会被复制到从库,并且同样的语句也会被执行一遍
5.到此基本的条件都具备了, 那么就开始执行对比了,具体对比过程是这样的:对于每个chunck会有个 主库的MD5值和备考的MD5值,for 每个chunck,if MD5值相等,则跳过;else 深入chunck ,逐行检查每行数据;
问题来了
1.那么由于时主从关系,复制必然有延迟的情况,如何保证在检查md5时 主从数据是一致的呢,或者说是相同数量的行呢?
这个就的深入到 pt-table-sync 在计算chunck MD5值的时候是如何计算的了:
主库上:对每一个chunk,在校验时加上for update锁。一旦获得锁,就记录下当前主库的show master status值。
从库上:执行select master_pos_wait()函数,等待从库sql线程执行到show master status得到的位置。以此保证,主从上关于这个chunk的内容均不再改变。
2.主备不一致时候,是怎么修复的呢?
对于主库有但是备库不存在的数据(或者主备不一致):那么备库会跳过,在主库上执行replace into 操作,通过binlog复制的方式在备库进行重新应用。
对于备库有, 但主库不存在的数据:那么依然是在主库执行 delete 操作(主库本来就不存在数据, 所以这个语句对于主库来说是安全的)
关于这个的思考:
1.这是一种盲目的复制同步检查机制,同样的数据会在主库和备考计算,给主库备库都带来了额外的负担,同时由于复制关系,这个数据会被copy到从库,给网络带来了压力,给备库也带来了压力(一个是在应用主库传过来的数据的时候,另一个是在计算md5值时)
2.由于我们的 replace into机制,那么就必须要求这个表上存在 主键或者唯一健
3.由于在检查 chunck 的时候采用 select for update 那么必然会加 X锁,如果备库延迟太大,则应用的性能会有所下降
那么我们有没有一种不盲目的方式呢?其实我们可以自己实现的,具体如何实现,我将在稍后讲到
MySQL复制 -- 复制出错怎么办?的更多相关文章
- 与MySQL传统复制相比,GTID有哪些独特的复制姿势?
与MySQL传统复制相比,GTID有哪些独特的复制姿势? http://mp.weixin.qq.com/s/IF1Pld-wGW0q2NiBjMXwfg 陈华军,苏宁云商IT总部资深技术经理,从事数 ...
- InnoSQL/MySQL并行复制的实现与配置
InnoSQL/MySQL并行复制的实现与配置 http://www.innomysql.net/article/6276.html 并行复制之前的解决方案 InnoSQL在5.5.30-v4版本中支 ...
- 将win平台上的mysql数据复制到linux上报错Can't write; duplicate key in table
将win平台上的mysql数据复制到linux上报错Can't write; duplicate key in table xxx 新年新气象,果然在新年的第一天就遇到了一个大坑,项目在win上跑的没 ...
- 使用MySQL自身复制来恢复binlog
如果需要恢复的二进制日志较多,较复杂,强烈建议使用MySQL自身复制来恢复binlog,而不要使用mysqlbinlog. 目录 [hide] 1. 如何操作 1.1 将binlog作为relay l ...
- 最全mysql的复制和读写分离
mysql的复制和mysql的读写分离从来就不是一个简单的话题,今天笔者就详细来记录一下我学习的mysql. mysql日至类型有:二进制日志,事务日志,错误日志,一般查询日志,中继日志,慢查询日 ...
- (5.4)mysql高可用系列——MySQL异步复制(实践)
关键词:mysql复制,mysql异步复制,mysql传统异步复制 [1]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数 ...
- Database基础(五):使用binlog日志、XtraBackup备份工具、MySQL AB复制
一.使用binlog日志 目标: 利用binlog恢复库表,要求如下: 启用binlog日志 创建db1库tb1表,插入3条记录 删除tb1表中刚插入的3条记录 使用mysqlbinlog恢复删除的3 ...
- MySQL HA方案之MySQL半复制+MHA+Keepalived+Atlas+LVS[转]
MySQL HA方案之MySQL半复制+MHA+Keepalived+Atlas+LVS 简介 目前Mysql高可用的方案有好多,比如MMM,heartbeat+drbd,Cluster等,还有per ...
- mysql数据库‘复制’的办法
mysql数据库‘复制’的办法 2006-01-17 10:36:00 标签:Mysql SQL 数据库 休闲 职场 >mysqldump wap -u root -ppassword --ad ...
- 浅谈MySQL Replication(复制)基本原理
1.MySQL Replication复制进程MySQL的复制(replication)是一个异步的复制,从一个MySQL instace(称之为Master)复制到另一个MySQL instance ...
随机推荐
- 为什么Python类成员的调用和声明必须有"this"?
Python的这种设计是作者从Modula-3中借鉴来的,在后面使用的情况看来,这个设计也是比较成功的.我们对比Python和C++讨论一下这个问题: Modula-3是上世纪80年代末数字设备公司( ...
- 更改VS Code界面为简体中文
.先看一下效果(请忽略我的颜色主题): 1. 点击侧边栏的“扩展”按钮,或者按下Ctrl+Shift+X,安装需要的语言包 2. 通过命令面板设置语言 点击“查看”——“命令面板”,或者快捷键Ctr ...
- 在使用Reference Source调试.Net 源代码时如何取消optimizations(代码优化)-翻译
在使用PDB调试XAF时,发现好多变量都看不到.都被优化掉了. 下面的方法可以解决. 当你在使用Reference Source functionality in VS 2008 调试.Net 的源代 ...
- SpringBoot日记——登录与拦截器篇
之前的文章我们把登录页写了出来,但是想要让登录现实他的基本功能,要如何做呢?本篇文章就来帮你实现第一步,让登录页对账号密码做校验,并且完成登录跳转. LoginController 1. 要实现登录, ...
- FFmpeg+vs2013开发环境配置(windows)
1.下载ffmpeg包(dll.include.lib) https://ffmpeg.zeranoe.com/builds/ 有3个版本:Static.Shared和Dev St ...
- 通过python将xml文件转换成html文件
#数据类型的转换 def main(): maxwidth = 100 #用于规范字段的长度 print_start() count=0 while True: ...
- Iron Speed Designer设计工具开发总结
9.0版本: 1.1 ISP和VS不要同时生成,代码写在override方法之下,不然生成之后会覆盖;正常情况下,ISP可以写代码,只不过没有快捷提示,一般我们先注释一下字段(如://sdsfdsfd ...
- 【Skynet】Traceback汇总
error: ./skynet/lualib/skynet.lua:534: ./skynet/lualib/skynet.lua:156: ./logic/gate/socket_msg.lua:5 ...
- 2015第六届蓝桥杯C/C++ B组
奖券数目:枚举 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其 ...
- 剑指 Offer——连续子数组的最大和
1. 题目 2. 解答 初始化 sum=0,然后遍历数组进行累加.如果 sum 变为负数,也就说再继续累加的话贡献为负,我们需要更新 sum=0,重新开始累加. 初始化 max_sum 为数组的第一个 ...