MySQL数据误删恢复

DELETE FROM `users` WHERE `id` NOT IN(1,2)

我意识到我闯祸了
19:40-21:55 谷歌百度不知道打开了多少网页 终于补救回来了
我这次是运气好服务器开启了日志
要不然哭都没地哭
数据库要定期备份
一定要开启日志!!!!

总结:

所谓数据库数据恢复可以理解为 让数据库在一段时间内执行的sql语句重新执行(注意是执行到删除之前一分钟)

当我意识到删除之后有点慌,因为数据表引擎是InnoDB 所以我多少的感觉到应该可以恢复(其实我心里一点底都没有,就是感觉),于是赶紧谷歌百度,爬了很多文档之后有一句话感觉很对就照做了

  • 不要在写入新数据了,会导致数据污染,更难恢复

之前有了解过误删文件恢复,大概意思就是当想找回误删的文件时千万不要在哪个磁盘中写入新文件,会导致文件覆盖

于是我:

  • 关闭网站
  • 备份当前存在的数据
  • 关闭定时任务(我的定时任务是往数据库写入数据的)

通过搜索得知binlog这个东西(其实就是日志)

想要恢复数据,首先想到的也是日志:有无所有SQL操作的记录日志,有无开启binlog同步日志。这样才能根据SQL记录重新恢复数据,否则,数据将无法找回。
其次,我们需要查以下MySQL服务器开启了哪些日志,于是首先查看MySQL的配置文件 /etc/my.cnf ,发现开启了errorlogslowlogbinlog,这时就可以松一口气了,因为只要有binlog,所有数据都将找得回来,slowlog对我们当前的问题来说并没有什么用,errorlog后面我们拿来查找问题原因也许会有用。

万幸我的mysql开启了binlog日志

show variables like 'log_%'; 


log_bin 是开启状态

查看当前有哪些binlog文件

show binary logs;


发现有3个binlog文件,我们再来查看当前正在使用的binlog文件是哪个

查看当前使用的binlog文件

show master status;


进入到MySQL的数据存放目录 /www/server/data/,先将这几个binlog文件备份起来,以便防止数据丢失。

进入日志目录中

 cd /www/server/data/

备份

# 在用户目录下创建文件夹
mkdir -p ~/mysql-bin-backup
# 拷贝当前目录下所有mysql-bin.开头的文件 到 mysql-bin-backup
cp mysql-bin.* ~/mysql-bin-backup/ -r

将日志转SQL

几个参数了解一下
--start-datetime="开始时间"
--stop-datetime="结束时间"
--database=数据库名称

这段命令的意思是 读取 mysql-bin.000004 开始时间 到 结束时间 指定数据库的操作 转成sql文件

/www/server/mysql/bin/mysqlbinlog  --start-datetime="2019-12-07 00:00:00" --stop-datetime="2019-12-13 19:40:00" --database=vip_elemecps_com  /root/mysql-bin-backup/mysql-bin.000004 > ~/66666.sql

恢复数据

我是在本地导入的
本地终端链接mysql

创建个数据库
进入数据库

导入sql文件

你会发现你的数据库又回来了哈哈哈哈哈

知识扩展:

mysql是否开启binlog日志:

终端运行:

show variables like 'log_bin';

如果Value 为 OFF 则为开启日志文件

开启方法:

找到my,cnf 中 [mysqld] 添加如下

[mysqld]
# binlog 配置
log-bin = /usr/local/var/mysql/logs/mysql-bin.log
expire-logs-days = 14
max-binlog-size = 500M
server-id = 1

如果没有my.cnf 或者是集成的环境 找到my.ini 中 [mysqld] 添加如下:

[mysqld]
# binlog 配置
log-bin = /usr/local/var/mysql/logs/mysql-bin.log
expire-logs-days = 14
max-binlog-size = 500M
server-id = 1

重启mysql后

show variables like 'log_bin'; 

value 为 ON 即可