2014-03-24 51 views
0

Mysql 5.05託管一箇舊的應用程序,仍然從用戶獲得很多的愛。不幸的是,除了絕對必要之外,我什麼也不是黑客行爲,除非絕對必要,否則我對於安全遷移到新版數據庫的技能非常猶豫。我們正在購買一個新的應用程序來接管舊應用程序的責任,但可能是一年左右。我可以在mysql中創建索引而不調用創建與目標表大小相同的臨時表嗎?

反正我是打補丁應用程序的一天,並添加一列一個表,命令花了一段時間才能完成,在此期間,幾乎佔滿了我的車的託管數據文件。 (表格大概是25G)我相信這是創建臨時表的功能。由於我不清楚的原因,在列添加後,空間沒有變得空閒。即我失去了大約25G的磁盤空間。我相信(?)這是由於數據庫是用單個數據文件創建的;我並不確定,但我確實知道我必須在其他地方騰出一些空間才能使車輛進入可操作狀態。

所有的說法,我已經添加了列,但它沒有索引沒有價值的應用程序。我暫緩添加索引,試圖找出它是否會在創建索引時創建另一個大量持久的「臨時」表。任何人都可以在那裏給我的洞察:

  1. 將一個創建索引和或alter table在創建臨時表相同,大小與現有表的create index語句的結果?

  2. 當我添加列時,如何恢復添加到ibdata1的空間?

任何和所有的建議,非常感謝。

回答

1
  1. MySQL prior to version 5.1 adds/removes indices on InnoDB tables by building temporary tables。這是非常緩慢和昂貴的。唯一的解決辦法是將MySQL升級到5.1,或者用例如mysqldump,放下它,用新索引重新創建它,然後從轉儲中恢復它。

  2. 你不能收縮ibdata1可言。你唯一的解決方案是從頭開始重建。這是可能的configure MySQL so it doesn't use one giant ibdata1 file for all the databases - 閱讀答案,它將解釋如何配置MySQL/InnoDB,所以這不會再發生,以及如何安全地轉儲和重新創建所有數據庫。

最終,你可能想

  • 使數據庫
  • 升級的一個完整的轉儲到MySQL 5.1或更高版本
  • 打開InnoDB的一個文件,每個表的模式
  • 恢復轉儲。
+0

嗨斯圖爾特 - 感謝您的完整,但令人沮喪的反應。考慮到我*只是*向ibdata1文件添加了25G的temp(?)空間,現在會創建索引給我*另一個* 25G的空間分配,或者我剛剛創建的空間是否會用於另一個臨時調整? – user1911071

+0

你現在在'ibdata1'文件裏面有25GB的「空閒」空間,只是InnoDB不會將它返還給文件系統。因此,重複索引過程將使用該文件內的臨時表的25GB可用空間,然後在索引添加後釋放它。 –