tft每日頭條

 > 科技

 > mysql大表清理數據

mysql大表清理數據

科技 更新时间:2024-07-22 21:23:25
概述

我們很多時候都會去drop一些大表,特别是生産環境做操作時,這裡主要提一些注意事項,僅供參考。


01相關語法

1、删表

DROP TABLE Syntax DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE]

可一次删除一張或多張表。需具有所删除表上的DROP權限。表定義文件和數據文件均被移除。表被删除後表上的用戶權限不會被自動删除。參數裡表中指定的表名不存在則報錯,但對于存在的表仍會删除。可通過指定IF EXISTS阻止表不存在時引發的錯誤(此時對于不存在的表僅産生一個NOTE)。

對于分區表,除了移除表定義,分區、數據外還移除與之關聯的分區定義文件(.par)。

在MySQL5.6中參數[RESTRICT | CASCADE]不做任何事情。[TEMPORARY] 關鍵字表明隻删臨時表,語句不會結束正在進行的事務(MySQL中DDL語句會隐式提交),不會進行權限檢查。

2、删庫

DROP DATABASE Syntax DROP {DATABASE | SCHEMA} [IF EXISTS] db_name...

删除指定庫中的表之後删除庫。需具有庫上的DROP權限。庫被删除後庫上存在的用戶權限不會被自動删除。IF EXISTS用于阻止庫名不存在時引起的錯誤。庫被删除後默認庫會被重置。若在使用了符号鍊接的庫上執行DROP DATABASSE 連接和原始數據庫都會被删除。命令返回被移除的表數量。

使用InnoDB引擎且指定innodb_file_per_table=ON時在數據目錄中與該表對應的有如下兩個文件,分别為表定義文件和數據文件。

mysql大表清理數據(詳解mysql生産環境如何快速有效的删除大表)1

mysql大表清理數據(詳解mysql生産環境如何快速有效的删除大表)2

2、drop table

直接使用DROP TABLE來完成删表動作,正常這條語句要執行很長時間。因為數據量隻有5G,所以不是很明顯。(這台服務器空間不夠了,所以數據量沒加上去..)

mysql大表清理數據(詳解mysql生産環境如何快速有效的删除大表)3

3、建立硬鍊接

此時便可以通過在該表對應的數據文件上設置硬鍊接來進行删除。

#ln /data/datafile/test/no_part_tab.MYD /data/datafile/test/no_part_tab.MYD.hdlk #ls -lh /data/datafile/test/

mysql大表清理數據(詳解mysql生産環境如何快速有效的删除大表)4

發現多了一個sys_user.ibd.hdlk文件,且no_part_tab.MYD.hdlk和no_part_tab.MYD的innode均為2。也即當有多個文件名(如硬鍊接)指向同一innode時,這個innode的引用數大于1,此時,删除其中任何一個文件名都隻會删除指向innode的指針而并不會直接删除物理文件塊,因此會非常快,直至innode的引用計數等于1時才會真正删除對應的物理文件塊,真正删除物理文件塊時才會比較耗時。

4、drop table

在建立了硬鍊接後再執行DROP TABLE操作:

DROP TABLE no_part_tab;

mysql大表清理數據(詳解mysql生産環境如何快速有效的删除大表)5

可以看到基本沒耗時,查看對應的表定義和數據文件:

mysql大表清理數據(詳解mysql生産環境如何快速有效的删除大表)6

隻剩下no_part_tab.MYD.hdlk,且innode的引用計數變為了1。也即剛才的DROP TABLE操作實施删除了物理文件的一個指針no_part_tab,因而非常快。

5、删除真正的物理文件

因為此時innode的引用計數已經變為了1,直接删除no_part_tab.MYD.hdlk便會真正的删除物理文件。但因為物理文件較大,删除大文件仍會引起較高的磁盤IO開銷。因此可以使用少量逐次删除的方式來删除大的數據文件。truncate工具可以用于增加或縮減指定文件的尺寸,可以用于此目的:

#for i in `seq 6 -1 1 ` ;do sleep 2;sudo truncate -s ${i}G /data/datafile/test/no_part_tab.MYD.hdlk;done #rm -rf /data/datafile/test/no_part_tab.MYD.hdlk;

從6G開始,每次縮減1G,停2秒,繼續,直到文件隻剩1G,最後使用rm命令删除剩餘的部分。

mysql大表清理數據(詳解mysql生産環境如何快速有效的删除大表)7

如果是整個數據庫的删除可以先删除其中較大的表,最後在執行DROP DATABASE删除整個庫,對大表的删除可參見上面的方法。


後面會分享更多devops和DBA方面的内容,感興趣的朋友可以關注下!

mysql大表清理數據(詳解mysql生産環境如何快速有效的删除大表)8

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved