暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

MySQL表被drop如何恢复?

原创 凡尘dba 2022-11-03
2503

一、使用限制和说明

1、MySQL5.6.6及以上版本。

1、主从innodb_file_per_table必须设置为on。

2、必须是innodb表,非分区表。

4、表结构必须一致。

5、不支持外键约束。


二、原理

利用MySQL表空间传输特性,即transportable tablespace特性,允许表空间从一个实例移动到另一个实例上,将.cfg 和 .ibd文件复制过去,用于再导入时更新表元数据。


三、拿备份恢复后的ibd文件恢复

恢复单表备份

shell>  xtrabackup --prepare --export --target-dir=/backup/base_20220304


需恢复的表名为aaa,在test库下,从备份文件中物理拷贝过来aaa.ibd文件

mysql>  create table aaa; 


mysql>  alter table aaa discard tablespace;


shell>  cp /backup/base_20220304/aaa.cfg  /opt/mysql3306/data/test/aaa.cfg


shell>  cp /backup/base_20220304/aaa.ibd  /opt/mysql3306/data/test/aaa.ibd


shell>  chown mysql.mysql aaa.* && chmod 644  aaa.*


mysql>  alter table aaa import tablespace;    ----时间长短受ibd文件大小的限制


四、拿实例运行中的ibd文件恢复,例如延迟从库

实例a:待恢复

实例b:正常状态


1、实例a:

mysql>  alter table aaa discard tablespace;


2、实例b:执行flush tables ... for export语句静默表并生成.cfg元数据文件。flush tables ... for export 这个执行之后,会话不能退出,否则cfg自动消失。


mysql>  flush tables aaa for export;


shell>  cp /opt/mysql3306/data/test/aaa.cfg  /tmp         ----备份


shell>  cp /opt/mysql3306/data/test/aaa.ibd  /tmp


mysql>  unlock tables;


3、scp复制实例b上tmp目录的.ibd和.cfg文件到实例a上。


4、实例a:

mysql>  alter table aaa import tablespace;


五、注意事项

1、上述操作务必不能删除.frm文件,如需删除,请提前cp一份。

2、必须确保双方ibd文件对应的表结构是一致,否则后面恢复就很麻烦,甚至需要重启实例恢复。


六、复杂问题

1、例如前一天全备后,第二天做过加字段,改换过字段顺序;或者拿测试环境表结构恢复,之后才发现实际表结构与生产不一致;

答:如果拿来恢复的ibd文件对应的表结构与实际要恢复的表结构不一致时,因为没有提前发现,这时执行alter table aaa import tablespace会报错某些字段不一致,不要慌,drop table aaa,然后创建与拿来恢复的ibd文件一样的表结构,重新恢复。如果这时新建的表还是与拿来恢复的ibd文件表结构不一致,后续恢复如遇到报错就需要重启实例恢复。


2、表被drop后,没有保留表结构,或者不记得表结构了。

答:MySQL官方下载并安装mysqlfrm,可以恢复ibd文件对应的表结构。

[root@test mysql-utilities-1.6.5]#tar -zxvf mysql-utilities-1.6.5.tar.gz

[root@test mysql-utilities-1.6.5]#cd mysql-utilities-1.6.5/

[root@test mysql-utilities-1.6.5]# ll

total 140

-rw-r--r-- 1 mysql mysql 37814 Mar  3 09:48 CHANGES.txt

-rw-r--r-- 1 mysql mysql 17987 Mar  3 09:48 LICENSE.txt

-rw-r--r-- 1 mysql mysql   928 Mar  3 09:48 PKG-INFO

-rw-r--r-- 1 mysql mysql 34819 Mar  3 09:48 README.txt

drwxr-xr-x 4 root  root     36 Mar  3 09:48 build

drwxr-xr-x 3 mysql mysql    17 Mar  3 09:48 docs

-rw-r--r-- 1 mysql mysql  6680 Mar  3 09:48 info.py

-rw-r--r-- 1 root  root   5597 Mar  3 09:48 info.pyc

drwxr-xr-x 4 mysql mysql    79 Mar  3 09:48 mysql

drwxr-xr-x 2 mysql mysql  4096 Mar  3 09:48 scripts

-rw-r--r-- 1 mysql mysql 14232 Mar  3 09:48 setup.py

drwxr-xr-x 2 mysql mysql  4096 Mar  3 09:48 unit_tests



[root@test mysql]# python setup.py build

[root@test mysql]# python setup.py install



[root@test mysql] mysqlfrm --diagnostic  /opt/mysql3306/data/test.frm
复制

注意:这样恢复的表结构可能字段类型和长度与原表不一样,但字段名和顺序肯定一致,可以参考之前的表结构字段类型和长度,人工组织下表结构。



全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

❤ 欢迎关注我的公众号【凡尘读书楼】,一起学习新知识!
————————————————————————————
公众号:凡尘读书楼
墨天轮:https://www.modb.pro/u/399450
知识星球 :凡尘dba人生有限公司
————————————————————————————

最后修改时间:2024-07-07 19:08:38
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论