MySQL 日志系统(WAL)
# redo log - 重做日志
redo log 用于记录数据的改动,数据更新时(insert、delete、update)会先记录到 redo log,然后再更新内存数据,写完 redo log 就可以给客户端返回数据更新完成了。redo log 会在系统空闲或者 redo log 文件写满时,将数据更新到磁盘并在 redo log 中删除对应的记录。整个过程称为 WAL(Write Ahead Logging) 技术。
作用:
- 避免数据写入时的频繁IO操作(整个数据库操作中IO操作是最耗时的)
- 在系统崩溃时恢复数据(将数据刷到磁盘或者回滚数据)- crash-safe
redo log 是 InnoDB 特有的日志文件,属于引擎层。文件大小和数量固定,可以通过my.conf
修改
# redo log 文件路径
innodb_log_group_home_dir
# redo log 文件大小
innodb_log_file_size
# redo log 文件的数量
innodb_log_files_in_group
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- write pos 当前数据写到的位置
- check point 当前数据擦除到的位置
redo log 会记录每次写数据和擦除数据的位置,两个位置之间的空隙就是可以写入数据的空间。
官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-redo-log.html (opens new window)
# binlog - 归档日志
binlog 在 server 层,无论是使用哪个引擎,都会有 binlog,binlog 用于记录数据库的归档数据,通常数据库备份就是备份 binlog,通常用来做数据库恢复,例如数据库崩溃恢复、搭建从库,都可以使用 binlog 来恢复和同步数据。
binlog 有两种格式
- statement: 记录 sql 语句
- row: 记录行内容
# 两阶段提交
数据更新过程
- 从内存(或者)中读取数据页
- 执行数据更新
- 将新数据写入内存
- 写如 redolog ,状态设置为 prepare
- 写如 binlog
- 提交事务,状态设置为 commit
- 数据写入完成
两阶段提交可以保证 MySql 的 crash-safe 能能力,假如 redolog prepare 和 binlog 写入成功时,数据库启动后会继续将 redolog commit;假如redolog prepare 写入成功,binlog 写入失败,数据库启动后会把 redolog 回滚。
Last Updated: 2024/05/12, 15:25:49