mysql – 不能删除表不存在,不能创build表存在

服务器崩溃后,我们有一个特定的表引用一些非常奇怪的问题。

select从备份恢复数据库已被删除,并且加载了一个备份SQL转储,只有在创build表时发生cache_content错误“table already exists”

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'

奇怪的删除表,删除.frm而不是.ibd文件(如果存在),创build表将创build.ibd文件,但不是.frm文件。

我已经尝试了许多方法来恢复,包括将转储导入到一个新的数据库(完成没有问题),closuresmysql并复制相关的.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 *可能是清理这个“鬼”参考的唯一方法。

我的问题:有没有什么办法来清理这些ghost引用以允许从备份恢复表?

最后,我select从备份中恢复所有的数据库,

  1. mysqldump --all-databases --triggers > /path/to/dumpfile.sql
  2. service mysql shutdown
  3. rm -rf /path/to/datadir && mkdir /path/to/datadir && chown mysql.mysql /path/to/datadir
  4. iptables -I INPUT -p tcp --dport 3306 -j REJECT && service mysql start
  5. mysql_install_db --datadir=/path/to/datadir
  6. mysql < /path/to/dumpfile.sql
  7. 从单个备份中删除并恢复在1期间不完整的任何数据库
  8. service mysql restart && service iptables restart

我在这里留下这个答案,下个星期不接受这个问题; 我希望有人可以提供一个解决scheme,整个ibdata不需要重build。