大厂基本功 | MySQL 三大日志 ( binlog、redo log 和 undo log ) 的作用?

如题所述

在MySQL的世界里,三大日志系统犹如大厦的基石,它们分别是binlog(二进制日志)redo log(重做日志)undo log(回滚日志)。它们各自承担着关键的角色,确保数据的一致性和可靠性。



首先,redo log是InnoDB存储引擎的独有特性,它犹如数据库的快照,负责记录每一次数据页的修改。其写入频率由innodb_flush_log_at_trx_commit参数决定,有三种策略:0(风险较高,可能导致1秒数据丢失)、1(事务提交即刷盘,确保数据零丢失)和2(牺牲部分实时性,仅缓存,数据库宕机可能丢失1秒)。redo log采用环形存储结构,write pos和check point的定位至关重要,write pos记录写入位置,check point用于日志的擦除和更新。在恢复过程中,redo log会被清空并推进check point,确保数据完整。

相比之下,binlog则扮演着逻辑日志的角色,它记录的是SQL语句而非物理数据。MySQL Server层的binlog有三种格式:statement、row和mixed,各有优劣。statement记录SQL语句,row记录详细数据,mixed则是两者折衷。row格式虽能保证数据一致性,但占用空间,而mixed则在空间和性能之间找到平衡。

binlog的写入时机在事务提交时,每个线程通过binlog_cache_size控制缓存,当达到上限时,会暂存磁盘。写盘流程分为写入page cache和fsync持久化,sync_binlog参数影响写入的时机。这确保了在集群环境中,binlog是数据复制和备份的关键,维护了数据的一致性。

undo log则负责事务的原子性,它的存在是为了在异常情况下,能够撤销操作以保持数据库的完整性。即使面对数据库宕机,undo log也能通过回滚日志实现数据的回滚,确保事务的完整执行。

在MySQL的备份、复制(主备、主主、主从模式)中,binlog起着至关重要的作用,确保数据在不同节点之间的同步一致性。但值得注意的是,redo log和binlog的写入时机不同,redo log在事务中持续写入,binlog仅在提交时记录,这需要通过两阶段提交机制来保证数据的一致性。

总的来说,MySQL的三大日志系统——binlog、redo log和undo log,各有其职责,共同构建了一个强大而稳健的数据管理平台。通过深入理解它们的工作原理,开发者可以更好地优化数据库性能,保障数据的可靠性和一致性。
温馨提示:答案为网友推荐,仅供参考
相似回答