# Binlog 日志文件的重要性

Replication 集群原理就是利用 Binlog 日志进行同步数据,所以有必要了解。

# Binlog 日志文件

binlog 日志文件记录了 MySQl 执行的所有操作,以及 执行 SQL 语句消耗的时间

默认情况下是关闭的。

# 开启 binlog 日志

修改 mysql 配置文件,加上 log_bin 参数,重新启动 MySQL 服务

## 日志文件名称,可以随意起名
log_bin = mysql_bin
1
2

对于文件的切分存储,mysql 会自动做,后面搭建 Replication 集群时再演示。

# 误删除数据的闪回

Binlog 日志文件的重要性作用,这里使用 误删除数据的闪回做例子讲解

执行了错误的 SQL 语句,误删除了记录,即便 事物已经提交,但是 依然可以找回数据,但是业务系统必须要停机(不能有新的数据写入)

可以使用 Python 程序从 binlog 日志中提取 SQL 语句,然后找到剔除错误的 SQL 语句,重新执行 binlog 日志中的 SQL 即可

# 误删除数据找回演示

笔者这里不去实操了。只记录下流程

需要一个权限的 binlog 日志,最好就是先把之前的删除掉,重新启动数据库。

然后执行一些插入数据的操作,再删除掉数据,再插入几行。

那么我们就要利用闪回工具找回被删掉的数据,并且新插入的还保留。

-- 首先查看 binlogs 的路径
SHOW MASTER LOGS

-- 查询的结果,类似如下的显示
-- 有多个 bin log 文件
Log_name					File_size
mysql-bin.000001	177
mysql-bin.000002	2996342
mysql-bin.000003	734
1
2
3
4
5
6
7
8
9

使用 binlog2sql 工具,找回

python binlog2sql.py 
-uadmin	-p'123456'			# 用户名与密码
-dflash									# 逻辑库
-t student							# 数据表
--start-file=‘mysql-bin.000001’	# 日志文件
>/home/flash1.sql				# 将解析的 sql 语句输出到哪个文件
1
2
3
4
5
6

这个命令要对多个 binlog 日志进行解析,因为你不确定那些语句被记录在哪个文件上了

python binlog2sql.py  -uadmin	-p'123456' -dflash -t student	--start-file=‘mysql-bin.000001’>/home/flash1.sql

python binlog2sql.py  -uadmin	-p'123456' -dflash -t student	--start-file=‘mysql-bin.000002’>/home/flash2.sql
1
2
3

解析出的 SQL 语句如下图所示

image-20200623225211701

可以看到先插入了 4 条语句,然后更新了 2 条语句,再删除了 4 条语句,再插入了 4 条语句。包括还有创建表的语句。

找回数据就很简单了:将 delete 的那 4 条语句删除,把其他的语句重新执行一次,就找回来了