在 MySQL 中,redo log
是 InnoDB 存储引擎用于保证事务持久性(Durability)的关键机制。当执行一条 SQL 插入语句时,redo log
记录的是对数据页的物理修改操作,而不是 SQL 语句本身。
redo log 的作用
redo log
的主要作用是确保事务提交后,即使发生崩溃,数据也不会丢失。它记录了事务对数据页的修改操作,以便在系统崩溃后可以通过重放这些日志来恢复数据。
插入一条 SQL 语句时,redo log 记录的内容
当执行一条 INSERT
语句时,redo log
会记录以下内容:
- 数据页的物理修改:
redo log
记录的是对数据页的物理修改,而不是逻辑操作(如 SQL 语句)。- 例如,插入一条记录时,
redo log
会记录在某个数据页的某个位置写入了哪些数据。
- 事务的标识:
redo log
会记录事务的 ID(Transaction ID),以便在崩溃恢复时能够正确地重放事务。
- 修改的类型:
redo log
会记录操作的类型,例如插入、更新或删除。
- 修改的位置:
redo log
会记录修改发生在哪个数据页(Page)以及页内的偏移量(Offset)。
- 修改的具体数据:
redo log
会记录实际写入的数据内容。
示例
假设执行以下 SQL 语句:
INSERT INTO users (id, name) VALUES (1, 'Alice');
redo log
可能会记录如下信息:
- 事务 ID:
12345
- 修改的数据页:
Page 5
- 修改的偏移量:
Offset 100
- 修改的类型:
INSERT
- 修改的数据:
(1, 'Alice')
redo log 的工作流程
- 写入 redo log buffer:
- 当事务执行修改操作时,首先会将修改记录写入内存中的
redo log buffer
。
- 当事务执行修改操作时,首先会将修改记录写入内存中的
- 刷盘到 redo log 文件:
- 根据配置(如
innodb_flush_log_at_trx_commit
),redo log buffer
中的内容会被刷盘到磁盘上的redo log
文件。 - 默认情况下,事务提交时会将
redo log
刷盘,以确保事务的持久性。
- 根据配置(如
- 崩溃恢复:
- 如果 MySQL 崩溃,重启时会通过
redo log
重放未完成的事务,确保数据的一致性。
- 如果 MySQL 崩溃,重启时会通过
THE END
暂无评论内容