背景
數(shù)據(jù)結(jié)轉(zhuǎn)過程中經(jīng)常進(jìn)行 delete 操作,產(chǎn)生空白空間,如果進(jìn)行新的插入操作,MySQL將嘗試?yán)眠@些留空的區(qū)域,但仍然無法將其徹底占用,于是造成了數(shù)據(jù)的存儲位置不連續(xù),以及物理存儲順序與理論上的排序順序不同,久而久之就產(chǎn)生了碎片。
碎片治理思路
根據(jù)線上處理經(jīng)驗總結(jié)比對4種處理磁盤碎片優(yōu)缺點
?
治理方案 | 優(yōu)勢 | 缺點 | 備注 |
將數(shù)據(jù)量巨大的表設(shè)計成分區(qū)表,按時間分區(qū) | 通過結(jié)轉(zhuǎn)分區(qū)數(shù)據(jù),刪除分區(qū)釋放磁盤碎片,磁盤IO抖動秒級別,對線上業(yè)務(wù)影響小 |
? |
估算數(shù)據(jù)量,每個分區(qū)不超過3億數(shù)據(jù)350G為佳;庫存流水,訂單表這些表應(yīng)該在創(chuàng)建時就應(yīng)該設(shè)計成分區(qū)表,避免以后磁盤碎片痛點 |
重建表存儲引擎,重新組織數(shù)據(jù)(ALTER TABLE tablename ENGINE=InnoDB;) |
? |
整理過程加鎖,周期長,且對線上業(yè)務(wù)影響較大:10億數(shù)據(jù)量,1000G,tp99會持續(xù)超過60s | 謹(jǐn)慎操作 |
主從切換(DBA可使用一個磁盤更大的干凈的庫,進(jìn)行主從切換) |
? |
涉及面廣,牽扯范圍較大,處理時長在分鐘級 | 謹(jǐn)慎操作 |
創(chuàng)建臨時表進(jìn)行數(shù)據(jù)雙寫最后進(jìn)行數(shù)據(jù)庫表名切換 | 零延遲,無抖動,對線上無任何影響 | 需要磁盤空間較大 |
? |
?
創(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ù)表在很長一段時間內(nèi)沒有進(jìn)行數(shù)據(jù)結(jié)轉(zhuǎn),且無法創(chuàng)建分區(qū)表的話,可以利用以下方法。
?
表名切換
如果某一張數(shù)據(jù)表在很長一段時間內(nèi)沒有進(jìn)行數(shù)據(jù)結(jié)轉(zhuǎn),可以創(chuàng)建臨時表,通過大數(shù)據(jù)將某一結(jié)轉(zhuǎn)周期內(nèi)數(shù)據(jù)推送至臨時表,在代碼層面進(jìn)行數(shù)據(jù)的雙寫,最后再通過表名更換的方式進(jìn)行表名轉(zhuǎn)換。其實,治理磁盤碎片最好的方法就是刪除表,不同業(yè)務(wù)對數(shù)據(jù)的要求不同。如果有可能的話新建一個臨時表。
利用rename語句對數(shù)據(jù)庫表信息進(jìn)行修改,不會鎖表,可以達(dá)到零延遲,無抖動,對線上無任何影響。
rename table xx_record to xx_record_temp1,xx_temp to xx_record,xx_record_temp1 to xx_record_temp;
總結(jié)
不管是使用云還是商城數(shù)據(jù)庫,只要使用mysql,必然會遇到Mysql碎片問題痛點,數(shù)據(jù)量大的業(yè)務(wù)表應(yīng)該設(shè)計成分區(qū)表方便磁盤碎片整理,降低維護(hù)成本和業(yè)務(wù)影響。碎片清理前后,IO性能會上升,SQL執(zhí)行效率更快。所以,在日常運維工作中,應(yīng)對碎片進(jìn)行定期清理,保證數(shù)據(jù)庫有穩(wěn)定的性能和充足的空間。
擴(kuò)展
提到提高IO性能,在緊急情況下還可以考慮開啟刷盤(設(shè)置 sync_binlog=0;innodb_flush_log_at_trx_commit=0),但開啟刷盤會有數(shù)據(jù)丟失風(fēng)險(集團(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文章
3852瀏覽量
64738 -
磁盤碎片整理
+關(guān)注
關(guān)注
0文章
2瀏覽量
5521 -
MySQL
+關(guān)注
關(guān)注
1文章
831瀏覽量
26762
發(fā)布評論請先 登錄
相關(guān)推薦
使用插件將Excel連接到MySQL/MariaDB
![使用插件將Excel連接到<b class='flag-5'>MySQL</b>/MariaDB](https://file1.elecfans.com/web3/M00/06/A2/wKgZO2eN04eAGvSJAAA2ONnnlhw523.png)
MySQL數(shù)據(jù)庫的安裝
![<b class='flag-5'>MySQL</b>數(shù)據(jù)庫的安裝](https://file1.elecfans.com/web3/M00/05/E2/wKgZPGeF2XWAe83fAAAW9lhgvGk652.jpg)
什么是raid磁盤冗余陣列
![什么是raid<b class='flag-5'>磁盤</b>冗余陣列](https://file1.elecfans.com/web3/M00/02/88/wKgZO2df6WSAJhLdAABay5HUuSo334.png)
MySQL還能跟上PostgreSQL的步伐嗎
![<b class='flag-5'>MySQL</b>還能跟上PostgreSQL的步伐嗎](https://file1.elecfans.com/web2/M00/0B/D4/wKgZomc6o-GAONzrAAAUvLyONl4496.png)
MySQL編碼機(jī)制原理
適用于MySQL的dbForge架構(gòu)比較
![適用于<b class='flag-5'>MySQL</b>的dbForge架構(gòu)比較](https://file1.elecfans.com/web2/M00/0A/53/wKgZomce7BuATuXVAAAdQ-o3sRM795.png)
Jtti:MySQL初始化操作如何設(shè)置root密碼
Linux磁盤IO詳細(xì)解析
![Linux<b class='flag-5'>磁盤</b>IO詳細(xì)解析](https://file1.elecfans.com/web2/M00/01/89/wKgaomawhMqAf6B7AAAMGWWLN8I803.png)
華納云:如何修改MySQL的默認(rèn)端口
![華納云:如何修改<b class='flag-5'>MySQL</b>的默認(rèn)端口](https://file1.elecfans.com/web2/M00/FB/21/wKgZomaPi3iAcC_GAAjuB9zVUdw331.png)
MySQL的整體邏輯架構(gòu)
![<b class='flag-5'>MySQL</b>的整體邏輯架構(gòu)](https://file1.elecfans.com/web2/M00/DF/5E/wKgaomYwYo-AUI-ZAAA3QdJJs08944.png)
評論