工欲善其事必先利其器
想要详细了解数据库误删后的恢复操作,得先了解一些基本的信息
目录
Binlog 日志详解
一、Binlog 记录模式
二、Binlog 文件结构
三、Binlog 写入机制
四、Binlog文件操作
1、查看Binlog的状态
2、开启Binlog功能
3、查看都有哪些日志文件
4、查看当前正在操作的日志
5、查看当前日志中有哪些事件
6、删除日志文件的三种方式
7、查看和修改日志文件的有效期
8、查看日志文件的详细信息
9、对删除数据库的恢复具体操作
首先呢,想要恢复误删的数据库,可以先从日志入手,而在数据库的InnoDB搜索引擎中有三种日志:Undo Log 日志、Redo Log 日志、Binlog 日志,三种日志中,我们需要通过Binlog日志来进行数据库的恢复
Binlog 日志详解
一、Binlog 记录模式
Binlog是记录所有数据库表结果变更以及表数据修改的二进制日志,而不会记录SELECT和SHOW这类的操作。Binlog日志以时间的形式进行记录,还会包含语句所执行的消耗时间。开启Binlog日志后,会有以下两个最为重要的使用场景:
① 主从复制:在主库中开启Binlog功能,这样主库就可以把Binlog传送给从库,从库在拿到Binlog后,就可以实现数据恢复,从而达到主从数据的一致性。
② 数据恢复:通过mysqlbinlog工具来恢复数据。
Binlog文件名默认为“主机名_binlog-序列号”格式,譬如:stu_binlog-000001,当然也可以在配置文件中指定名称。文件记录模式有 STATEMENT、ROW 和 MIXED 三种,具体的含义如下:
① ROW(row-based replication,RBR):日志中会记录每一行数据被修改的情况,然后在slave端对相同的数据进行修改。
优点:能清楚的记录每一个行数据的修改细节,并能完全实现主从数据同步和数据的恢复。
缺点:批量操作,会产生大量的日志,尤其是 alter table 会让日志暴涨。
② STATEMENT(statement-based replication,SBR):每一条被修改数据SQL都会记录到master的Binlog中,slave在复制的时候SQL进程会解析成和原来master端执行过的相同的SQL再次执行。简称SQL语句复制。
优点:日志量小,减少磁盘IO,提升存储和恢复速度
缺点:在某些情况下会导致主从数据不一致,譬如:last_insert_id()、now()等函数时
③ MIXED(mixed-based replication,MBR):以上两种模式的混合使用,一般会使用STATEMENT模式保存Binlog,对于STATEMENT模式无法复制的操作则使用ROW模式来保存Binlog,MySQL会根据执行的SQL语句来选择写入的模式
二、Binlog 文件结构
MySQL的Binlog文件中记录的是对数据库的各种修改操作,用来表示修改操作的数据结构是Log event,不同的修改操作对应不同的log event,比较常用的log event有:Query event、Row event、Xid event等。Binlog文件的内容就是各种log event的集合。
Binlog文件中的 Log event结构如下图:
timestamp 4字节 | 事件开始的执行时间 |
Event Type 1字节 | 指明该事件的类型 |
server_id 1字节 | 服务器的server ID |
Event size 4字节 | 该事件的长度 |
Next_log pos 4字节 | 固定4字节下一个event的开始位置 |
Flag 2字节 | 固定2字节 event flags |
Fixed part | 每种Event Type 对应结构体固定的结构部分 |
Variable part | 每种Event Type 对应结构体可变的结构部分 |
三、Binlog 写入机制
① 根据记录模式和操作出发 event 事件生成 log event (事件出发执行机制)
② 将事务执行过程中产生的 log event 写入到缓冲区,每个事务线程都偶有一个缓冲区
** Log Event 保存在一个 Binlog_cache_mngr 数据结构汇中,在该结构中有两个缓冲区,一个是 stmt_cache,用来存放不支持事务的信息;另一个 trx_cache,用于存放支持事务的信息。
③ 事务在提交阶段会将产生的 Log event 写入到外部的 Binlog 文件中
** 不同事务以串行方式将Log event 写入到 Binlog 文件中,所以一个事务包含的Log event 信息在 Binlog 文件中是连续的,中间不会插入其他事务的Log event。Binlog是引擎插件上层的功能,事务提交第一个就会调用Binlog的功能接口,然后再调用其他存储引擎的功能接口。所以先写 Binlog,然后在执行 InnoDB 的 redo log / undo log 和脏页刷新操作。
四、Binlog文件操作
1、查看Binlog的状态
方法一:show variables like "log_bin";
方法二:show variables like "%log_bin%";
示例图:
Tip:默认情况下, log_bin 的值是 OFF 状态的哦
2、开启Binlog功能
正常情况下,我们使用如下命令即可搞定,但是这次好像不行了哦,需要我们去直接修改配置文件
mysql> set global log_bin=1;
ERROR 1238 (HY000): Variable 'log_bin' is a read only variable
遇到这种错误,我们接下来需要修改 my.cnf <MAC系统> 或者 my.ini<Windows系统> 配置文件,在 [mysqld] 下面增加 log-bin=mysql-bin
3、查看都有哪些日志文件
方法一:show binary logs;
方法二:show master logs;
4、查看当前正在操作的日志
show master status;
5、查看当前日志中有哪些事件
''' 查看当前日志中有哪些事件 '''
show binlog events;
''' 查看当前指定日志文件 '''
show binlog events in 'mysql-bin.000005';
Tip:上面两个图只要细心的话就会发现,上一个事件的结束位置,就是下一个事件的开始位置,在后面恢复删除数据库的操作会用到这个哦
6、删除日志文件的三种方式
''' 删除指定的日志文件 '''
purge binary logs to 'mysql-bin.000003';
''' 删除指定时间之前的文件 '''
purge binary logs before '2021-12-08 00:00:00';
''' 清除所有日志文件 '''
reset master;
示例效果展示:
目前已经存在的日志文件,接下来对 "mysql-bin.000003" 日志文件进行删除
删除12月8号之前的文件和清除所有文件
7、查看和修改日志文件的有效期
''' 查看日志文件的有效期 '''
show variables like '%expire_logs_days%';
''' 默认有效期为 0,表示 Binlog 日志的自动清理功能是没有启用的 '''
''' 设置日志文件的有效期(启用日志自动清理功能),设置为2 表示超出2天,Binlog文件会自动删除 '''
set global expire_logs_days=2;
示例效果图:
8、查看日志文件的详细信息
Tip:如果想要查看日志文件的详细信息的话,我们需要离开MySQL的命令行,回到系统中的终端命令行来进行,找到安装MySQL时的路径下的 data 目录,会发现我们的日志文件
mysql-bin.000001接下来,我们在终端输入命令就可查看日志文件的详细信息了哦,里面包含了每条操作记录的详细时间,后面我们也可以通过这个时间来恢复删除的数据库
'''
在MySQL的 data 目录下执行下面的命令,来查看指定日志文件的详细信息
可能有的小伙伴输入这个命令后,看不到详细的信息内容,这个时候就需要用 ls -la 来查看下
日志文件的权限,修改下权限即可哈
sudo chmod 权限 文件名
'''
mysqlbinlog 'mysql-bin.000001'
示例效果:
9、对删除数据库的恢复具体操作
删除数据库恢复的具体操作