硬核干货,带你一文掌握 MySQL 的binlog 、redo log、undo log

本文详细介绍了MySQL中的核心日志——binlog、redo log和undo log。binlog记录所有写操作,用于主从复制和数据恢复,有三种格式:STATEMENT、ROW和MIXED。redo log是InnoDB引擎的重做日志,用于保证数据的持久性,其写入策略通过innodb_flush_log_at_trx_commit参数控制。undo log则用于事务回滚和MVCC,保证事务的原子性。理解这些日志对于数据库管理和优化至关重要。
摘要由CSDN通过智能技术生成

​hello,大家好。

在MySQL 中我们经常会接触到三个核心日志,它们分别是:binlog 、redo log、undo log。

好多同学对于它们可能并不陌生,但是具体区分起来各自的功能用途以及实现原理,那可能认知就会比较模糊了,今天就跟大家一起,来清晰明了的介绍一下这些日志的核心思想和功能原理。

1 binlog

1.1 binlog 设计目标

binlog 记录了对MySQL数据库执行更改的所有的写操作,包括所有对数据库的数据、表结构、索引等等变更的操作。

注意:这其中不包含SELECT、SHOW等,因为对数据没有修改

只要是对数据库有变更的操作都会记录到binlog里面来,我们可以把数据库的数据看做银行账户里的余额,而binlog就相当于我们银行卡的流水记录。账户余额只是一个结果,至于这个结果怎么来的,那就必须得看流水了。

在实际应用中, binlog 的主要应用场景分别是 主从复制 和 数据恢复。

  1. 主从复制 :在 Master 端开启 binlog ,然后将 binlog 发送到各个 Slave 端, Slave 端重放 binlog 来达到主从数据一致。

  2. 数据恢复 :通过使用 mysqlbinlog 工具来恢复数据。

1.2 binlog 数据格式

binlog 日志有三种格式,分别为 STATMENT 、 ROW 和 MIXED。

在 MySQL 5.7.7 之前,默认的格式是 STATEMENT , MySQL 5.7.7 之后,默认值是 ROW。日志格式通过 binlog-format 指定。

  • ROW:基于行的复制(row-based replication, RBR),不记录每条SQL语句的上下文信息,仅需记录哪条数据被修改了。如果一个update语句修改一百行数据,那么这种模式下就会记录100行对应的记录日志。

  • 优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题;

  • 缺点:会产生大量的日志,尤其是 alter table 的时候会让日志暴涨。

  • STATMENT:基于SQL语句的复制( statement-based replication, SBR ),每一条会修改数据的SQL语句会记录到 binlog 中 。相对于ROW模式,STATEMENT模式下只会记录这个 update 的语句,所以此模式下会非常节省日志空间,也避免着大量的IO操作。

  • 优点:不需要记录每一行的变化,减少了 binlog 日志量,节约了 IO , 从而提高了性能;

  • 缺点:在某些情况下会导致主从数据不一致,比如执行sysdate() 、 slepp() 等 。

  • MIXED:基于 STATMENT 和 ROW 两种模式的混合复制(mixed-based replication, MBR),一般的复制使用 STATEMENT 模式保存 binlog ,对于一些函数,STATEMENT 模式无法复制的操作使用 ROW 模式保存 binlog。

基于这三种模式需要注意的是:

1)使用 row 格式的 binlog 时,在进行数据同步或恢复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值