Mysql

大表上的更改會消耗所有磁碟空間

  • November 22, 2019

我在 Ubuntu 19 上執行 MySQL 8。我有一個 543G 的表,我必須添加一個新列和索引。我從新專欄開始:

alter table hugeTable add column newCol tinyint(1) after existingColumn;

執行幾個小時後,我收到一個錯誤,大致如下:

... table 'hugeTable' is full

我環顧四周,沒有發現任何不好的地方——我還剩下大約 294G 的磁碟空間。查看錯誤日誌,很明顯發生了什麼——它正在生成一個不斷增長的#sql 文件。我再次啟動它以了解它的增長速度,並且在短短一個小時內就超過了 35G:

-rw-r----- 1 mysql mysql  35G Nov 19 21:53 '#sql-ib1124-819861495.ibd'

並迅速成長。

所以真正的問題是,有沒有辦法解決這個問題?我有這個表的備份,所以可以冒險關閉它並執行更新而不使用撤消、#sql 等文件。或者,我是否必須使用 sed 來修改備份文件並使用它?

利用新的、更好的 ALTER 方法:

SET SESSION alter_algorithm='INSTANT' ;
ALTER TABLE foo ADD COLUMN ... ;  -- without the AFTER

SET SESSION alter_algorithm='NOCOPY' ;
ALTER TABLE foo ADD INDEX name(col1, col2);

如果這些不能用請求的算法完成,他們會在不執行 ALTER 的情況下給你一個錯誤。從那裡,你可以決定做什麼。

“標誌”上的單列索引很少有用。也許您不需要新索引?

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