MySQL误删除表的内容恢复数据

问题描述:

        升级配置文件配置错误,kafka地址指向的是测试环境,同步脚本拉取测试环境数据把线上环境的topic和flume相关信息删除。系统没有全备份但是二进制日志是全的;

问题定位:

1、mysql没有general log

2、查看前一个binlog文件,有删除语句

3、 查看是否为程序删除,找到对应语句,通过日志关键字在程序中查找

grep /runtime/log/201812/10.log "DELETE FROM `rtime_flume_info`" 

分析代码和日志url地址,确定为同步时接口地址配置出错,查看当前配置文件,果然配置出错,修改为正确的配置。

解决步骤:

1、全量备份当前数据库状态,用于修改出错恢复到当前状态。

mysqldump -uroot -p dbname > dbname_20181211.sql 

2、查看binlog文件是否完整

mysqlbinlog --no-defaults mysql-bin.000001 > 01.sql 

  可以找到create db 语句

mysqlbinlog --no-defaults mysql-bin.000010 > 10.sql

mysql-bin.000010 为最后的一个binlog文件,找到删除操作对应的pos位置为 51313959,所以通过执行一遍binlog文件可以恢复到删除操作之前的数据库状态

3、在测试环境起一个mysql服务

yum install mysql-community-server

yum install mysql-community-client

修改mysql配置文件,开启binlog

[mysqld] 下面增加两行

log-bin=mysql-bin

binlog_format=MIXED

启动mysql

service mysqld start

将线上环境的binlog文件拷贝到测试环境(测试环境和线上环境网络不通 否则也可不用拷贝过去)

mysqlbinlog -d dbname --stop-position=51313959 mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.000004 mysql-bin.000005 mysql-bin.000006 mysql-bin.000007 mysql-bin.000008 mysql-bin.000009 mysql-bin.000010 | mysql -uroot -p

4、查看测试环境被删除的topic和flume是否恢复

mysqldump -uroot -p db_yuntu.tb1 > tb1.sql

mysqldump -uroot -p db_yuntu.tb2 > tb2.sql

将sql文件拷贝到线上环境

truncate table tb1 

truncate table tb2 

source tb1.sql 

source tb2.sql

优化:

1、优化 升级需要停止同步脚本 配置文件要仔细检查

2、增加定期全量备份和增量备份 mysqldump、xtrabackup,xtrabackup恢复性能更好

3、binlog 设置优化 

my.cnf 中增加

expire_logs_days = 7 

max_binlog_size = 1G

[mysqldump]:

全量备份脚本:

#!/bin/bash

#use mysqldump to fully backup mysql data



bakdir=/var/backup/mysql/full

logfile=/var/backup/mysql/full/bak.log



date=`date +%Y%m%d`

begin=`date +"%Y年%m月%d日 %H:%M:%S"`

cd ${bakdir}

dumpfile=${date}.sql

tgzdumpfile=${dumpfile}.tgz

#--all-databases 备份所有库

#--lock-all-tables 为所有表加锁

#--routinge 存储过程与函数

#--triggers 触发器

#--events 记录事件

#--master-data=2 在备份文件记录当前二进制日志的位置,并且为注释的,1是不注释的,在主从复制中才有意义

#--flush-logs 日志滚动一次

mysqldump -uroot -p123456 --all-databases --lock-all-tables --routines --triggers --events --master-data=2 --flush-logs > ${dumpfile}

tar -czvf ${tgzdumpfile} ${dumpfile}

rm ${dumpfile}

end=`date +"%Y年%m月%d日 %H:%M:%S"`

echo 开始: ${begin} 结束: ${end}" "${tgzdumpfile} 完成 >> ${logfile}

增量备份脚本:

#!/bin/bash

#mysql binlog 增量备份

bakdir=/var/backup/mysql/daily

bindir=/var/lib/mysql

logfile=/var/backup/mysql/daily/bak.log

binfile=/var/lib/mysql/mysql-bin.index



mysqladmin -uroot -p123456 flush-logs



count=`wc -l ${binfile} | awk '{print $1}'`

next=0



for file in `cat ${binfile}`

do

basename=`basename ${file}`

next=`expr ${next} + 1`

if [ ${next} -eq ${count} ]

then

echo ${basename} skip! >> ${logfile}

else

dest=${bakdir}/${basename}

if (test -e ${dest})

then

echo ${basename} exist! >> ${logfile}

else

cp ${bindir}/${basename} ${bakdir}/

echo ${basename} copying >> ${logfile}

fi

fi

done



echo `date +"%Y年%m月%d日 %H:%M:%S"` ${next} backup 完成 >> ${logfile}

[xtrabackup]

http://www.cnblogs.com/zhoujinyi/p/4088866.html

需要依赖 perl-dbd-mysql

perl-DBD-MYSQL 下载地址

http://rpm.pbone.net/index.php3/stat/4/idpl/26645737/dir/centos_7com/perl-DBD-MySQL-4.023-5.el7.x86_64.rpm.html

 

你可能感兴趣的:(MySQL)