2013-01-07 36 views
0

我使用InnoDB數據庫與單個文件配置(在/ var),所以沒有innodb_file_per_table。ibdata1有多少空間是元數據?

在MySQL工作臺,當我查詢使用的空間數據庫,此查詢

SELECT table_schema "Database", sum(data_length + index_length)/1024/1024 "Data  Base Size in MB" 
FROM information_schema.TABLES GROUP BY table_schema; 

它說我有47 GB的數據。 然而ibdata1中的大小爲99 GB ...

我知道ibdata1中,包含了一些其他的事情等該表數據,例如表索引,MVCC(多版本併發控制)數據和表元

所以我的問題是:這是正常的,據說52 GB的ibdata1是medatada和一堆其他的東西?通常,ibdata1文件應包含的表數據旁邊有多少數據?

回答

2

不,你會有那麼多的元數據是不正常的。如果您沒有使用innodb_file_per_table,ibdata文件可能會變得很荒謬,這是很正常的。

當您的數據庫增長時,您的ibdata文件將會增長,但它永遠不會縮小。因此,例如,如果您在一個點上有130 GB的數據並刪除了一堆數據,則在數據清除後,ibdata文件仍將爲130 GB。它只會有一堆「自由空間」,然後用於後續插入。

至於縮小文件,除了清除數據庫和恢復數據外,沒有什麼可以做的。這個答案對如何做到這一點有一些很好的指導。

Howto: Clean a mysql InnoDB storage engine?

您可能還需要考慮使用innodb_file_per_table從表中刪除數據,稍後優化該表實際上將縮小各個表格文件的大小

+0

'innodb_file_per_table'可以引入性能處罰(它對我和其他幾個人都有效)。雖然我同意你的回答(我的+1),但我只是想評論說,轉換innodb_file_per_table可能會導致性能問題(更可能會導致它們承受更重的負載)。 –

+0

@ N.B。 - 我同意,當然可以,但如果您有多個磁盤並將表文件符號鏈接到不同的主軸,它也可以提高性能。所以這是一個混合包。 –

+0

感謝您的回答和評論。任何想法如何解釋空間的巨大差異(47GB的數據VS ibdata1文件大小爲99GB)? 我的sql查詢是否正常? 我還經常刪除不同表中的數百萬行來釋放空間。這可能是一個問題嗎? – Mathieu

2

有一種具有的幾個原因ibdata1中的一堆「額外」空間,但最可能的情況是:

  • 您已刪除過去的大量數據。當你刪除行或刪除表時,儘管文件中有可用空間可用,但文件本身將從不會收縮。
  • 您可能會有過多的撤消日誌空間(或在過去的某個時間點)。撤銷日誌在DELETEUPDATE操作期間保持不變,對於觸摸很多行的非常長時間的操作可能會變得非常大。同樣,如果文件被擴展以保存這個數據,它將會從不會收縮

如前所述,使用innodb_file_per_table可以幫助您解決這個問題,如果您希望定期刪除表並希望獲取磁盤空間。我的博客文章The basics of InnoDB space file layout可能會幫助您瞭解ibdata1文件中包含的內容。

+0

感謝您的解釋。 刪除操作完成後,是否將撤消日誌空間標記爲可用並可用於表數據,還是永久保留用於未來的撤消操作? – Mathieu

+0

一旦完成需要的事務處理,它就自動可用。但是,空間完全釋放可能需要一段時間。 – jeremycole

相關問題