####################################
需求场景:
业务误操作时刻在路上,那么数据恢复是件常见的事,我们通常通过innobackupex或xtrabackup进行数据库实例的全量备份,遇到需要进行数据恢复时,我们就将该备份拷贝到测试机上进行恢复,这对于一般的中小型数据库实例而言,拷贝数据花不了多少时间,还是很方便的,
但是当数据库实例的数据量很大时,这个时候拷贝几百G,甚至几个T的数据,则是非常耗时。那么能不能只拷贝误操作的那几张表的数据呢,答案是可以,通过拷贝误操作的那几张表的ibd文件即可完成,下面就通过ibd文件进行数据恢复。[前提是数据库实例开启了每张表都是一个独立表空间,即查看这个全局变量:innodb_file_per_table=1]
假设线上集群的实例为10.10.10.11:3306,备份机所在机器为10.10.10.22,业务误操作了线上apple库的ipad表,测试机的mysql实例为10.10.10.33:3306
1,登录10.10.10.11:3306,查看apple.ipad表的表结构,同时预估一下数据量:
mysql> show create table apple.ipad \G;
mysql> select count(*) from apple.ipad ;
2,在测试机实例10.10.10.33:3306上创建相同的库和表,即创建apple和ipad表:
mysql> create database apple; mysql> use apple; mysql> create table ipad (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,address varchar(255) NOT NULL,blob_name blob,PRIMARY KEY (id),KEY idx_name (name)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4; # 执行后会在apple数据库目录下面新增两个文件:ipad.ibd和ipad.frm文件
mysql> alter table ipad discard tablespace; # 执行后,该实例的apple库的ipad表只剩下数据定义文件ipad.frm,表空间文件ipad.ibd已被删除
3,拷贝备份机10.10.10.22上备份对应的表空间文件apple/ipad.ibd到测试机10.10.10.33:3306的apple数据库目录下:
# 任意地方均可执行,网络通即可: shell> scp work@10.10.10.22:/home/work/2021/data/apple/ipad.ibd work@10.10.10.33:/home/work/mysql_3306/data/apple/ # 在测试机10.10.10.33上执行: shell> chown -R work:work /home/work/mysql_3306
# 如果是拷贝正在运行的实例上的ibd文件则需要在该实例上执行: mysql> flush tables;lock tables apple.ipad read;
4,登录测试机10.10.10.33::3306导入表空间数据:
mysql> alter table apple.ipad import tablespace;
5,经过上面4个步骤已经将误操作的表的备份加载到了测试机上的数据库实例中,如果还需要将其恢复到该备份时刻后面的任意一刻,则需要通过配置复制过滤到线上集群的实例,且线上集群的某个实例在该备份时刻后到现在的的binlog还存在,这个步骤就省略了
#########################