MySQL的redo log(重做日志)和binlog(二进制日志)是数据库系统中非常重要的两种日志类型,它们在保证数据一致性、持久性和可恢复性方面发挥了关键作用。本文将深入解析这两种日志的区别,并探讨其各自的应用场景。
Redo log 是 InnoDB 存储引擎特有的日志类型,主要用于实现事务的持久性(Durability)和崩溃恢复(Crash Recovery)。当事务对数据进行修改时,InnoDB 并不会立即将修改的数据写入磁盘,而是先将这些修改记录到 redo log 中。这样可以减少直接写磁盘的次数,从而提高性能。
Binlog 是 MySQL 数据库层面的日志,记录了所有的 DDL 和 DML 操作(不包括 SELECT 和 SHOW 这类只读操作)。它的主要作用是用于主从复制和数据恢复。
特性 | Redo Log | Binlog |
---|---|---|
层级 | 存储引擎层 | 数据库层 |
记录内容 | 物理日志(记录数据页的变化) | 逻辑日志(记录SQL语句或行变化) |
主要用途 | 崩溃恢复 | 主从复制、数据恢复 |
是否支持跨存储引擎 | 否 | 是 |
SHOW VARIABLES LIKE 'binlog_format';
SET GLOBAL binlog_format = 'ROW';
可以通过以下命令查看 redo log 的大小:
mysql> SHOW VARIABLES LIKE 'innodb_log_file_size';
graph TD; A[用户发起事务] --> B[修改数据]; B --> C{是否启用Binlog}; C --是--> D[写入Binlog]; C --否--> E[跳过Binlog]; E --> F[写入Redo Log]; D --> F; F --> G[写入数据缓冲区]; G --> H[事务提交];