服务器崩溃后,我们在某个特定表引用方面遇到了一些非常奇怪的问题。
选择从备份中恢复数据库被删除并加载备份 SQL 转储,只有这在创建表时失败,cache_content
错误为“表已存在”
mysql> create table cache_content( id int NOT NULL DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ERROR 1005 (HY000): Can't create table '****.cache_content' (errno: -1)
mysql> drop table cache_content;
ERROR 1051 (42S02): Unknown table 'cache_content'
奇怪的是,drop table 删除了 .frm 而不是 .ibd 文件(如果存在),create table 将创建 .ibd 文件而不是 .frm 文件。
我已经尝试了多种恢复方法,包括将转储导入新数据库(顺利完成),关闭 mysql 并复制相关的 .frm 和 .ibd 文件,然后使用idbconnect尝试附加此“已知良好”版本:
...
Space id: 1952673645 (0x74636F6D)
Next record at offset: 74
TABLE_ID of `****/`.`cache_content` can not be 0
...
检查 information_schema 中的相关表,我可以看到是这样的,并且 TABLESPACE 已分配给 0
mysql> select * from INNODB_SYS_TABLES where `SCHEMA`="*****";
+----------+--------+--------------------------+------+--------+-------+
| TABLE_ID | SCHEMA | NAME | FLAG | N_COLS | SPACE |
+----------+--------+--------------------------+------+--------+-------+
...
| 19791 | ***** | cache_content | 1 | 9 | 0 |
+----------+--------+--------------------------+------+--------+-------+
N rows in set (0.01 sec)
mysql> select * FROM INNODB_SYS_INDEXES where TABLE_ID=19791;
+----------+--------+----------+------+----------+---------+-------+
| INDEX_ID | NAME | TABLE_ID | TYPE | N_FIELDS | PAGE_NO | SPACE |
+----------+--------+----------+------+----------+---------+-------+
| 7919 | expire | 19791 | 0 | 1 | 311158 | 0 |
+----------+--------+----------+------+----------+---------+-------+
1 row in set (0.00 sec)
服务器版本:Percona-Server-server-55-5.5.27-rel28.0.291.rhel6.x86_64
现在,从我读过的文章中,我相当确定删除 ibdata1 ib_logfile* 可能是清理这个“幽灵”引用的唯一方法。
我的问题:有什么方法可以清除这些幽灵引用以允许从备份中恢复表?