返回顶部
首页 > 资讯 > 数据库 >MYSQL中如何实现binlog优化
  • 568
分享到

MYSQL中如何实现binlog优化

2024-04-02 19:04:59 568人浏览 安东尼
摘要

这篇文章主要讲解了Mysql中如何实现binlog优化,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。问题问题1:如何解决事务提交时flush redo log带来的性能损失WA

这篇文章主要讲解了Mysql中如何实现binlog优化,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

问题

问题1:如何解决事务提交时flush redo log带来的性能损失

WAL是实现事务持久性(D)的一个常用技术,基本原理是将事务的修改记录redo log。redo log顺序追加写入。事务提交时,只需要保证事务的redo log落盘即可,通过redo log的顺序写代替页面的随机写提升数据库系统的性能。但是,该方案必须要求每个事务提交时都将其生成的redo log进行一次刷盘,效率不高。

问题2:binlog和引擎层事务提交的顺序问题

对于单个事务而言,日志写入顺序是先redo log再binlog,只要维持该顺序即可维持正确性。但对于一个高并发数据库系统而言,每时每刻可能都会存在众多并发执行的事务。我们还需要通过一定的手段来维护Server层binlog和引擎层事务提交的顺序一致性。

维护这种顺序一致性其实是为了保证备份工具Xtrabackup的正确性。

当 binlog 作为协调者,如果其中记录的事务顺序和存储引擎层记录的顺序不一样的话,备份工具(Innodb Hot Backup)拿到备份集的位点可能会存在空洞。因为备份工具会拷贝 redo 日志,在 redo 的头部会记录最后一个提交的事务对应的 binlog 位点,备份集建立之后就会根据这个位点继续从主库 dump binlog。

假如有三个事务 T1,T2,T3 已经 fsync 到 binlog 文件中,三个事务的在文件中的位点分别是 100,200,300,但是在引擎层的只有 T1 和 T3 完成了 commit 并记录到 redo 中,最后一个 commit 的事务 T3 位点是 300。此时通过备份工具拿到的数据就是这样的状态,备份集启动的时候会走崩溃恢复的流程,prepare 事务被回滚(备份集不会备份 binlog 文件,对应上个小节 xid 集合为空),自位点 300 继续从主库同步binlog并apply,导致 T2 在备库就丢失了。

MYSQL中如何实现binlog优化

因此,我们必须设计一种机制来保证Server层的binlog写入顺序和存储引擎层的事务提交顺序保持一致。

问题3:同时写redo和binlog带来的性能下降

问题1中提到每次的事务提交会带来性能问题,而这个问题在引入binlog后会变得更加严重。每个事务提交都会增加一次文件io,且需要刷盘。如果系统并发比较高,那么这些IO将会成为拖慢整体性能的瓶颈。

解决方案

问题1:Redo log组提交技术

redo组提交技术思想很简单:通过将多个事务redo log的刷盘动作合并,减少刷盘次数。Innodb的日志系统里面,每条redo log都有一个LSN(Log Sequence Number)。事务将日志拷贝到redo log buffer时,都会获取当前最大的LSN,且LSN单调递增,因此可以保证不同事务的LSN不会重复。那么假设三个事务Trx1、Trx2、Trx3的日志的最大LSN分别为LSN1、LSN2、LSN3(LSN1 < LSN2 < LSN3),它们同时进行提交,那么如果trx3率先执行提交,它会要求刷盘至LSN3处,这样就顺便将Trx1、Trx2的redo log也刷了,Trx1和Trx2会判断自己的LSN小于当前已落盘的最大LSN,就无需再次刷盘。

问题2:内部XA事务

开启binlog情况下,引入内部XA事务来协调上层和存储引擎层,具体来说,在事务提交时引入两个阶段:

prepare:将redo log刷盘操作以确保data页和undo页的更新已经刷新到磁盘,设置事务状态为PREPARE状态;

commit:1). 写binlog并刷盘,2).调用引擎层事务提交接口。将事务状态设置为COMMIT。

如此两阶段提交主要是要保证数据库崩溃时的正确性。因为一旦binlog落盘了,它就可能被下游节点消费。这种事务必须在重启后被commit而非rollback。而对于binlog未落盘的事务,崩溃恢复时直接回滚。

具体来说,故障恢复时,扫描最后一个binlog文件(在flush阶段,如果binlog大小超过阀值,进行rotate binlog文件,会保证该文件记录的最后一个事务一定被提交),提取其中的xid。重做检查点以后的redo日志,读取事务的undo段信息,搜集处于prepare阶段的事务列表,将事务的xid与binlog中记录的xid对比,若存在,则提交,否则就回滚。

mysql5.6以前,为了保证数据库binlog的写入顺序和InnoDB层的事务提交顺序一致,Mysql数据库内部使用了prepare_commit_mutex

具体来说,在两阶段提交引擎层 prepare 的时候加锁,在引擎层 commit 之后释放锁:

innobase_xa_prepare()
write() and fsync() binary log
innobase_commit()
您可能感兴趣的文档:

--结束END--

本文标题: MYSQL中如何实现binlog优化

本文链接: https://lsjlt.com/news/42076.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MYSQL中如何实现binlog优化
    这篇文章主要讲解了MYSQL中如何实现binlog优化,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。问题问题1:如何解决事务提交时flush redo log带来的性能损失WA...
    99+
    2024-04-02
  • MySQL性能优化如何实现
    这篇文章将为大家详细讲解有关MySQL性能优化如何实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一般来说,要保证数据库的效率,要做好以下四个方面的工作:数据库表设计S...
    99+
    2024-04-02
  • MySQL如何实现分表优化
    这篇文章将为大家详细讲解有关MySQL如何实现分表优化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。   这里的分表逻辑是根据t_group表的user_nam...
    99+
    2024-04-02
  • 如何实现MySQL中优化表的语句?
    《MySQL优化表的语句及具体代码示例》在日常的数据库管理中,优化MySQL表的性能是非常重要的。通过优化表的语句,可以提高查询和更新的速度,减少资源的占用,提高系统的性能。本文将介绍如何通过具体的代码示例来优化MySQL表的性能。优化表结...
    99+
    2023-11-08
    实现 (Implement) MySQL (MySQL) 优化表 (Optimize)
  • MYSQL中binlog优化的一些思考汇总
    问题 问题1:如何解决事务提交时flush redo log带来的性能损失 WAL是实现事务持久性(D)的一个常用技术,基本原理是将事务的修改记录redo log。redo log顺序追加写入。事务提交时,只需要保证...
    99+
    2022-05-30
    mysqlbinlog命令 mysql binlog查看 mysqlbinlog命令详解
  • mysql的性能如何实现优化
    下文给大家带来关于mysql的性能如何实现优化,感兴趣的话就一起来看看这篇文章吧,相信看完mysql的性能如何实现优化对大家多少有点帮助吧。MYSQL性能优化 慢查询分析1)性能瓶颈定位Show 命令&nb...
    99+
    2024-04-02
  • MySql如何使用not in实现优化
    最近项目上用select查询时使用到了not in来排除用不到的主键id一开始使用的sql如下: select   s.SORT_ID,   s.SORT_NAME,   s.SORT_STATUS,...
    99+
    2022-05-18
    MySql not in 优化
  • MySQL中如何设置slave实现读取binlog的位置
    本篇文章给大家主要讲的是关于MySQL中如何设置slave实现读取binlog的位置的内容,感兴趣的话就一起来看看这篇文章吧,相信看完MySQL中如何设置slave实现读取binlog的位置对大家多少有点参...
    99+
    2024-04-02
  • MySQL中table_cache如何优化
    这篇文章主要介绍了MySQL中table_cache如何优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。table_cache 参数设置表...
    99+
    2024-04-02
  • mysql中如何优化innodb
    这篇文章主要介绍了mysql中如何优化innodb,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。innodb_flush_logs_at_t...
    99+
    2024-04-02
  • 如何在PHP中实现SEO优化
    随着互联网的发展,SEO(Search Engine Optimization,搜索引擎优化)已经成为了网站优化的重要一环。如果您想要使您的PHP网站在搜索引擎中获得更高的排名,就需要对SEO的内容有一定的了解了。本文将会介绍如何在PHP中...
    99+
    2023-05-20
    PHP编程 实现 SEO优化
  • 如何实现SQL优化
    这篇文章主要介绍“如何实现SQL优化”,在日常操作中,相信很多人在如何实现SQL优化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何实现SQL优化”的疑惑有所帮助!接下来,...
    99+
    2024-04-02
  • MySql如何查看索引并实现优化
    mysql中支持hash和btree索引。innodb和myisam只支持btree索引,而memory和heap存储引擎可以支持hash和btree索引 我们可以通过下面语句查询当前索引使用情况: show s...
    99+
    2022-05-28
    MySql 索引 优化
  • MySQL数据库如何实现正常优化
    下文主要给大家带来MySQL数据库如何实现正常优化,希望这些内容能够带给大家实际用处,这也是我编辑MySQL数据库如何实现正常优化这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。MySQL数据库优化...
    99+
    2024-04-02
  • 如何实现Mysql数据库性能优化
    这篇文章主要为大家展示了“如何实现Mysql数据库性能优化”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现Mysql数据库性能优化”这篇文章吧。对表进行水...
    99+
    2024-04-02
  • MySQL中如何使用binlog时binlog格式的选择
    这篇文章主要介绍MySQL中如何使用binlog时binlog格式的选择,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、binlog的三种模式1.statement level模式...
    99+
    2024-04-02
  • MySQL中如何优化索引
    MySQL中如何优化索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。文章的脑图如下:索引优化规则1、like语句的前导模糊查询不能使用索...
    99+
    2024-04-02
  • Mysql中如何优化select count
    这篇文章主要介绍了Mysql中如何优化select count,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 1.任何情况下SE...
    99+
    2024-04-02
  • MySQL中binlog日志如何使用
    本篇文章给大家分享的是有关MySQL中binlog日志如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。binlogbinlog用于记录数...
    99+
    2024-04-02
  • 如何理解MySQL中binlog和innodb_flush_log_at_trx_commit
    如何理解MySQL中binlog和innodb_flush_log_at_trx_commit ,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作