iT邦幫忙

2

MySQL 下了一道Delete部份資料後,系統磁碟一直保持近100%的使用率

  • 分享至 

  • xImage

各位好,公司的MySQL資料庫中有一個table因為資料筆數過多(每天新增3萬筆,已持續自2012年至今),所以決定將只保留三年內的資料,因此之前的歷史資料就使用delete指定篩選刪除,結果上週僅下指令刪除2012~2013共兩年約兩仟多萬筆,就此系統磁碟一直保持近100%的使用率,相當影響MySQL效能。
查了一下workbench connections,確認Delete sql已執行完畢,又查了Windows系統資源監視器,發現是 mysqld.exe 對那個 table 一直有讀寫動作,至今已持續了約5天仍降不下來,不知是否可以直接將這支 mysqld.exe砍掉或重新開機,但又怕資料庫crash,不知各位有沒有什麼建議?謝謝先!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
5
一級屠豬士
iT邦大師 1 級 ‧ 2024-03-14 12:39:48
insert into newtable
select *
  from oldtable
 where 你想保留的年度;

rename table oldtable to oldtable_bak;
rename table newtable to oldtable;

https://dev.mysql.com/doc/refman/8.3/en/rename-table.html

改用建立新的table, 然後改名. 這樣資料量搬移的部分較少的話,可能比較好.

看更多先前的回應...收起先前的回應...
motorwu iT邦新手 5 級 ‧ 2024-03-14 13:23:40 檢舉

收到,只是好奇MySQL在執行完delete指令後還有什麼要背景執行的處理,這麼耗資源。

厚厚 iT邦新手 1 級 ‧ 2024-03-15 15:24:04 檢舉

請教這種做法是不是運用在要保留的資料相對全部資料占比相對少很多(10%不到)的情況? 謝謝

不會是只有單一因素,例如你舉例的百分比,需要多方面考量.

嗨, 一級屠豬士
想再額外請教,這種操作,應該是要確保全服務停機的對吧!?
在我弱弱的理解上rename的過程或者搬移過程,和同時每天 3 萬筆同時新增,應該會出錯
然後停機時間,應該最大的時間成本會是,在第一步驟 insert into newtable 對嗎?

Tsai-jimmy
他這個是需要做搬移維護的情況,不是日常的作業.當然是需要停一下.

像是大量輸入的table,會使用partition table的方式,這樣要清理或搬移舊資料會方便多了.

1
zza6312
iT邦新手 2 級 ‧ 2024-03-15 06:55:37

當你執行 delete 完後,
Table 裡Record被刪除的位置會產生空隙,
這時 MySQL 會開始執行 Table 的 Compaction 動作,
有點類似 Windows 的磁碟重組,
他會開始把資料作搬移,將資料搬到前面的位,
把空隙留在後方,
這時 CPU 會執行搬移的指令,
你可以想像你一邊作磁碟重組,一邊播放影片的感覺

motorwu iT邦新手 5 級 ‧ 2024-03-15 10:12:42 檢舉

原來如此,怪不得磁碟一直保持100%的使用率,好忙啊....能夠把這個選項改為手動嗎?大白天的馬路施工一定塞車的。

wajika iT邦新手 5 級 ‧ 2024-03-16 10:17:17 檢舉

另外还要查看线程数,处理IO的memory容量

0
japhenchen
iT邦超人 1 級 ‧ 2024-03-15 08:16:27

方法一:

REPAIR TABLE table_name;

方法二:

ALTER TABLE t1 ENGINE = InnoDB;

方法三:

mysqldump db_name t1 > dump.sql
mysql db_name < dump.sql
看更多先前的回應...收起先前的回應...

做之前記得備份避免手殘黨出沒

motorwu iT邦新手 5 級 ‧ 2024-03-15 10:16:29 檢舉

謝謝建議,所以方法三是可以把DB中單一table匯出,再匯入但不影響其他table?

三個方法都不影響其他TABLE或整個DB

刪除資料後都會造成索引檔的片段化,一邊開車一邊理貨(司機兼搬貨),速度不會好,所以簡單的方法就是,停車,整理好再上路

motorwu iT邦新手 5 級 ‧ 2024-03-19 13:41:47 檢舉

感謝您。

1

使用刪除指令要很小心。
因為刪除要運行的作業。遠遠比增加資料還要來的多。

尤其是在筆數非常大的表更是明顯。
基本建議可參照 @一級屠豬士 教的。

使用另外新增的方式來處理。

我要發表回答

立即登入回答