一架梯子,一头程序猿,仰望星空!
MYSQL基础面试题 > 内容正文

MYSQL的binlog是什么,它的作用是什么?


问题简答

Binlog(二进制日志)是一种记录数据库所有更新操作的日志文件,它记录了每个更新操作的SQL语句或者每条数据的变更情况。binlog在主从复制、数据恢复、数据备份、数据订阅等都有应用场景。

问题详解:

Binlog应用场景

  • 主从复制:在MYSQL主从复制的场景下,主库将binlog中的更新操作记录发送到从库,从库读取binlog并执行相应的SQL语句来更新自己的数据。
  • 数据恢复:在数据意外删除或者修改错误的情况下,可以通过binlog中记录,逆向执行SQL语句来恢复数据。
  • 数据备份:可以使用binlog来进行增量备份,即只备份binlog文件中记录的更新操作,而不需要备份整个数据库。
  • 数据订阅:binlog中记录了所有的更新操作,可以通过binlog监控数据变化行为,触发业务操作。

Binlog格式

1.Statement格式

Statement格式是最早出现的格式,在这种格式下,binlog会记录每个执行的SQL语句,因此binlog文件会比较小,但是在某些情况下会出现不同步的问题,例如某些函数的结果是不确定的,可能在主库上和从库上的结果不一致。

2.Row格式

Row格式记录的是每行数据的变化,也就是说它记录的是每条SQL语句执行后受影响的行的变化情况,而不是执行的SQL语句本身,因此binlog文件会比较大,但是它不会出现不同步的问题,因为它记录的是每行数据的变化。

3.Mixed格式

Mixed格式是Statement格式和Row格式的混合使用,MySQL会根据执行的SQL语句自动选择使用哪种格式,因此binlog文件既比较小,又不会出现不同步的问题。

不同的binlog格式适用于不同的场景,Statement格式适用于执行的SQL语句比较简单的情况,Row格式适用于执行的SQL语句比较复杂的情况,Mixed格式则可以兼顾二者的优缺点,适用于大部分情况。

提示:如果使用阿里Canal这种MYSQL数据订阅工具,通常使用ROW格式,因为binlog可以准确反映数据变更历史。

Binlog配置

下面是开启binlog的方式和配置参数说明

1.修改 my.cnf 配置文件,开启binlog

修改MySQL 的配置文件 my.cnf ,添加下面配置,然后重启MYSQL

[mysqld]
# --忽略其他不相关配置---
# 启用 binlog,指定生成的 binlog 文件名为 mysql-bin
log-bin=mysql-bin
# 指定 binlog 格式,指定 binlog 的格式为 ROW 模式,也可以使用 STATEMENT 或 MIXED 模式
binlog_format=ROW
# 设置 单个binlog 文件的最大尺寸为 1G,日志文件超过最大值会创建新的日志文件
max_binlog_size=1G
# 设置 binlog 文件的保存路径
log_bin=/var/lib/mysql/mysql-bin.log
# 保留7天的binlog,超过时间,历史binlog会被删除
expire_logs_days=7

2.使用 SET GLOBAL 命令,临时开启binlog

登录MYSQL,执行下面命令,可以立即生效无需重启,不过重启MYSQL后配置就丢失了

SET GLOBAL log_bin = ON;
SET GLOBAL binlog_format = 'ROW';
SET GLOBAL max_binlog_size = 1073741824;

提示:开启binlog,需要注意磁盘空间是否足够。