2014-03-05 26 views
4

我在數據庫XXX MySQL的數據表Y,我試圖改變壓縮類型使用無法改變表,表中的「xxx /#SQL-ib265」已經存在

 

    alter table y row_format=compressed key_block_size=8 

過程中途停止了。我在mysql lib目錄中刪除了臨時文件'#sql-ib265.frm和#sql-ib265'並重新啓動服務器。但是, 現在,當我嘗試更改表y(使用上述相同的命令)時,我再次出現錯誤。

 

    ERROR 1050 (42S01) at line 1: Table 'xxx/#sql-ib265' already exists 

我不能刪除表'xxx /#sql-ib265',因爲找不到它。 我該怎麼辦?

編輯 解決方案:

+0

你使用了什麼引擎?innodb? –

+0

@Nishant Shrivastava:是innodb – user3324120

+0

你有沒有試過放下桌子y?儘量擺脫桌子..一旦它被丟棄,innodb字典應該被清理乾淨。 –

回答

3

嘗試重新啓動mysql客戶端用--skip-自動翻版選項,然後再試DROP TABLE。

如果上述方法無效,從MySQL手冊試試這個:

您有一個損壞的InnoDB數據字典..

https://dev.mysql.com/doc/refman/5.0/en/innodb-troubleshooting-datadict.html

問題與臨時表

如果MySQL在崩潰在ALTER TABLE操作的中間,您最終可能會在InnoDB表空間中創建一個孤立的臨時表。使用Table Monitor,你可以看到列出了一個名字以#sql-開頭的表格。如果在反引號內包含名稱,則可以在名稱中包含字符「#」的表上執行SQL語句。因此,您可以使用前面描述的方法像其他孤兒表一樣丟棄這樣的孤兒表。要在Unix shell中複製或重命名文件,如果文件名包含「#」,則需要將文件名放在雙引號內。

+0

我嘗試了所有這些。沒有工作。使用勾號'#sql-ib265'拖放表格說表不存在。顯示錶沒有顯示錶格。 – user3324120

+0

嘗試在你的my.cnf中使用以下命令重新啓動mysql ..確保你有備份的東西備份..萬一事情變得越來越糟糕.. http://dev.mysql.com/doc/refman/5.5/en /forcing-innodb-recovery.html [mysqld] innodb_force_recovery = 1 –

+0

可能作爲最後一個選項..備份您的數據庫並嘗試刪除整個數據庫..然後恢復您的數據..並創建您需要的表? –

0

另外我使用root登錄進行恢復作業但失敗。然後我chown該.frm文件來滿足MySQL服務的所有者,併成功。

2

有兩種方法可以解決這個問題。

  1. 正如其他答案建議,official MySQL documentation suggests刪除特製表。但請注意,在> = 5.1版本中,您需要在表名前加上#mysql50#
  2. 移動(使用RENAME TO)所有的好表到臨時數據庫中,刪除&重新創建原來的表,然後將表移回。有關詳細信息,請參閱a blog post
+0

我手動嘗試了[博客]中提到的步驟(https://twindb.com/resolving-error-1050-42s01-at-line-1-表已存在/)和它的工作! – sactiw

+0

好。不要忘記+1;) – akuzminsky

0

對於任何人仍然面臨這個問題,我只是跟着下面的步驟來解決它,這(至少對我來說)似乎比其他解決方案遠遠低於艱鉅:

  1. 使用mysqldump備份數據庫及其所有數據。
  2. 刪除並重新創建數據庫。
  3. 從(1)中生成的文件中重新加載數據庫及其所有模式。

因爲無論如何孤立的表都是隱藏的,所以它們不會被備份,所以最終會得到一個沒有它們的數據庫。無論如何,我的所有程序/函數都是腳本化的,因此能夠輕鬆恢復它們 - 如果不這樣做,請確保使用--routines參數來轉儲它們。

我的轉儲文件大約爲1.5GB(因此它不是很小),而且整個過程在幾分鐘內完成。

0

我有同樣的錯誤。我通過在文件開始處切換表格的順序來修復它:

DROP TABLE IF EXISTS table_name; 

對於每個表格重複該行。帶有外鍵的表需要在具有它們指向的主鍵的表之前被刪除。