如何恢复被drop或truncate表的数据


如果在线上环境误操作删除或清空了不该删除的表,常用的方式是冷备+增量binlog恢复表数据,这个通用方法大家都会,不在本篇讨论范畴。
这篇文章主要介绍在没有冷备的情况下如何利用binlog恢复表数据
前提条件:必须具备表创建以来所有的binlog;

下图是能完全恢复表dba.kian的原理图:


如何恢复被drop或truncate表的数据_第1张图片

从图可以看出,只要我们具备从表创建以来所有的binlog,我们就可以完全恢复表在删除之前的表数据


下面以恢复表dba.kian数据为例看看整个恢复步骤:

1、约定:
①、具备表创建以来所有的binlog的机器我们称为主机;
②、新起的用来恢复的实例我们称为备机

2、起一个用来恢复的空实例
①、修改配置文件my.cnf中的配置
#只应用需要恢复表的binlog,这样可以减少大量的IO操作,大大加快恢复的速度
replicate-wild-do-table = dba.kian
②、初始化系统权限表
/usr/local/mysql/scripts/mysql_install_db --defaults-file=/data/mysqldata/my.cnf  --basedir=/usr/local/mysql --datadir=/data/mysqldata --user=mysql
③、启动3307实例
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysqldata/my.cnf &

3、在主机给备机授予复制权限
grant replication slave on *.* to bak@备机 identified by 'bak';

4、在主机找到创建表所在的binlog文件
如我测试环境的是:binlog.000003

5、在主机找到执行drop table或truncate table操作前一个事务结束的binlog文件和对应的position
如我测试环境的是:binlog.000008 310

6、在备机建好需要恢复的库
create database dba;

7、从第一个binlog.000003的开头开始追,停到第4部找到的点
change master to  master_host='主机',master_user='bak',master_password='bak',master_log_file='binlog.000003',master_log_pos=107,master_port=3306;
START SLAVE UNTIL MASTER_LOG_FILE='binlog.000008',MASTER_LOG_POS=310;

8、待复制追到指定的binlog的指定的pos,表就恢复了

总结:只要我们具备从表创建以来所有的binlog,就能恢复被删除表的所有表数据


你可能感兴趣的:(MySQL)