24 | MySQL是怎么保证主备一致的?
该思维导图由 AI 生成,仅供参考
MySQL 主备的基本原理
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了MySQL主备同步的基本原理和技术细节,重点围绕binlog内容、备库执行binlog与主库保持一致的原理展开。详细解释了主备切换流程、节点间的同步更新流程以及binlog的三种格式的特点和应用场景。此外,还讨论了mixed格式的binlog存在的场景和优势,以及循环复制问题的解决方案。通过本文,读者可以深入了解MySQL主备同步的基本原理和技术细节,以及在业务开发中应用这些设计思想的重要性。文章内容涵盖了MySQL高可用方案的基础知识,对读者进行了全面的技术指导,为后续的系统开发提供了重要背景知识。
《MySQL 实战 45 讲》,新⼈⾸单¥68
全部留言(122)
- 最新
- 精选
- geraltlaush置顶老师,我想问下双M架构下,主从复制,是不是一方判断自己的数据比对方少就从对方复制,判断依据是什么
作者回复: 好问题。 一开始创建主备关系的时候, 是由备库指定的。 比如基于位点的主备关系,备库说“我要从binlog文件A的位置P”开始同步, 主库就从这个指定的位置开始往后发。 而主备复制关系搭建完成以后,是主库来决定“要发数据给备库”的。 所以主库有生成新的日志,就会发给备库。
2019-01-2512128 - Sinyo置顶主库 A 从本地读取 binlog,发给从库 B; 老师,请问这里的本地是指文件系统的 page cache还是disk呢?
作者回复: 好问题, 是这样的,对于A的线程来说,就是“读文件”, 1. 如果这个文件现在还在 page cache中,那就最好了,直接读走; 2. 如果不在page cache里,就只好去磁盘读 这个行为是文件系统控制的,MySQL只是执行“读文件”这个操作
2019-01-214184 - Joker老师您好,读到您关于binlog的文章之后,我有个疑问。 我之前理解是,mysql 每执行一条事务所产生的binlog准备写到 binlog file时,都会先判断当前文件写入这条binlog之后是否会超过设置的max_binlog_size值。 如果超过,则rotate 自动生成下个binlog flie 来记录这条binlog信息。 那如果 事务所有产生的binlog 大于 max_binlog_size 值呢? 那不是永久地rotate吗? mysql是如何处理的? 谢谢。
作者回复: 好问题 一个事务的binlog日志不会被拆到两个binlog文件,所以会等到这个事务的日志写完再rotate,所以你会看见超过配置大小上限的binlog 文件
2019-03-063124 - 观弈道人老师你好,问个备份问题,假如周日23点做了备份,周二20点需要恢复数据,那么在用binlog恢复时,如何恰好定位到周日23点的binlog,谢谢。
作者回复: Mysqlbinlog有个参数—stop-datetime
2019-01-07279 - 妥妥老师,我想问下,如果一张表并没有主键,插入的一条数据和这张表原有的一条数据所有字段都是一样的,然后对插入的这条数据做恢复,会不会把原有的那条数据删除?不知道在没有主键的情况下binlog会不会也记录数据库为其生成的主键id
作者回复: 好问题, 会删除一条,但确实可能删除到之前的那条。 主要就是因为,没有主键的时候,binlog里面就不会记录主键字段。
2019-02-281062 - HuaMax课后题。如果在同步的过程中修改了server id,那用原server id 生成的log被两个M认为都不是自己的而被循环执行,不知这种情况会不会发生
作者回复: 是的,会
2019-01-07858 - 一大只😴死循环第二种情况: 双主,log_slave_updates=on,binlog_format=statement 配置文件里写成statement格式,然后两个master都重启 (从row格式改成statement试了几次没有成功,因为binlog中记录格式还是row) 测试: 表t (id ,c,d) 主键id,有一条数据(1,2,1); M1执行 stop slave; update t set c=c+1 ;或 update t set c=c+1 where id=1; set global server_id=new_server_id; start slave; 然后就能看到c的值在不断变大,想停止就把server_id改回原来的就可以了。
作者回复: 赞
2019-01-07346 - hua168大神,我前些天去面试,面试官问了一题: mysql做主从,一段时间后发现从库在高峰期会发生一两条条数据丢失(不记得是查询行空白还是查询不到了),主从正常,怎么判断? 1.我问他是不是所以从库都是一样,他说不一样 2.我说低峰期重做新的从库观察,查看日志有没有报错?他好像不满意这个答案。 二、他还问主库挂了怎么办? 1. mysql主从+keepalived/heartbeat 有脑裂,还是有前面丢数据问题 2. 用MMM或HMA之类 3.用ZK之类 三、写的压力大怎么办? 我回答,分库,分表 感觉整天他都不怎么满意,果然没让我复试了,我郁闷呀,我就面试运维的,问数据这么详细。😂 大神,能说下我哪里有问题吗?现在我都想不明白😂
作者回复: 运维现在要求也挺高的 第一个问题其实我也没看懂,“高峰期丢数据”是指主备延迟查不到数据,还是真的丢了,得先问清楚下 不过你回答的第二点不太好,低峰期重做这个大家都知道要这么做,而且只是修复动作,没办法用来定位原因,面试官是要问你分析问题的方法(方向错误) 重搭从库错误日志里面什么都没有的(这个比较可惜,暴露了对字节不够了解,一般不了解的方法在面试的时候是不如不说的) 第二个问题三点都是你回答的吗?那还算回答得可以的,但是不能只讲名词,要找个你熟悉细节的方案展开一下 三方向也是对的 我估计就是第一个问题减分比较厉害
2019-01-08743 - 三木禾老师,双M可能会造成数据不一致的情况么? 比如,A B同时更新同一条数据?
作者回复: 一般说双M是只AB之间设置为互为主备,不过任何时刻只有一个节点在接受更新的
2019-03-31441 - 汪炜老师,问个问题,希望能被回答: mmysql不是双一设置的时候,破坏了二阶段提交,事务已提交,redo没有及时刷盘,binlog刷盘了,这种情况,mysql是怎么恢复的,这个事务到底算不算提交?
作者回复: 如果”redo没有及时刷盘,binlog刷盘了”之后瞬间数据库所在主机掉电, 主机重启,MySQL重启以后,这个事务会丢失;这里确实会引起日志和数据不一致, 这个就是我们说要默认设置为双1的原因之一哈
2019-01-23738