记一次数据恢复

引言

今天一位小兄弟准备实现一遍从删库到跑路的创举,于是把数据库里面的所有数据都给清空了,这一番操作可就苦恼我了,数据丢失那可是非常严重的问题,必须要对数据库进行恢复

恢复数据的过程

看到数据库为空的那一瞬间,我的大脑其实是不清醒的,然后那个瞬间我突然想起,我曾经写过一个定时脚本,它会在每天凌晨的三点钟对数据库进行全量备份。
在/var/mysql-backup目录下找到了20180426.sql的备份。于是先恢复一部分数据先,使用mysql的终端执行了下面的命令

mysql -uroot -p
use xxxdatabase;
source /var/mysql-back/20180426.sql

这样就把数据恢复到了晚上凌晨三点的状态,但是仅仅这样还是不够的,发现失去数据的时间为下午3点钟,这就是说从凌晨3点到下午3点整整12个小时的数据全部丢失,这样的损失仍然是无法接受的
于是检查一下/etc/my.cnf,发现我的习惯还是不错的,二进制日志默认开启,那么事情就简单了,只要把这个时间节点的二进制日志导出,继而恢复即可

基于二进制日志对数据库进行恢复

首先找到二进制日志所在的目录/var/mysql/,找到最近的二进制文件名称为mysql-bin.000011,
接下来在命令行下使用mysqlbinlog命令,导出这段时间的记录

ps 这里加上了--no-defaults 参数,因为在我的mysql5.7中 不加这个参数执行会出现mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8mb4'这样的错误

mysqlbinlog  --no-defaults    --start-datetime="2018-04-26 03:00:00" --stop-datetime="2018-04-26 15:00:00"  /data/mysql/mysql-bin.000011 > backup

这样就把这个时间点的数据全部导出到了backup中,然后用输入重定向的方式执行命令
~~~
mysql -u oort -p < backup
~~~~
然后检查了一下数据库,发现数据都回来了,完美的解决了问题

总结

数据是重中之重,定时脚本每天备份是必不可少的操作,然后二进制日志一定要开启,不要在乎那一点点的性能损耗,我们有必要用性能来换取数据库的容灾性。并且在有条件的情况下,请使用多台数据库做主从的操作,来保证数据库的容灾性质,

发表评论