在 MySQL 中,binlog(Binary Log,二进制日志) 是一个非常重要的日志文件,主要用于记录数据库执行的 写操作 (比如 INSERT
、UPDATE
、DELETE
等)以及一些数据结构的变化操作(如 CREATE TABLE
、ALTER TABLE
等)。它不会记录 读操作 (如 SELECT
)。简单来说,binlog 就是用来追踪和记录数据库的变更历史。
binlog 的主要功能
1. 数据恢复
-
作用:在数据库出现故障时,可以通过 binlog 恢复数据。
-
机制:
- 首先,从备份中恢复到最近的状态(如通过 mysqldump 或其他方式创建的全量备份)。
- 然后使用 binlog 重放最近的变更操作,将数据库恢复到崩溃前的最新状态。
-
比喻:binlog 就像快递的追踪记录,告诉你这段时间所有包裹是怎么运送的。即使中途快递丢失了,你可以根据追踪记录找到问题点并重发包裹。
2. 主从复制(Replication)
-
作用:binlog 是实现 MySQL 主从复制的核心工具。
-
机制:
- 在主库中,binlog 会记录所有的写操作。
- 从库会通过读取主库的 binlog,重放日志中的操作,保持主从数据一致。
-
比喻:主库是老师在黑板上写的笔记(binlog),从库就是学生抄笔记,确保和老师的内容完全一致。
3. 审计操作
- 作用:通过解析 binlog,可以追踪是谁在什么时候对哪些数据做了什么操作。
- 比喻:binlog 就像一份操作日志,记录了你过去的一切"修改"操作,是数据操作的历史档案。
4. 增量备份
-
作用:binlog 支持增量备份功能。
-
机制:
- 全量备份用于保存某个时间点的完整数据。
- binlog 用于记录之后的数据变更,从而实现增量备份。
-
比喻:全量备份就像存一份文件的副本,而 binlog 就像这份文件的修改历史。通过全量备份 + binlog,就能完全恢复文件的所有版本。
binlog 的日志格式
MySQL 支持三种 binlog 格式:
-
STATEMENT(基于语句的日志)
- 记录执行的 SQL 语句。
- 优点:日志体积小。
- 缺点 :某些情况下无法精确重放,比如使用
NOW()
或非确定性函数时。
-
ROW(基于行的日志)
- 记录每一行数据的具体变化。
- 优点:精确记录了每行数据的变化,无需担心语句无法重现。
- 缺点:日志体积较大。
-
MIXED(混合模式日志)
- 结合了 STATEMENT 和 ROW 的优点。
- MySQL 会根据操作场景自动选择适合的格式。
binlog 和其他日志的区别
日志类型 | 功能 | 记录内容 | 是否持久化 |
---|---|---|---|
binlog | 数据恢复、主从复制 | 数据的写操作和结构变化 | 是 |
redo log | 崩溃恢复 | 事务提交前后的数据变化 | 是 |
undo log | 事务回滚 | 数据修改前的原始值 | 是 |
error log | 记录 MySQL 的错误和警告信息 | 错误信息 | 是 |
slow log | 慢查询分析 | 执行时间过长的查询 | 否(可配置) |
总结
binlog 的作用:
- 支持主从复制,确保多台服务器之间的数据一致性。
- 支持数据恢复,帮助从故障中还原数据。
- 支持增量备份,提高备份效率。
- 提供审计功能,记录数据库的所有修改历史。
简单来说,binlog 是 MySQL 的"黑匣子",记录了所有重要的数据变更操作,确保数据安全与一致性。