在不影響線上服務情況下,刪除大表資料表

2021-09-25 03:11:45 字數 883 閱讀 2800

在不影響線上資料庫服務情況下,如何刪除資料庫中的大表:

分析:資料庫中表涉及到db和os兩個層面:(1)db層面刪表涉及到table_cache的全域性唯一鎖,一旦資料表過大,會長時間占用全域性為一鎖,導致db卡死。(2)os層面涉及到資料表物理檔案的儲存,包括時間的資料block和元資料inode;在ext3中,大檔案非連續儲存,甚至會巢狀儲存,但是如果是ext5則是連續儲存,不會存在這個問題。

解決辦法:

所以,先對資料表物理檔案ln建立硬鏈結,再drop刪除資料表(這時db層面已經刪除表,os層面刪除的是物理檔案的乙個指標,或者說是inode的其中乙個鏈結而已),進而在truncate分批、分步驟刪除硬鏈結指向的原始的資料表物理檔案。

步驟:(1)ln 資料表物理檔案  硬鏈結名稱

(2)drop 資料表

(3)truncate 硬鏈結指向的資料表的物理檔案

軟連線:

(1)相當於建立是乙個快捷方式,但是這個快捷方式也是乙個檔案,所以os層面會建立乙個新的inode

(2)對檔案和目錄都可以建立軟鏈結

(3)ln -s 檔名稱 硬鏈結檔名稱

(1)相當於給物理檔案新增乙個指標,os層面不會新增inode,即硬鏈結檔案有相同的inode和data block(同個檔案對應多個有效的檔名稱,可以防止誤刪資料,當刪除某個檔案時候,硬鏈結還存在,資料並沒有真正刪除)

(2)只能對檔案建立,目錄不行

(3)刪除硬鏈結檔案不會影響到有相同inode的其他檔案

(4)當資料所有的鏈結檔案(初始的檔名稱和全部硬鏈結檔名稱)都刪除之後,資料檔案才真正被刪除。

(5)ln 檔名稱 硬鏈結檔名稱

tip:刪除時候需要是rm -rf *** ,注意後面沒有斜槓"/"!

-- over --

CSS在不影響總體布局情況下讓元素自由縮小

開始狀態 class box1 box1box1div class box2 box2box2div class box3 box3box3div class box4 box4box4div class box5 box5box5div body box1 box2 box3 box4 box5 ...

不影響原陣列的情況下,獲取陣列的最大值和最小值

假設有一數值陣列,如何在不影響原陣列的情況下,獲取陣列的最大值和最小值呢?廢話不多說直接上 1.我們用了最基礎的方法,遍歷整個陣列,用新陣列接收這些資料 注意,這個時候要深拷貝不然會該改變原陣列!在新陣列中排序操作 var arr 2,1,6,99,101,4,1,23 var newarr for...

ClickHouse在表有資料的情況下修改表引擎

我們使用mergetree來表示mergetree系列 中的所有表引擎,replicatedmergetree同理。如果各個副本上的資料不一致,則首先對其進行同步,或者除保留的乙個副本外,刪除其他所有副本上的資料。重新命名現有的mergetree表,然後使用舊名稱建立replicatedmerget...