mysql - 无法删除不存在的表,无法创建存在的表

mysql - 无法删除不存在的表,无法创建存在的表

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

选择从备份中恢复,数据库被删除,并加载了备份 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'

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

我尝试了多种恢复方法,包括将转储导入新数据库(顺利完成)、关闭 mysql 并复制相关的 .frm 和 .ibd 文件,然后使用idb连接尝试附加这个“已知良好”的版本:

... 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* 可能是清理这个“幽灵”引用的唯一方法。

我的问题: 有什么方法可以清理这些幽灵引用,以便从备份中恢复表?

答案1

最后我选择从备份中恢复所有数据库,

  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

我将把这个答案留在这里,问题在下周不予接受;我希望某人可以提供不需要重建整个 ibdata 的解决方案。

相关内容