【C/C++】資料庫刪除大表

風塵_NULL發表於2019-02-19

背景:資料庫的IO壓力非常大,如果線上上刪除大表,對IO以及業務會造成很大的抖動;作為一名DBA的通用做法是,建立.frm 以及.ibd的硬連線,然後在drop table tablename;但是表檔案依然存在於該機器上,如果直接用rm刪除,會造成IO的until達到100%

問題:那麼如何解決刪除檔案時,如果避免IO達到100%呢?

解決方案:透過ftruncate逐漸清除檔案,下面本人提供自己寫的slowrm來刪除檔案,測試io使用率10-20%之間,刪除速度1個小時100多G(這裡只是一個粗略的版本,各位看官可以自己修改下)

#include <iostream>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <string>
#include <unistd.h>
//判讀輸入是否合法
int fileInputLegal(const char *pfile=nullptr);

int main(int argc,char *argv[]){
//利用stat獲取檔案的大小
//呼叫open開啟檔案獲取檔案描述符
//呼叫ftrucate縮減檔案的大小,直到0為止
    int fd = -1;

    //這個引數經過調整過的

    int deleteBytes    = 1024700;
    //這個目的是獲取檔案長度
    struct stat buf;
    off_t fileSize = 0;
    if( argc !=2 ){
        std::cout<<"你傳輸的引數不正確"<<std::endl;
        return -1;

    }
    const char *filename=argv[1];

    if(fileInputLegal(filename) < 0){
        return -1;

    }
    
    if((fd = open(filename,O_RDWR)) < 0 ){
        std::cout<<"開啟檔案"<<filename<<"失敗"<<std::endl;
        return -1;

    }
    if(lstat(filename,&buf) <0){
        std::cout<<"獲取檔案資訊(大小失敗)"<<std::endl;
        return -1;


    }
    fileSize = buf.st_size;
    while(fileSize > deleteBytes ){
        fileSize = fileSize - deleteBytes;
        if(ftruncate(fd,fileSize) < 0){
            std::cout<<"刪除檔案出錯,請重新執行"<<std::endl;
            return -2;


        }

        //這裡特別要注意,設定的時間越短,ftruncate呼叫越頻繁,設定不當,適得其反

        usleep(20000);


    }    
    if(ftruncate(fd,0) < 0){
        std::cout<<"刪除檔案出錯,請重新執行"<<std::endl;
        return -2;

    }
    close(fd);
    unlink(filename);
    return 0;


}

int fileInputLegal(const char *pfile){
    if(nullptr==pfile){
        return -1;

    }

    if(access(pfile,R_OK|W_OK)<0){
        std::cout<<"對檔案沒有讀寫許可權"<<std::endl;
        return -1;


    }
    
    if(opendir(pfile) != NULL){
        std::cout<<"是一個目錄"<<std::endl;
        return -1;

    }

    return 0;

}


編譯方法:

g++ -std=gnu++11 -o slowrm slow_rm.cpp


使用方法:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30221425/viewspace-2636414/,如需轉載,請註明出處,否則將追究法律責任。

相關文章