【1】故障模拟准备环境
这里以innodb为例
【1.1】配置参数
开启独立表空间 innodb_file_per_table;
【1.2】构建测试数据
create database test;
create table a(id int,num int);
insert into a values(1,11),(2,12);
【2】故障模拟
【2.1】在业务正在运行的情况下,手动删除 test库 下的 a.frm
【2.2】删除完之后,会发生什么?
如上图所示可知(在业务还在跑的情况下):
无论是对于数据表的增删查改,还是数据结构的增删查改。统统失效,连 information_schema.columns 都查不到。
【3】彻底删除这个表
【3.1】保留这个表数据(要是真不想要了,这步也可以不用做)
cp a.ibd a_bak.ibd
【3.2】随便找个其他表的frm文件重命名成故障表的frm文件
cp test1.frm a.frm
【3.3】加上权限,如下图可以发现是root创建的
chown -R mysql:mysql /data/mysql
【3.4】查看表与表结构,然后删除表
我们可以发现已经有了,但很明显,表结构不是我们a表的结构,而是test1表结构。弄好了之后,发现我们可以删除表了!
【4】恢复使用
【4.1】去其他库构建相同名称表
create database test1;
如何获取表结构?只能靠着记忆,或者去binlog里看看有没有,最靠谱的当然是去备份里找。