Mysql
mysql 5.5 損壞 - 缺少臨時表
我們的一個 mysql 實例崩潰並且無法啟動:
120422 10:04:13 InnoDB: Error: trying to open a table, but could not InnoDB: open the tablespace file './databasename/#sql-29f6_45.ibd'! InnoDB: Have you moved InnoDB .ibd files around without using the InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE? InnoDB: It is also possible that this is a temporary table #sql..., InnoDB: and MySQL removed the .ibd file for this. InnoDB: Please refer to InnoDB: http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting-datadict.html InnoDB: for how to resolve the issue.
我不明白應該怎麼做才能從 TABLESPACE 中刪除這個臨時表。
我應該如何進行?
很少有 InnoDB 表深深卡在 ibdata1 中的情況,儘管如此,您仍必須嘗試強制 mysql 啟動。
嘗試在 /etc/my.cnf 中使用innodb_force_recovery (選項值 1-6)
[mysqld] innodb_force_recovery = 1
然後重啟mysql。
這至少應該允許一個 mysqldump
mysqldump -u... -p... --routines --triggers --all-databases > /root/MySQLData.sql
mysqldumped所有數據後,刪除
innodb_force_recovery
然後,執行 InnoDB 的完整清理,如下所示
service mysql stop mv /var/lib/mysql /var/lib/mysql_old mkdir /var/lib/mysql mkdir /var/lib/mysql/mysql cp /var/lib/mysql_old/mysql/* /var/lib/mysql/mysql/. chown -R mysql:mysql /var/lib/mysql service mysql start mysql -u... -p... < /root/MySQLData.sql
之後
service mysql start
,會創建新的 InnoDB 文件(ibdata1、ib_logfile0、ib_logfile1)試一試 !!!
在進行任何恢復步驟之前,請務必進行備份!恢復有時可能會進一步損壞您的數據庫。
檢查您的數據庫文件的權限或所有權是否可能已更改,這不允許 MySQL 打開必要的表空間文件。
您可能會遇到臨時 .ibd 文件被 MySQL 刪除,但 MySQL 在完成清理之前崩潰的情況。
如果 .frm 文件仍然存在,則:
- 刪除缺少 .ibd 的表,將表名括在反引號中。
否則,您將需要在另一個 MySQL 伺服器或實例上創建一個模擬 .frm 文件。以下是步驟:
- 嘗試記住或查看二進制日誌是否可以提示您可能正在更改的表。
- 轉到具有相同版本 MySQL 的另一個 MySQL 伺服器或實例。
- 創建一個具有匹配架構的空表,將表名括在反引號中。
- 將生成的 .frm 文件複製到缺少 .ibd 文件的位置。在 Unix shell 中,用雙引號將文件名括起來。
- 啟動崩潰的 MySQL 伺服器。
- 刪除缺少 .ibd 的表,將表名括在反引號中。
這些說明也可以在 MySQL 手冊中找到,如錯誤消息中所述,形式有所不同:InnoDB 數據字典操作故障排除。