mysql误删一张表
小明 Lv6

大家开发过程中,难免会存在误删数据库表的情况,可见,数据库的备份机制需要引起大家的重视,本文主要介绍一下,拥有备份文件(.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
    • 版本的解决办法
      image
      究其原因是从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
      因此我们需要重新建一张表
  1. 在新库中删除对应的表,并删除新库中存在的数据文件(/var/lib/mysql/test);
  2. 创建新的表结构并指定行格式为compact。
    1
    2
    3
    CREATE TABLE `tablename` (
    ...
    ) ROW_FORMAT=COMPACT
    之后的步骤继续执行上面的步骤
 评论