月初某晚朋友说数据库误删了,没有备份能不能恢复,我一愣,突然想到之前我们遇到过的问题,便问他是否开启了binlog。
show variables like 'log_bin'; //查看命令
如果现实log_bin是ON,就说明打开了。
值得庆幸,他们的生产数据库开了binlog。然后跟他说了下这个可以恢复,让他们去操作一下。结果那边问我能不能帮忙操作,犹豫一下,说可以。
我的操作步骤:
- 找到存放binlog的目录,执行命令
mysqlbinlog mysql-bin.000011 > bak.log
- 找到删除的语句确切时间
- 导出sql
mysqlbinlog --stop-datetime="2019-09-07 17:30:31" mysql-bin.000011 >all.sql
stop-datetime应该是误删操作前一刻时间。
下载all.sql倒入本地数据库,导出误删表,发给他们,让他们,导入生产数据库。后面监测生产数据库和相关业务,无异常即可
反思:
- 导出sql时应该指定数据库
mysqlbinlog --stop-datetime="2019-09-07 17:30:31" --database=test mysql-bin.000893 >all.sql
- 数据库重要数据尽量一天一备份,然后开启binlog,为了减少硬盘空间占用,设置expire_logs_days
- 生产数据库不使用root用户,新建用户,限制drop,truncate等危险操作权限
开启binlog的配置:
#设置日志格式
binlog_format = mixed#设置日志路径,注意路经需要mysql用户有权限写
log-bin = /data/mysql/logs/mysql-bin.log#设置binlog清理时间
expire_logs_days = 7#binlog每个日志文件大小
max_binlog_size = 100m#binlog缓存大小
binlog_cache_size = 4m#最大binlog缓存大小
max_binlog_cache_size = 512m
更多关于binlog的知识请看mysql手册。
mysqlbinlogdev.mysql.com