MySQL- 日志
Write-Ahead Logging(WAL)日志先行
执行一个操作的时候先将操作写入日志再写入数据磁盘。
写日志是顺序I/O,效率更高,写磁盘(刷盘)是随机IO,可以延迟刷盘时机,提供吞吐量。
redo log
重写日志,用来进行崩溃修复。数据库的更新操作是先写内存再写磁盘,redo log 就是为了修复那些写了内存但是没写磁盘的事务。
redo log 如何刷盘?
InnoDB的redo log是固定大小的,循环写入,会覆盖前面的部分。类似一个循环队列。
通过checkpoint实现。当前写入位置write pos 与 要覆盖的记录check point重叠时,redo log 已经写满需要强制把数据写入磁盘。
默认redo log有两个文件,每个大小48MB。
bin log 二进制日志
redo log 是InnoDB特有的日志,而binlog 是Server层的日志。
增删改的记录日志。查询不会记录。
主要用处:
- 主从复制: Master端开启bin log ,然后把bin log 发送给Slave端,slave端重放bin log从而达到主从数据一致
- 数据恢复: 通过使用mysqlbinlog工具恢复。
刷盘时机
通过sync_binlog参数控制biglog的刷屏时机,取值范围是0-N
0:不强制要求,由系统判断
1:commit后写入
N:每N个事务后写入
binlog格式
- statement:每一条修改数据的sql会记录。节约了日志量,提升了性能,但可能导致主从数据不一致。
- row:记录哪条数据被修改,会产生大量日志,尤其是alter table
- mixed 混合方式
5.7之后默认row
bin log 和redo log 的区别
- redo log 是InnoDb独有,bin log 是Server层实现的不能进行崩溃恢复
- redo log 是物理日志,记录某个数据页做了什么修改,bin log是逻辑日志记录的是语句逻辑,比如id=2的数据c字段加一
- redo log 大小固定循环写,bin log 是追加写, 文件写到一定大小切换下一个。
undo log
回滚日志,用于事务回滚和MVCC。InnoDb存储引擎实现。
undo log记录着RowId,事务Id,回滚指针 和数据
每更新数据之前会生成一条undo log,事务提交后不会立即删除,因为可能需要回滚。
undo log 的删除是通过后台purge线程进行处理的。
两阶段提交
分布式事务的设计思想,首先请求各个服务器,等各个服务器做好准备后再发出指令,所有服务器一起提交。
两阶段提交就是为了bin log 和redo log 逻辑上一致。
宕机后的数据恢复规则
- 对于redo log 中已提交的事务直接提交重复执行。
- 如果是未提交的,则判断bin log 中对应事务是否存在且完整,如果是则提交事务,否则回滚。
error log
错误日志记录错误信息
查询日志、慢查询日志
查询日志记录数据的所有命令,不管是否正确,默认不开启。
慢查询日志记录的是响应时间查过阈值(默认10秒)的SQL语句。默认页不开启。