一、系统环境配置情况
系统环境: Linux 2.6.32-754.3.5.el6.x86_64
数据库环境:mysql 5.7.23
日志格式: MIXED
gtid:启用
备份策略:利用xtrabackup每天凌晨00:00自动完全备份
二、模拟场景
某技术人员在上午10点不小心trancate了一个表,上午11点发现了异常需紧急恢复被删除的数据。
三、数据恢复思路
因为凌晨全备后到误操作这段时间(凌晨00:00到上午10:00)以及误操作到被发现准备紧急恢复这段时间(上午10:00到上午11:00),数据库都可能发生了更新,所以必须依靠全备数据配合binlog来做数据恢复,还需要注意binlog在这两个时间段内是否发生滚动的情况。
四、实操(binlog文件未发生滚动的情况)
1、停止mysqld服务
service mysqld stop
2、利用mysqlbinlog命令将对应的binlog文件导出为sql文件
mysqlbinlog log-bin.000034 > log-bin34.sql
3、找出truncate语句对应的内容,并将其删除,如图:
4、利用当天凌晨全备的xtrabackup_info信息找到备份时对应的pso值,如图:
5、在上述的log-bin34.sql文件中找出end_log_pos 6044对应的位置并删除该值以及该值之前的所有语句,如图:
6、利用innobackupex正常恢复数据库状态到全备那一刻的所有数据
清除mysql数据目录(最好备份):
rm –rf /mysql/data/*
prepare操作:
innobackupex --apply-log --use-memory=4G /backup/2018-12-19_00-00-00/
全备恢复(恢复完后要把数据目录的所属用户和组设置回mysql):
innobackupex --datadir=/mysql/data --copy-back /backup/2018-12-19_00-00-00/
7、启动mysql直接执行上述处理好的sql文件即可恢复数据
service mysqld start
mysql –utest –p123456 –e 'source /log-bin34.sql'