bin log、redo log、undo log有什么区别?(完结)
选中新版正文中的对应文字,然后点“定位到这里”。
球友们好,本来打算自己写一篇 MySQL 的 bin log、redo log、undo log 的,结果看到一篇读者的文章,写得已经非常好了,这里就直接先分享给大家吧。后面写MySQL 专栏的时候再自己重写一版。
日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息。 MySQL 日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发,我们重点需要关注的是二进制日志( binlog )和事务日志(包括 redo log 和 undo log )。
bin log(二进制日志)
什么是bin log?
记录数据库执行的写入性操作信息,以二进制的形式保存在磁盘中。
由服务层产生,所有储存引擎都支持。
bin log属于逻辑日志。
bin log日志有三种格式:STATMENT、ROW、MIXED。MySQL5.7.7之后默认是ROW。
简单普及一下逻辑日志和物理日志:
- 逻辑日志:记录的sql语句。
- 物理日志:记录的数据页变更。
bin log的使用场景?
- 主从复制:在
master端开启bin log,然后master将bin log发送到每个slave端,slave端重放bin log从而达到主从数据一致。
简单画个图来理解一下MySQL的主从复制流程:

- master在准备提交事务之前,将变更记录到bin log中。
- slave启动一个IO线程来读取bin log中的事件,并记录到自己的ready log(中继日志)中。
- 同时slave还会启动一个SQL线程,读取ready log中的事件在备库中执行,从而实现备库的数据更新。
- 数据恢复:通过使用
mysqlbinlog工具来恢复数据。 - 增量备份
如何开启bin log?
# 查看是否开启bin log,这里可以看到没有开启
mysql> show variables like '%log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | OFF |
| log_bin_basename | |
| log_bin_index | |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-------+
6 rows in set (0.05 sec)
# 查看当前MySQL版本
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.36 |
+-----------+
1 row in set (0.20 sec)
# 确认已开启bin log
mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/binlog |
| log_bin_index | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-----------------------------+
6 rows in set (0.03 sec)
如果没有开启,编辑/etc/my.cnf文件,添加以下配置:
# 开启bin log日志
log-bin=binlog
# 配置server-id
server-id=1
如何查看以及修改每个bin log文件大小最大值?
查看本机的bin log文件大小最大值,可以看到是1073741824字节,也就是1G。
mysql> show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name | Value |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.00 sec)
添加或修改MySQL的my.cnf文件:
max_binlog_size=2G
如何使用bin log恢复数据?
查看 bin log:
# 查看当前bin log位置
mysql> show master status;
# 也可以刷新日志,方便后面筛选
mysql> flush logs;
# 查看二进制日志列表
mysql> show binary logs;
bin log恢复数据:
# 根据事件位置恢复(--start-position是开始位置,--stop-position是结束位置)
mysqlbinlog --start-position=16275 --stop-position=16566 --database=just-test /var/lib/mysql/binlog.000004 | mysql -uroot -p123456
# 根据指定时间恢复(--start-datetime是开始时间,--stop-datetime是结束时间)
mysqlbinlog --start-datetime="2022-02-17 12:00:00" --stop-datetime="2022-02-17 18:00:00" --d...未能定位到原文的划线
已加入星球,可直接知识星球授权登录
二哥编程星球目前包含:
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
1. 微信扫右侧的优惠券加入知识星球
2. 解锁星球的实战项目教程和源码: 项目源码+教程获取
真诚点赞 诚不我欺
回复