背景
數(shù)據(jù)結(jié)轉(zhuǎn)過程中經(jīng)常進(jìn)行 delete 操作,產(chǎn)生空白空間,如果進(jìn)行新的插入操作,MySQL將嘗試?yán)眠@些留空的區(qū)域,但仍然無法將其徹底占用,于是造成了數(shù)據(jù)的存儲(chǔ)位置不連續(xù),以及物理存儲(chǔ)順序與理論上的排序順序不同,久而久之就產(chǎn)生了碎片。
碎片治理思路
根據(jù)線上處理經(jīng)驗(yàn)總結(jié)比對4種處理磁盤碎片優(yōu)缺點(diǎn)
?
| 治理方案 | 優(yōu)勢 | 缺點(diǎn) | 備注 |
| 將數(shù)據(jù)量巨大的表設(shè)計(jì)成分區(qū)表,按時(shí)間分區(qū) | 通過結(jié)轉(zhuǎn)分區(qū)數(shù)據(jù),刪除分區(qū)釋放磁盤碎片,磁盤IO抖動(dòng)秒級(jí)別,對線上業(yè)務(wù)影響小 |
? |
估算數(shù)據(jù)量,每個(gè)分區(qū)不超過3億數(shù)據(jù)350G為佳;庫存流水,訂單表這些表應(yīng)該在創(chuàng)建時(shí)就應(yīng)該設(shè)計(jì)成分區(qū)表,避免以后磁盤碎片痛點(diǎn) |
| 重建表存儲(chǔ)引擎,重新組織數(shù)據(jù)(ALTER TABLE tablename ENGINE=InnoDB;) |
? |
整理過程加鎖,周期長,且對線上業(yè)務(wù)影響較大:10億數(shù)據(jù)量,1000G,tp99會(huì)持續(xù)超過60s | 謹(jǐn)慎操作 |
| 主從切換(DBA可使用一個(gè)磁盤更大的干凈的庫,進(jìn)行主從切換) |
? |
涉及面廣,牽扯范圍較大,處理時(shí)長在分鐘級(jí) | 謹(jǐn)慎操作 |
| 創(chuàng)建臨時(shí)表進(jìn)行數(shù)據(jù)雙寫最后進(jìn)行數(shù)據(jù)庫表名切換 | 零延遲,無抖動(dòng),對線上無任何影響 | 需要磁盤空間較大 |
? |
?
創(chuàng)建分區(qū)表

上述分區(qū)表,在某一分區(qū)內(nèi)數(shù)據(jù)結(jié)轉(zhuǎn)完成后,
ALTER TABLE warehouse_stock_flow drop PARTITION p24;
當(dāng)然不是所有的表都是可以創(chuàng)建分區(qū)表的。如果某一張數(shù)據(jù)表在很長一段時(shí)間內(nèi)沒有進(jìn)行數(shù)據(jù)結(jié)轉(zhuǎn),且無法創(chuàng)建分區(qū)表的話,可以利用以下方法。
?
表名切換
如果某一張數(shù)據(jù)表在很長一段時(shí)間內(nèi)沒有進(jìn)行數(shù)據(jù)結(jié)轉(zhuǎn),可以創(chuàng)建臨時(shí)表,通過大數(shù)據(jù)將某一結(jié)轉(zhuǎn)周期內(nèi)數(shù)據(jù)推送至臨時(shí)表,在代碼層面進(jìn)行數(shù)據(jù)的雙寫,最后再通過表名更換的方式進(jìn)行表名轉(zhuǎn)換。其實(shí),治理磁盤碎片最好的方法就是刪除表,不同業(yè)務(wù)對數(shù)據(jù)的要求不同。如果有可能的話新建一個(gè)臨時(shí)表。
利用rename語句對數(shù)據(jù)庫表信息進(jìn)行修改,不會(huì)鎖表,可以達(dá)到零延遲,無抖動(dòng),對線上無任何影響。

rename table xx_record to xx_record_temp1,xx_temp to xx_record,xx_record_temp1 to xx_record_temp;
總結(jié)
不管是使用云還是商城數(shù)據(jù)庫,只要使用mysql,必然會(huì)遇到Mysql碎片問題痛點(diǎn),數(shù)據(jù)量大的業(yè)務(wù)表應(yīng)該設(shè)計(jì)成分區(qū)表方便磁盤碎片整理,降低維護(hù)成本和業(yè)務(wù)影響。碎片清理前后,IO性能會(huì)上升,SQL執(zhí)行效率更快。所以,在日常運(yùn)維工作中,應(yīng)對碎片進(jìn)行定期清理,保證數(shù)據(jù)庫有穩(wěn)定的性能和充足的空間。
擴(kuò)展
提到提高IO性能,在緊急情況下還可以考慮開啟刷盤(設(shè)置 sync_binlog=0;innodb_flush_log_at_trx_commit=0),但開啟刷盤會(huì)有數(shù)據(jù)丟失風(fēng)險(xiǎn)(集團(tuán)數(shù)據(jù)庫模板配置參數(shù)默認(rèn)sync_binlog=1;innodb_flush_log_at_trx_commit=1)。
附件
mysql數(shù)據(jù)庫核心參數(shù)介紹:https://www.cnblogs.com/klvchen/p/10861850.html?
審核編輯 黃宇
-
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
4004瀏覽量
68171 -
磁盤碎片整理
+關(guān)注
關(guān)注
0文章
2瀏覽量
5581 -
MySQL
+關(guān)注
關(guān)注
1文章
900瀏覽量
29353
發(fā)布評論請先 登錄
恒訊科技解析:如何安裝MySQL并創(chuàng)建數(shù)據(jù)庫
工業(yè)數(shù)據(jù)中臺(tái)支持接入MySQL數(shù)據(jù)庫嗎
CentOS 7下MySQL 8雙主熱備高可用架構(gòu)全解
MySQL配置調(diào)優(yōu)技巧
MySQL 8.0性能優(yōu)化實(shí)戰(zhàn)指南
MySQL的組成結(jié)構(gòu)與結(jié)構(gòu)化查詢語言詳解
MySQL數(shù)據(jù)備份與恢復(fù)策略
企業(yè)級(jí)MySQL數(shù)據(jù)庫管理指南
Linux系統(tǒng)中磁盤分區(qū)與掛載詳解
MySQL數(shù)據(jù)庫是什么
除了增刪改查你對MySQL還了解多少
晶圓甩干機(jī)如何降低碎片率
磁盤分區(qū)工具parted的使用方法
電話配線架怎么整理好看
VMWare Linux系統(tǒng)磁盤擴(kuò)容
mysql磁盤碎片整理
評論