2016-07-07 65 views
0

我有一個C#應用程序在MySQL 5.7服務器上執行一些數據庫操作。一旦整個系統陷入困境,我不得不對其進行硬重置。當涉及到特定的表讀/寫操作時,數據庫服務器崩潰。窗戶日誌顯示MySQL服務器崩潰,InnoDB超出表空間範圍

InnoDB: Trying to access page number 286720 in space 29, 
space name myInstance/myTable, which is outside the tablespace bounds. 
Byte offset 0, len 16384, i/o type read. 

我試圖用mysqlcheck --repair,但它失敗,因爲note : The storage engine for the table doesn't support repair

我讀過一些建議是說我應該在恢復模式啓動MySQL,所以我加了

[mysqld] 
innodb_force_recovery=4 

my.ini配置文件,於是我應該能夠使用mysqldump出口受影響的數據庫表。但不幸的是,我不是。

mysqldump: Error 2013: Lost connection to MySQL server 
during query when dumping table `myTable` at row: 1246 

編輯:

我再次檢查錯誤日誌,發現許多條目說

[ERROR] C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe: 
The table 'myTable' is full 

我在服務器上運行一個Windows 32位操作系統與NTFS格式化分區。 myTable.ibd文件大小約爲4.5 GB,對於Win32 w/NTFS,檢查C.10.3 Limits on Table Size指出文件大小限制爲「2TB(可能更大)」。 雖然檢查我的錯誤的原因,我發現唯一可能的原因是一個完整的InnoDB表空間。解決方案可能是「更改InnoDB重做日誌文件的數量或大小」,儘管一致性對我來說有點模糊。不過,我將重做日誌文件的大小從48M增加到了100M。但沒有任何改變。

如果我執行SQL select * from myTable order by Id desc,服務器會立即崩潰。錯誤日誌條目與上述完全相同。

我查看了章節15.7.1 Resizing the InnoDB System Tablespace,發現innodb_data_file_path未明確指定。

任何想法我現在可以做什麼?非常感謝!

+0

先生,我有完全相同的問題。你能告訴我你是如何解決這個問題的?我第一次得到'表已滿'錯誤,然後服務器崩潰在每個查詢事件mysqldump。我嘗試了從1到6的所有錄製選項。 –

+0

在http://bugs/mysql.com發佈錯誤報告 –

+0

通過切換整個DBMS解決了問題。關於這些壞消息我很遺憾。 – marrrschine

回答

0

InnoDB無法修復表空間中的損壞。這從來沒有實施過,mysqlcheck不會有任何幫助。

腐敗是在空間ID 29這是表myInstance.myTable。要修復它,您需要使用innodb_force_recovery轉儲此表中的所有記錄。嘗試從4到6的所有值,直到MySQL不崩潰。然後刪除表並重新加載轉儲。

如果MySQL即使使用innodb_force_recovery=6也會崩潰,請從備份中恢復表。

如果您沒有備份 - 使用腳本http://bazaar.launchpad.net/~percona-dev/percona-data-recovery-tool-for-innodb/trunk/view/head:/fetch_data.sh。它會盡可能多地獲取記錄。

+0

爲了澄清,'innodb_force_recovery'是配置文件中的一個服務器選項。請參閱https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html –