mysql误删一张表
大家开发过程中,难免会存在误删数据库表的情况,可见,数据库的备份机制需要引起大家的重视,本文主要介绍一下,拥有备份文件(.frm 和 .ibd)的情况下,如何快速恢复该表。
场景
作者使用的正式数据库是阿里云的rds,一天午后,使用navicat工具误操作删除了一张日志表,但幸运的是,设置了阿里云的备份机制。
步骤
- 首先从阿里云备份记录中下载最新的备份tar或者zip文件,然后解压会得到数据库中的文件,找到该日志表对应的.frm和.ibd。
- 查看被删除数据库版本和恢复至的数据库版本是否一致,如果一致请继续,如果不一致,请查看下面的版本不一致问题如何解决;
- 新建一个数据库(名称任意),在该数据库中新建一张表(名称与你要恢复的表名称相同),最好结构也有,数据无所谓,引擎必须是innode,然后删除新建的表空间:
1
2-- 删除该表的.idb
ALTER TABLE table_name DISCARD TABLESPACE; - 再将该表对应的 .ibd 备份文件替换新表的.ibd文件(/var/lib/mysql/test 这是test数据库的文件目录),执行如下命令
1
2-- 修改权限
chown mysql:mysql tablename.ibd - 重新导入表空间
1
alter table <table name> import tablespace;
这一步可能出现版本问题,因为之前版本的数据库是5.6,新的数据库是5.7- 版本的解决办法
究其原因是从MySQL5.7版本中innodb_file_format参数(该参数表示innodb文件格式)的默认值发生了变化,在MySQL5.7以前innodb_file_format参数默认是Antelope,而默认的行格式是(ROW_FORMAT)是COMPACT,从MySQL5.7以后版本innodb_file_format默认值为Barracuda,默认的行格式是(ROW_FORMAT)是DYNAMIC,所以需要在创建表结构时指定row_format=compact
因此我们需要重新建一张表
- 版本的解决办法
- 在新库中删除对应的表,并删除新库中存在的数据文件(/var/lib/mysql/test);
- 创建新的表结构并指定行格式为compact。之后的步骤继续执行上面的步骤
1
2
3CREATE TABLE `tablename` (
...
) ROW_FORMAT=COMPACT
评论