其它 ·

mysql数据库误删除后的数据恢复

在日常运维工作中,对于mysql数据库的备份是至关重要的!数据库对于网站的重要性使得我们对mysql数据的管理不容有失!
然而是人总难免会犯错误,说不定哪天大脑短路了来个误操作把数据库给删除了,怎么办???

下面,就内部创新平台实际运维中mysql数据库误删除后的恢复方案进行说明。

一、工作场景
(1)MySQL数据库每天晚上自动完全备份,但由于更改了root密码,备份脚本失效了,最近的完整备份是半个月前的。
(2)某天晚上20点的时候,犯晕删掉了数据库中所有表!

二、数据恢复思路
(1) 利用全备的sql文件和binlog文件及其位置点信息,找出binlog文件中增量的那部分。
(2) 用mysqlbinlog命令将上述的binlog文件导出为sql文件,并剔除其中的drop语句(误操作删除的语句)。
(3)通过全备文件和增量binlog文件的导出sql文件,就可以恢复到完整的数据。

三、实例说明

第一步: 确保mysql开启了binlog日志功能
对存放重要业务数据的MySQL,强烈建议开启binlog。

查看binklog是否开启:

show variables like '%log_bin%';

查看binlog存放日志文件目录:

show variables like '%datadir%';

如下图,binlog目录为/var/lib/mysql/,值为ON,已开启)

mysql数据库误删除后的数据恢复 其它 第1张

binlog开启方法如下 :

在/etc/my.cnf文件里的[mysqld]区块添加:log-bin=mysql-bin,然后重启mysql服务即可开启

mysql数据库误删除后的数据恢复 其它 第2张

第二步:进入binlog文件目录,找出日志文件

如下图中的binlog.000004、 binlog.000005、和 binlog.000006

mysql数据库误删除后的数据恢复 其它 第3张

第三步: 通过mysqlbinlog工具命令查看全备份之后的所有操作记录

mysqlbinlog 命令的语法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名
常用参数选项解释:
--start-datetime="2020-09-27 08:42:00" 起始时间点 
--stop-datetime="2020-10-13 20:00:00" 结束时间点 
--database=iip 指定只恢复iip数据库 

例子:查询 2020-09-27 08:42:00 到 2020-10-13 20:00:00 数据库为 iip 的操作日志,输入如下命令将数据写入到一个备用的sql文件中,存放于/tmp目录下

mysqlbinlog --no-defaults --database=iip --start-datetime="2020-09-27 08:42:00" --stop-datetime="2020-10-13 20:00:00" /var/lib/mysql/binlog.000004    > /tmp/004bin.sql

将binlog文件导出sql文件,并编辑它删除其中的drop语句 。如不确定位于那几个binlog文件中,可对每个 binlog 文件进行导出。

mysql数据库误删除后的数据恢复 其它 第4张

注意:
在恢复全备数据之前必须将该binlog文件移出,否则恢复过程中,会继续写入语句到binlog,最终导致增量恢复数据部分变得比较混乱

第四步: 通过全量备份文件和剔除其中的误操作drop语句后的增量sql文件恢复数据

mysql通过sql恢复命令如下:

mysql -uroot -p < 004bin.sql

以上就是此处mysql数据库增量数据恢复的过程。

最后,总结几点:
1)本案例适用于人为SQL语句造成的误操作或者没有主从复制等的热备情况宕机时的修复
2)恢复条件为mysql要开启binlog日志功能,并且要全备和增量的所有数据
3)恢复时建议对外停止更新,即禁止更新数据库
4)先恢复全量,然后把全备时刻点以后的增量日志,按顺序恢复成SQL文件,然后把文件中有问题的SQL语句删除(也可通过时间和位置点),再恢复到数据库。

参与评论