回收表碎片空間
當在MySQL數(shù)據(jù)庫中頻繁地執(zhí)行INSERT、UPDATE和DELETE語句,會導(dǎo)致數(shù)據(jù)在磁盤上不再連續(xù)存儲,形成碎片化的存儲空間(即碎片空間)。碎片空間的存在會導(dǎo)致數(shù)據(jù)庫性能下降。常規(guī)的回收表空間碎片操作(例如Optimize Table回收表空間)可能會鎖表并影響業(yè)務(wù)運行。本文為您介紹在DMS中提交無鎖結(jié)構(gòu)變更工單來自動整理并回收碎片空間,有效避免因數(shù)據(jù)庫變更而導(dǎo)致的鎖表阻塞業(yè)務(wù)問題,提高數(shù)據(jù)庫性能和效率,并降低存儲成本。
前提條件
已擁有目標數(shù)據(jù)庫中表的變更權(quán)限。更多信息,請參見查看我的權(quán)限和提交工單申請權(quán)限。
目標MySQL實例已開啟無鎖結(jié)構(gòu)變更。具體操作,請參見開啟無鎖結(jié)構(gòu)變更。
注意事項
回收大容量表的碎片空間時,請確保實例剩余的存儲空間大小至少為目標表大小的2~3倍,并在變更過程中密切關(guān)注實例剩余空間情況。
回收大容量表的碎片空間時,可能需要臨時存儲數(shù)據(jù)的副本或其他,這可能會導(dǎo)致額外的空間需求。如果空間不足,可能會導(dǎo)致回收碎片空間失敗或者實例被鎖定。
DMS是通過無鎖結(jié)構(gòu)變更對該表進行一次DDL變更來實現(xiàn)回收表碎片空間。所有DDL變更均存在失敗的可能性,無法保證100%成功,請您知悉。
查看表碎片空間大小
您可在DMS的SQL Console中輸入查看表碎片空間的SQL語句:SHOW TABLE STATUS LIKE 'table_name';
。在SQL Console查詢的具體操作,請參見SQL窗口介紹。
查詢結(jié)果示例圖如下,Data_free表示表中的碎片空間(單位:字節(jié))。
回收表碎片空間
- 登錄數(shù)據(jù)管理DMS 5.0。
在頂部菜單欄中,選擇數(shù)據(jù)庫開發(fā) > 數(shù)據(jù)變更 > 無鎖變更。
說明若您使用的是極簡模式的控制臺,請單擊左上角的,選擇
。配置無鎖結(jié)構(gòu)變更工單。具體操作,請參見通過無鎖變更工單實現(xiàn)無鎖結(jié)構(gòu)變更。
實例在開啟無鎖結(jié)構(gòu)變更后,執(zhí)行無鎖結(jié)構(gòu)變更工單都會自動回收表碎片空間。但為確保系統(tǒng)更穩(wěn)定地回收碎表空間,并減少對依賴該表或與該表有關(guān)聯(lián)關(guān)系的其他表的影響。建議您在工單中使用如下任意SQL來整理、回收碎片空間:
ALTER TABLE table_name COMMENT '修改后的表的注釋';
ALTER TABLE table_name ENGINE=InnoDB;
OPTIMIZE TABLE table_name;
ALTER TABLE table_name MODIFY COLUMN field_name INT COMMENT '修改后的字段注釋';