Mysql

mysql 5.5 損壞 - 缺少臨時表

  • August 7, 2019

我們的一個 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 文件仍然存在,則:

  1. 刪除缺少 .ibd 的表,將表名括在反引號中。

否則,您將需要在另一個 MySQL 伺服器或實例上創建一個模擬 .frm 文件。以下是步驟:

  1. 嘗試記住或查看二進制日誌是否可以提示您可能正在更改的表。
  2. 轉到具有相同版本 MySQL 的另一個 MySQL 伺服器或實例。
  3. 創建一個具有匹配架構的空表,將表名括在反引號中。
  4. 將生成的 .frm 文件複製到缺少 .ibd 文件的位置。在 Unix shell 中,用雙引號將文件名括起來。
  5. 啟動崩潰的 MySQL 伺服器。
  6. 刪除缺少 .ibd 的表,將表名括在反引號中。

這些說明也可以在 MySQL 手冊中找到,如錯誤消息中所述,形式有所不同:InnoDB 數據字典操作故障排除

引用自:https://dba.stackexchange.com/questions/16859