Mysql
大表上的更改會消耗所有磁碟空間
我在 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 的情況下給你一個錯誤。從那裡,你可以決定做什麼。
“標誌”上的單列索引很少有用。也許您不需要新索引?