Mysql

優化導致 tmpdir 填滿“已刪除”文件句柄

  • February 10, 2022

使用 Percona 5.6.34-79.1。儲存引擎是 InnoDB。要優化的表之一是 300Gb 大小。 tmpdir是單獨的分區,datadir是單獨的。

datadir有 500Gb 的空間,所以優化應該可以工作(慢慢來)。 tmpdir的空間小於表大小。

它是一個備用從屬設備,因此沒有任何類型的查詢訪問此數據庫實例,因此未使用 tmpdir 分區。在我執行任何查詢之前,如果我執行lsof | grep -i deleted,我沒有看到任何與mysql相關的東西。

一旦我觸發了優化命令,tmpdir開始填滿,並執行lsof | grep -i deleted顯示大量已刪除但尚未保存的與 mysql 相關的文件。

同樣在datadir上,名為**#sql-ib4586-1246909784.ibd的新文件會形成,但大小仍為幾千字節。

通常 tmpdir 不應該填滿,新文件 (#sql-ib4586-1246909784.ibd) 應該增加佔用數據目錄空間的大小。為什麼這沒有發生?

簡短的回答:做不到。

長答案:有一線希望……

假設優化後的表仍將超過 200GB,您無法OPTIMIZE TABLE在分配的小空間中成功執行。還有其他可以刪除的東西嗎?你能OPTIMIZE先放些小桌子嗎?這樣可以騰出足夠的空間。我假設你有innodb_file_per_table=ON?有多大ibdata1

請提供SHOW TABLE STATUS LIKE 'tablename'

請解釋你為什麼要跑步OPTIMIZE。對於 InnoDB 表很少值得這樣做。

您的另一個選擇是使用 pt-online-schema-change 或類似的方法來重建表。這將在數據目錄上創建表的實際副本,因此您無需填寫 tmpdir - 它也是非阻塞的。

pt-online-schema-change --alter='ENGINE=InnoDB' h=localhost,D=db,t=table

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