binlog最全详解(作用模式及原理机制)

binlog最全详解(作用模式及原理机制)-mikechen

掌握好binlog对学习MySQL非常的重要,下面我就全面来详解MySQL的binlog@mikechen

1. 什么是Binlog

Binlog是MySQL数据库的二进制日志文件,用于记录数据库中的所有更改操作。

例如插入、更新、删除等。它以二进制格式记录,以提高性能和可靠性。

 

2. Binlog的作用

Binlog的主要作用是用于数据恢复、数据复制和数据库故障恢复。

binlog最全详解(作用模式及原理机制)-mikechen

包含:

1.数据恢复

Binlog它可以用来还原数据库到之前的状态,以应对误操作、数据丢失、数据库崩溃或其他紧急情况。

2.数据复制

Binlog支持数据库的主从复制,主服务器上的所有更改操作都被记录在Binlog中,并可以被一个或多个从服务器复制。

3.数据备份

Binlog可用于增量备份数据库,可以定期备份Binlog文件,从而节省时间和存储空间。

一句话总结:它可以用于还原数据库到之前的状态,通过将更改操作应用于其他数据库来实现主从复制,以及在数据库发生故障时用于恢复数据。

 

如何开启Binlog

要在MySQL中启用Binlog,你需要编辑MySQL的配置文件。

1.打开配置文件

sudo nano /etc/mysql/my.cnf  # 用你的文本编辑器和配置文件路径替换这个命令

 

2.启用binlog

在配置文件中查找或添加以下行,以启用Binlog。

如下所示:

log_bin = /path/to/binlog_file

请将/path/to/binlog_file替换为你希望存储Binlog文件的实际路径和文件名,并确保该目录存在并具有适当的权限。

 

如何配置Binlog

上面启用好Binlog后,还可以具体配置binlog。

你可以选择Binlog的记录格式,如下所示:

binlog_format = ROW # 可以选择STATEMENT、ROW或MIXED

指定Binlog的保留天数,如下所示:

expire_logs_days = 7  # 设置为你希望的保留天数

指定每个Binlog文件的最大大小,如下所示:

max_binlog_size = 100M  # 设置为你希望的最大大小

在更改MySQL配置后,需要重启MySQL服务器以使更改生效。

sudo service mysql restart  # 用你的系统的启动/停止命令替换这个命令

 

Binlog三种模式

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

1.STATEMENT

在STATEMENT模式下,以SQL语句的形式记录更改操作。

例如:如果在主服务器上执行了一条UPDATE语句,Binlog将记录该UPDATE语句的文本。

如下所示:

binlog最全详解(作用模式及原理机制)-mikechen

以SQL语句:执行一条update T set update_time=now where id=1,Statement会记录SQL语句的执行。

  • 优点: 由于Binlog中记录的是SQL语句,而不是实际数据,因此Binlog文件通常相对较小,这可以节省磁盘空间。
  • 缺点: 由于STATEMENT模式记录的是SQL语句的文本,而不是实际数据,因此在一些情况下可能会导致不够精确的记录。

 

2.ROW

在ROW模式下MySQL记录实际更改的行数据,也就是说:row记录的内容不再是简单的SQL语句了,还包含操作的具体数据。

如下图所示:

binlog最全详解(作用模式及原理机制)-mikechen

如果一个update语句修改一百行数据,那么这种模式下就会记录100行对应的记录日志,是以行级别的方式记录更改操作。

  • 优点: ROW模式是最可靠的复制方式,因为它记录了实际更改的数据,不受SQL语句的复杂性或数据库结构的影响。
  • 缺点: ROW模式生成的Binlog文件通常比STATEMENT模式更大,因为它需要记录更多的数据。

 

3.MIXED

在MIXED模式下,MySQL会根据具体情况选择使用STATEMENT或ROW模式来记录更改操作。

通常对于简单的更改操作,使用STATEMENT模式,而对于复杂的更改操作,使用ROW模式。

  • 优点: MIXED模式兼具了STATEMENT和ROW的优点。
  • 缺点: MIXED模式可能会导致不一致性,因为它根据情况而定选择记录方式。

 

binlog写入机制

binlog的写入时机非常简单,当执行对数据库表的数据修改操作时,如:插入(INSERT)、更新(UPDATE)等。

MySQL会生成相应的binlog事件,这里就会日志刷盘。

流程如下图所示:

binlog最全详解(作用模式及原理机制)-mikechen

大致分为如下几步:

1.SQL语句执行阶段

Binlog的写入机制从SQL语句执行阶段开始,当一个SQL语句被发送到MySQL服务器进行执行时,MySQL会首先检查是否启用了Binlog。

以及使用了哪种Binlog格式,比如:是STATEMENT、还是ROW、或者MIXED模式。

 

2.SQL语句记录

如果启用了Binlog,MySQL会记录要执行的SQL语句,或者根据Binlog格式记录对应的数据更改。

根据具体的SQL语句和Binlog格式,MySQL将为每个更改操作生成Binlog事件。

 

3.Binlog事件生成

每个Binlog事件包含了SQL语句的相关信息,包括数据库、表、操作类型和操作数据。

对于STATEMENT模式,事件包括SQL语句的文本,而对于ROW模式,事件包括实际的行数据。

Binlog事件还包括了事件的元数据,如时间戳、服务器ID等。

 

4.事件写入Binlog文件

生成的Binlog事件被写入Binlog文件,每个Binlog文件都有一个唯一的文件名,通常以数字序列命名。

例如:binlog.000001、binlog.000002等,Binlog文件以二进制格式存储,以提高性能和减少存储空间的占用。

 

5.追加写入

binlog采用追加写入机制,即新的binlog事件总是被附加到当前binlog文件的末尾。

这种机制有助于减少对磁盘的随机写入,提高了性能,因为磁盘随机写入通常比顺序写入要慢。

总的来说,binlog的写入机制保证了数据的一致性和完整性,并通过追加写入和事务性写入来提高性能和可靠性。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法