掌握好binlog对学习MySQL非常的重要,下面我就全面来详解MySQL的binlog@mikechen
1. 什么是Binlog
Binlog是MySQL数据库的二进制日志文件,用于记录数据库中的所有更改操作。
例如插入、更新、删除等。它以二进制格式记录,以提高性能和可靠性。
2. Binlog的作用
Binlog的主要作用是用于数据恢复、数据复制和数据库故障恢复。
包含:
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语句的文本。
如下所示:
以SQL语句:执行一条update T set update_time=now where id=1,Statement会记录SQL语句的执行。
- 优点: 由于Binlog中记录的是SQL语句,而不是实际数据,因此Binlog文件通常相对较小,这可以节省磁盘空间。
- 缺点: 由于STATEMENT模式记录的是SQL语句的文本,而不是实际数据,因此在一些情况下可能会导致不够精确的记录。
2.ROW
在ROW模式下MySQL记录实际更改的行数据,也就是说:row记录的内容不再是简单的SQL语句了,还包含操作的具体数据。
如下图所示:
如果一个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事件,这里就会日志刷盘。
流程如下图所示:
大致分为如下几步:
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面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》