背景
數(shù)據(jù)結(jié)轉(zhuǎn)過(guò)程中經(jīng)常進(jìn)行 delete 操作,產(chǎn)生空白空間,如果進(jìn)行新的插入操作,MySQL將嘗試?yán)眠@些留空的區(qū)域,但仍然無(wú)法將其徹底占用,于是造成了數(shù)據(jù)的存儲(chǔ)位置不連續(xù),以及物理存儲(chǔ)順序與理論上的排序順序不同,久而久之就產(chǎn)生了碎片。
碎片治理思路
根據(jù)線上處理經(jīng)驗(yàn)總結(jié)比對(duì)4種處理磁盤碎片優(yōu)缺點(diǎn)
?
治理方案 | 優(yōu)勢(shì) | 缺點(diǎn) | 備注 |
將數(shù)據(jù)量巨大的表設(shè)計(jì)成分區(qū)表,按時(shí)間分區(qū) | 通過(guò)結(jié)轉(zhuǎn)分區(qū)數(shù)據(jù),刪除分區(qū)釋放磁盤碎片,磁盤IO抖動(dòng)秒級(jí)別,對(duì)線上業(yè)務(wù)影響小 |
? |
估算數(shù)據(jù)量,每個(gè)分區(qū)不超過(guò)3億數(shù)據(jù)350G為佳;庫(kù)存流水,訂單表這些表應(yīng)該在創(chuàng)建時(shí)就應(yīng)該設(shè)計(jì)成分區(qū)表,避免以后磁盤碎片痛點(diǎn) |
重建表存儲(chǔ)引擎,重新組織數(shù)據(jù)(ALTER TABLE tablename ENGINE=InnoDB;) |
? |
整理過(guò)程加鎖,周期長(zhǎng),且對(duì)線上業(yè)務(wù)影響較大:10億數(shù)據(jù)量,1000G,tp99會(huì)持續(xù)超過(guò)60s | 謹(jǐn)慎操作 |
主從切換(DBA可使用一個(gè)磁盤更大的干凈的庫(kù),進(jìn)行主從切換) |
? |
涉及面廣,牽扯范圍較大,處理時(shí)長(zhǎng)在分鐘級(jí) | 謹(jǐn)慎操作 |
創(chuàng)建臨時(shí)表進(jìn)行數(shù)據(jù)雙寫(xiě)最后進(jìn)行數(shù)據(jù)庫(kù)表名切換 | 零延遲,無(wú)抖動(dòng),對(duì)線上無(wú)任何影響 | 需要磁盤空間較大 |
? |
?
創(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ù)表在很長(zhǎng)一段時(shí)間內(nèi)沒(méi)有進(jìn)行數(shù)據(jù)結(jié)轉(zhuǎn),且無(wú)法創(chuàng)建分區(qū)表的話,可以利用以下方法。
?
表名切換
如果某一張數(shù)據(jù)表在很長(zhǎng)一段時(shí)間內(nèi)沒(méi)有進(jìn)行數(shù)據(jù)結(jié)轉(zhuǎn),可以創(chuàng)建臨時(shí)表,通過(guò)大數(shù)據(jù)將某一結(jié)轉(zhuǎn)周期內(nèi)數(shù)據(jù)推送至臨時(shí)表,在代碼層面進(jìn)行數(shù)據(jù)的雙寫(xiě),最后再通過(guò)表名更換的方式進(jìn)行表名轉(zhuǎn)換。其實(shí),治理磁盤碎片最好的方法就是刪除表,不同業(yè)務(wù)對(duì)數(shù)據(jù)的要求不同。如果有可能的話新建一個(gè)臨時(shí)表。
利用rename語(yǔ)句對(duì)數(shù)據(jù)庫(kù)表信息進(jìn)行修改,不會(huì)鎖表,可以達(dá)到零延遲,無(wú)抖動(dòng),對(duì)線上無(wú)任何影響。
rename table xx_record to xx_record_temp1,xx_temp to xx_record,xx_record_temp1 to xx_record_temp;
總結(jié)
不管是使用云還是商城數(shù)據(jù)庫(kù),只要使用mysql,必然會(huì)遇到Mysql碎片問(wèn)題痛點(diǎn),數(shù)據(jù)量大的業(yè)務(wù)表應(yīng)該設(shè)計(jì)成分區(qū)表方便磁盤碎片整理,降低維護(hù)成本和業(yè)務(wù)影響。碎片清理前后,IO性能會(huì)上升,SQL執(zhí)行效率更快。所以,在日常運(yùn)維工作中,應(yīng)對(duì)碎片進(jìn)行定期清理,保證數(shù)據(jù)庫(kù)有穩(wěn)定的性能和充足的空間。
擴(kuò)展
提到提高IO性能,在緊急情況下還可以考慮開(kāi)啟刷盤(設(shè)置 sync_binlog=0;innodb_flush_log_at_trx_commit=0),但開(kāi)啟刷盤會(huì)有數(shù)據(jù)丟失風(fēng)險(xiǎn)(集團(tuán)數(shù)據(jù)庫(kù)模板配置參數(shù)默認(rèn)sync_binlog=1;innodb_flush_log_at_trx_commit=1)。
附件
mysql數(shù)據(jù)庫(kù)核心參數(shù)介紹:https://www.cnblogs.com/klvchen/p/10861850.html?
審核編輯 黃宇
-
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3848瀏覽量
64688 -
磁盤碎片整理
+關(guān)注
關(guān)注
0文章
2瀏覽量
5521 -
MySQL
+關(guān)注
關(guān)注
1文章
829瀏覽量
26744
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論