MySQL日志
所有DML操作(INSERT/UPDATE/DELETE)都先在Buffer Pool中完成
redo log
- 实现事务的持久性。redo log先刷盘,脏页再刷盘
物理存储特性
文件结构
- 由固定大小的文件组成(如
ib_logfile0
,ib_logfile1
) - 循环写入(ring buffer)设计
- 物理写入总是追加到文件末尾
- 由固定大小的文件组成(如
写入模式
|
|
Write-Ahead Logging (WAL):
- 在Buffer Pool中更新数据页,该数据页成为脏页。
- 将数据页的物理变更(如“页号 X,偏移 Y 写入数据 Z”)顺序写入 redo log buffer。
- 当执行 COMMIT 时,根据配置参数 innodb_flush_log_at_trx_commit 决定行为(通常默认值为 1)
参数值 | 行为 | 持久性保证 |
---|---|---|
1 (默认) | 1. 写 PageCache 2. 立即 fsync() 刷盘 | 完全持久 |
0 | 每秒批量写入+刷盘 | 可能丢失1秒数据 |
2 | 写 PageCache 但延迟刷盘 | 仅保证OS不崩溃 |
- 异步脏页刷盘, 后台线程把BufferPool中的数据刷新到硬盘上
undo log
- 实现事务回滚,保证事物的原子性
- 结合 ReadView实现 MVCC,为record保留版本链
Binlog
基本概念
Binlog (Binary Log) 是MySQL Server层实现的二进制日志,记录所有修改数据的SQL语句(逻辑日志),事务提交的时候写入。
核心特性
记录内容:
- 所有DDL(CREATE/ALTER等)和DML(INSERT/UPDATE等)语句
- 以事件形式存储,包含执行耗时、错误码等元信息
与Redo Log对比:
Binlog Redo Log 层级 Server层 InnoDB引擎层 类型 逻辑日志(SQL语句) 物理日志(页修改) 用途 主从复制/数据恢复 崩溃恢复 三种格式:
- STATEMENT:记录原始SQL(可能主从不一致,如果从库执行这些语句的环境和主库稍有不同,可能会导致数据不一致
- ROW:记录行数据变化(默认推荐)
- MIXED:混合模式
主从复制
server-id 是 MySQL 实例的唯一标识,主从库都得有且不能重复,用来区分不同节点。
主库开启一个线程来处理 binlog 分发,叫 Binlog Dump 线程。
从库这边有两个关键线程,一个是 I/O 线程,负责跟主库建立连接,请求主库 binlog,然后写到自己的中继日志里;另一个是 SQL 线程,从 I/O 线程写的中继日志里读取内容,在从库执行 SQL 语句来更新数据。
主库参数
log-bin 开启二进制日志,binlog-format 设置日志格式
从库参数
- Master_Host是主库的ip
- Master_User是用户
- Master_Port是端口
- Master_Log_File是主库binlog文件名