binlog 是Server层的日志,所有的存储引擎都可以共用。
binlog 是逻辑日志,记录的是SQL的原始逻辑,比如是“给ID=9这一行的a字段加1”。binlog有两种模式,statement模式记录的是原始的SQL语句;row模式会记录行的内容,记录两条,包括更新前的和更新后的。
redo log是物理日志,记录的是“在某个数据页上做了什么修改”。
binlog是追加写入的,一个文件写到一定大小后会切换到下一个,不会覆盖以前的日志。而redo log是循环写的,空间固定可能会用完。
做update操作时,MySQL会使用两阶段提交来保证数据库的状态和用它的日志恢复出来的库的状态一致。那么什么是两阶段提交呢?
两阶段提交分为三步:
1 存储引擎将修改的数据更新到内存中,然后写入redo log。此时redo log处于prepare状态。
2 执行器生成这个操作的binlog,并把binlog写入磁盘。
3 执行器调用引擎的提交事务接口,引擎把刚写入的redo log改成提交状态(即commit状态),更新完成。
两阶段提交可以保证redo log和binlog逻辑一致。从而可以用binlog“重放”数据库,让数据库恢复到之前的状态。
下面是两个log有关的设置参数。
innodb_flush_log_at_trx_commit设置为1,表示每次事务的redo log都直接持久化到磁盘,这样可以保证MySQL异常重启之后数据不丢失。
sync_binlog这个参数设置为1,表示每次事务的binlog都持久化到磁盘,这样可以保证MySQL异常重启之后binlog不丢失。
两阶段提交时跨系统维持数据逻辑一致性时常用的一个方案,在日常开发中也可以借鉴这个思想使用。
文章转载自码上记录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
3143次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
876次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
521次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
449次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
381次阅读
2025-04-15 14:48:05
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
328次阅读
2025-04-30 17:37:37
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
294次阅读
2025-04-15 15:27:53
SQL优化 - explain查看SQL执行计划(下)
金同学
291次阅读
2025-05-06 14:40:00
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
280次阅读
2025-04-30 12:17:54
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
数据库运维之道
277次阅读
2025-04-28 11:01:25