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层的日志。
增删改的记录日志。查询不会记录。
主要用处:

  1. 主从复制: Master端开启bin log ,然后把bin log 发送给Slave端,slave端重放bin log从而达到主从数据一致
  2. 数据恢复: 通过使用mysqlbinlog工具恢复。

刷盘时机

通过sync_binlog参数控制biglog的刷屏时机,取值范围是0-N
0:不强制要求,由系统判断
1:commit后写入
N:每N个事务后写入

binlog格式

  1. statement:每一条修改数据的sql会记录。节约了日志量,提升了性能,但可能导致主从数据不一致。
  2. row:记录哪条数据被修改,会产生大量日志,尤其是alter table
  3. mixed 混合方式

5.7之后默认row

bin log 和redo log 的区别

  1. redo log 是InnoDb独有,bin log 是Server层实现的不能进行崩溃恢复
  2. redo log 是物理日志,记录某个数据页做了什么修改,bin log是逻辑日志记录的是语句逻辑,比如id=2的数据c字段加一
  3. redo log 大小固定循环写,bin log 是追加写, 文件写到一定大小切换下一个。

undo log

回滚日志,用于事务回滚和MVCC。InnoDb存储引擎实现。

undo log记录着RowId,事务Id,回滚指针 和数据
每更新数据之前会生成一条undo log,事务提交后不会立即删除,因为可能需要回滚。
undo log 的删除是通过后台purge线程进行处理的。

两阶段提交

分布式事务的设计思想,首先请求各个服务器,等各个服务器做好准备后再发出指令,所有服务器一起提交。

两阶段提交就是为了bin log 和redo log 逻辑上一致。

宕机后的数据恢复规则

  1. 对于redo log 中已提交的事务直接提交重复执行。
  2. 如果是未提交的,则判断bin log 中对应事务是否存在且完整,如果是则提交事务,否则回滚。

error log

错误日志记录错误信息

查询日志、慢查询日志

查询日志记录数据的所有命令,不管是否正确,默认不开启。
慢查询日志记录的是响应时间查过阈值(默认10秒)的SQL语句。默认页不开启。

posted @ 2022-09-11 22:09  店里最会撒谎白玉汤  阅读(25)  评论(0编辑  收藏  举报