聊透MySQL日志系统!彻底理解redolog、binlog、undolog区别与作用

日志系统在数据库管理中起着关键作用。
它记录数据库运行过程中的各种状态信息。
日志的主要类型包括错误日志、查询日志、慢查询日志、事务日志、二进制日志等。
在这些日志中,作为开发人员需要关注的主要是二进制日志(binlog)和事务日志(包括重做日志和撤消日志)。
接下来,我们将详细讨论这三种协议的区别和特点。
二进制日志(binlog)主要用于记录数据库写入操作,以二进制形式存储在磁盘上。
Binlog是MySQL服务器层记录的逻辑日志,适用于任何使用任何存储引擎的MySQL数据库。
Binlog以追加方式写入,每个binlog文件的大小可以通过“max_binlog_size”参数设置。
当文件大小达到预设值时,会生成一个新文件来保存日志。
在实际应用中,Binlog的主要使用场景包括主从复制和数据恢复。
通过Binlog,可以实现数据库之间的同步和数据备份,保证主服务器出现故障时可以从备份服务器恢复数据。
binlog的删除时间由“sync_binlog”参数控制,其值范围在0到N之间。
将其设置为1是最安全的选择,也是MySQL5.7.7中的默认值。
相应地增大该值可以在一定程度上提高数据库性能,但会牺牲一定程度的一致性。
Binlog日志格式主要有3种:STATMENT、ROW和MIXED。
MySQL5.7.7之前默认格式是STATMENT,后来默认格式改为ROW。
日志格式通过“binlog_format”参数指定。
Redolog是InnoDB存储引擎层的协议,用于保证事务的持久性和一致性。
它只记录事务对数据页所做的更改,而不会将整个数据页写入磁盘,解决了性能问题。
Redolog包括内存中的日志缓冲区和磁盘上的日志文件。
Redolog的flush时机可以通过innodb_flush_log_at_trx_commit参数进行配置,以达到性能和一致性之间的平衡。
Redolog记录格式采用固定大小的循环写入方式。
写到最后又回到开头循环写入日志。
Redolog记录数据页的物理变化,使得恢复操作更快。
innodb启动时,会检查磁盘上数据页的LSN(逻辑序列号),并从检查点开始恢复。
当writepos赶上检查点时,检查点向前移动以记录新日志。
Undolog主要记录数据的逻辑变化,是实现事务原子性的关键。
Undolog记录了数据更新前后的状态,这样如果发生错误,可以重置到事务前的正确状态。
同时Undolog也是MVCC实现的基础,支持多版本并发控制。
综上所述,Binlog和Redolog缺一不可日志系统位于数据库中,各自扮演着不同的角色。
Binlog用于记录操作的详细信息,支持数据复制和恢复,而Redolog用于保证事务的一致性和持久性。
两者协同工作,确保数据库在发生故障时可以从备份数据中恢复,避免数据丢失。