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不需要重建的解決方案。

相關內容