伤心的故事,当不当心删了线上的数据库
![](/uploads/allimg/200930/202009121755446956117121.jpg)
相关学习引荐:mysql教程
前言
由于比来开学季,我司又做的是高校相关的业务,所以比力忙,都没有什么时间来写文章,人一旦太忙的话就容易忙中出错。我呢就在前几天,不是,是我有个伴侣在前几天去操纵线上的数据库时,差点演出了一波删库跑路。
![](/uploads/allimg/200930/90167db0b07bf8defe523d6871bd2d8a-017122.jpg)
提早说明:真的是我伴侣,不是我。真的是我伴侣,不是我。真的是我伴侣,不是我。不外为了叙事利便,以下把“我伴侣”简称为“我”。
事情是这样的,我在对照部分表构造时发明这个库和其他库的表构造差的比力多,所以认为这个环境是没有在使用的环境,就直接对这几张表停止了一个覆盖操纵,恰好这几张表还是和学生钱包相关的,然后到晚上10点多公司的前方驻校人员在群里反应说是为什么钱包里钱变成0.0了,我一看到这个就直接吓尿了,想着是不是该跑路了。
![](/uploads/allimg/200930/e0fe46004c74f778988c3497347296f7-117123.png)
不外幸亏看过一些数据库复原的方案,还是略知一二。
数据复原
1.开启binlog日志
我使用的binlog日志来复原数据,要用binlog必定第一得确保binlog日志是开启状态的,可以用命令来查看。
show variables like 'log_%';复制代码
![](/uploads/allimg/200930/dbf602c1c09822002282be018962ed13-217124.png)
可以看到它是ON状态的,表示已开启,假如它是OFF状态的话,在my.cnf中[mysqld]
后增加配置后重新启动mysql效劳来开启。
# my.cnf文件 [mysqld] log-bin=mysql-bin server-id=1复制代码
2.查看binlog日志
确保开启binlog日之后,可以通过命令来查看binlog日志状态。
# 查看binlog日志的名目show master status;复制代码
![](/uploads/allimg/200930/aff0ded9e1b688b541daadfbffd80636-317127.png)
# 查看binlog日志内容show binlog events IN 'mysql-bin.000002';复制代码
![](/uploads/allimg/200930/aff0ded9e1b688b541daadfbffd80636-417129.png)
- Log_name 表示binlog日志名称
- Pos 表示pos起始点
- Event_type 表示此次操纵的类型
- Server_id 表示机器id,由my.cnf中配置指定
- End_log_pos 表示pos完毕点
- Info 表示详细语句
![](/uploads/allimg/200930/aff0ded9e1b688b541daadfbffd80636-517132.png)
# 进入储备binlog日志的文件木了,可以通过这条命令查看详情 mysqlbinlog --base64-output=decode-rows -v mysql-bin.000002;复制代码
![](/uploads/allimg/200930/7bbc5b26b6174267af34c7608a76a9a2-617133.png)
# 将binlog日志转为txt输出 mysqlbinlog --base64-output=decode-rows -v mysql-bin.000002 > sql.txt复制代码
3.复原数据
binlog日志复原数据的话,常用的有命令行复原,或者是把binlog日志拷贝出来,用读取binlog的工具来转成.sql文件,然后把里面的需要用到的sql都复制出来然后再跑一遍,这里主要讲的是命令行复原的办法。
命令行复原主如果通过排查binlog日志,确定要复原的起始点和完毕点后,输入命令停止复原。或者是预估一下本人误操纵失误的时间,通过一个时间段来复原数据。
# 通过起始点和完毕点复原 mysqlbinlog --start-position="582" --stop-position="9414" mysql-bin.000002 | mysql -uroot -proot;复制代码
# 通过起始时间和完毕时间来复原,传入的时间可以是一个yyyy-MM-dd HH:mm:ss 的时间格局,也可以是一个时间戳 mysqlbinlog --start-datetime="2020-9-1 8:25:04" --stop-datetime="2020-9-1 20:00:00" mysql-bin.000002 | mysql -uroot -proot复制代码
![](/uploads/allimg/200930/7bbc5b26b6174267af34c7608a76a9a2-717134.png)
![](/uploads/allimg/200930/f288eb14f4d82bbad855c2740721399b-817136.png)
可以看到,在输入复原命令后,我清空的数据库数据又回来了。
4.问题
binlog日志虽然可以复原数据,但是也存在问题,当binlog日志在不竭增大后,会停止主动删除,那就致使已经删除的那部分日志的数据就复原不了了。
不外binlog日志的大小和留存时间都是在可以在mysql中停止设定的。不外还是引荐做好每日的备份,这样可保十拿九稳。
# 设定文件大小,单位是字节,下面换算是100Mset global max_binlog_size=104857600; # 设定文件留存天数,下面是留存7天,默许值为0,表示"没有主动删除"set global expire_logs_days = 7;复制代码
每日备份
关于线上环境来说,做好每日备份和binlog一起用才是王道。线上一样都是摆设在linux上的,所以这里就简便列一下linux的按时备份办法。
1.检查可否安置按时任务,安置crontab
yum install crontabs复制代码
2.设定按时任务
/var/spool/cron/root 此文件为crontab按时任务,可通过crontab -e
或者直接修改此文件修改.
crontab -l
查看按时任务.
3.创立一个shell足本
touch xxx.sh
mysqldump -uroot -p"密码" 数据库名 > /mysql/person_`date +%Y%m%d`.sql复制代码
4.修改文件权限
chmod 777 xxx.sh
5.翻开按时任务文件
crontab -e
每天凌晨2点施行 00 2 * * * /xxx.sh复制代码
结束!