暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 归档日志 (binlog)

码上记录 2021-06-21
460

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论