掘金 后端 ( ) • 2024-04-22 11:04

之前在生产做修改数据的时候不小心改错了一行数据,本来以为会被通报批评,但是同事利用binlog日志查看到了之前的旧数据,并且帮我回滚了,学到了,所以写了一篇binlog的文章分享给大家。

MySQL的Binary Log(简称binlog)是一种重要的数据库日志系统,用于记录数据库服务器上所有更改数据的活动。Binlog是MySQL数据库中的一种二进制格式的日志文件,它主要记录了对数据库数据进行修改的所有操作事件。这些操作不仅包括数据变更(如INSERT、UPDATE、DELETE等DML语句),还包括数据定义(如CREATE、ALTER、DROP等DDL语句)以及与事务相关的事件(如BEGIN、COMMIT、ROLLBACK)。

Binlog的主要作用包括:

  • 数据恢复(Point-in-Time Recovery, PITR):通过重放binlog中的事件,可以将数据库恢复到任意指定的时间点,实现数据备份后的增量恢复或灾难恢复。
  • 主从复制(Replication):在MySQL的主从架构中,主库将binlog发送给从库,从库通过解析并执行这些事件来保持与主库的数据同步。
  • 审计:由于binlog记录了所有数据变更的详细操作,可以用于监控数据变化、追踪问题原因或满足合规性要求的审计需求。

必要知识:

Linux安装Mysql(图文解说详细版,安装包tar包版)

Linux安装Mysql(图文解说详细版)

开启binlog

那么说了这么多,我们来看看binlog长什么样,首先我们要查看我们的mysql有没有开启binlog

SHOW VARIABLES LIKE 'log_bin';

在这里插入图片描述

如果是off则说明没有开启binlog,我们把他开启

vim /etc/my.cnf

在这里插入图片描述

server_id=1
log_bin=mysql-bin
binlog_format=ROW

查看binlog

在这里插入图片描述

show variables like 'log_bin%';

可以看到成功开启

我们在 MySQL 的配置文件 my.cnf 中,可以配置以下与二进制日志(binlog)相关的参数:

  1. log_bin:这个参数用于启用二进制日志。你可以设置它的值为 ON 或者 OFF。例如,log_bin=ON。
  2. binlog_format:这个参数用于设置二进制日志的格式。MySQL 支持多种二进制日志的格式,包括 STATEMENT、ROW 和 MIXED。例如,binlog_format=ROW。
  3. expire_logs_days:这个参数用于设置二进制日志的过期时间。当二进制日志的时间超过这个值时,MySQL 会自动删除这些日志。例如,expire_logs_days=7。
  4. max_binlog_size:这个参数用于设置每个二进制日志文件的最大大小。当一个二进制日志文件的大小达到这个值时,MySQL 会自动创建一个新的二进制日志文件。例如,max_binlog_size=100M。
  5. binlog_do_db 和 binlog_ignore_db:这两个参数用于设置哪些数据库的操作会被记录到二进制日志中,以及哪些数据库的操作会被忽略。例如,binlog_do_db=database1 和 binlog_ignore_db=database2。

其中data文件里面这两个就是我们的binlog文件

在这里插入图片描述

可以看到一个里面存储的事二进制字节,一个存储的是有效的文件列表

验证binlog

前面我们说过binlog会记录不仅包括数据变更(如INSERT、UPDATE、DELETE等DML语句),还包括数据定义(如CREATE、ALTER、DROP等DDL语句)

我们创建一个表:

CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(15),
balance DECIMAL(10,2)
);

并且往里面添加一些数据

insert into account (name,balance) values ('zhangsan',10.10);

我们再查看我们的binlog日志:注意mysqlbinlog 命令是在我们mysql的bin文件夹下面的一个命令

mysqlbinlog --no-defaults --base64-output=decode-rows -v   ../data/mysql-bin.00000*

之后我们就可以看到我们刚刚添加的操作

在这里插入代码片

如果我们更新一下里面的数据我们再看看会发生什么(模拟生产上的误操作):

update account set balance = 20 where name = 'zhangsan';

在这里插入图片描述

可以看到,binlog里面完整地记录了原值和更新后的值,这对我们误操作的数据恢复是非常有用的。

例如实际生产过程中我们在一个时间段里面('2024-04-20 13:20:00'到 '2024-04-20 15:00:00')操作了生产的数据,结果给操作错了,这个时候我们加上时间范围参数可以查看这个时间段数据库修改的数据的信息

mysqlbinlog --no-defaults --base64-output=decode-rows -v --start-datetime='2024-04-20 13:20:00' --stop-datetime='2024-04-20 15:00:00'   ../data/mysql-bin.000002 

在这里插入图片描述

就可以看到我们刚刚误操作的数据了,这个时候我们只需要在把金额从20元改为10元即可。正常来说开发的同事是不能直接操作生产数据库的,但是应为我们公司比较特殊,所以经常要在生产执行sql,如果遇见这种情况,一定要发你的sql出来给同事检查或者领导审核一下,避免不必要的损失。