mysql的2个重要日志:物理日志redo log和逻辑日志 binlog。
redo log: 保证crash-safe能力
每次事务的redo log持久化到磁盘:innodb_flush_log_at_trx_commit=1
每次事务的binlog 持久化到磁盘:sync_binlog=1
1、redo log
WAL技术:Write-Ahead Logging,关键点是先写日志,在写磁盘。
crash-safe: 有了redo log,InnoDB就可以保证即时数据库发生异常重启,之前提交的记录都不会丢失。
当需要更新一条语句时,InnoDB引擎会先把记录写到redo log里面,并更新内存。同时,在后续适当的时候,把这个操作记录更新到磁盘里面。
redo log是InnoDB引擎特有的日志,物理日志,记录的是在某个数据页做了什么修改。redo是循环写日志,空间固定会用完。redo log主要节省的是随机写磁盘的IO消耗(转成顺序写)。
2、binlog
binlog是服务层Server层中特有的日志,所有引擎都可以使用,binlog是逻辑日志,记录这个语句的原始逻辑。比如给ID=2这一行的C字段加1。
binlog是可以进行追加写入,写到一定大小后会切换到下一个,并不会覆盖以前的日志。
3、SQL更新语句逻辑
update语句执行流程:mysql> update T set c=c+1 where ID=2;
第一步,执行器先找引擎取ID=2这一行,ID是主键,引擎直接用树搜索找到这一行。如果ID=2,这一行所在的数据页本来就在内存中,直接返回给执行器,否则,需要先从磁盘读入内存,然后再返回。
第二步,执行器拿到引擎给的行数据,执行操作,再调用引擎接口写入这行新数据。
第三步,引擎将这行新数据更新到内存中,同时将这个更新操作记录到redo log里面,redo log处于prepare状态,随后告知,执行器执行完毕,随时可以提交事务。
第四步,执行器生成这个操作的binlog,并把binlog写入磁盘。
第五步,执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交状态,更新完成。
网友评论