c mysql 清空数据库_【C/C++】数据库删除大表

本文介绍了如何在C++中通过ftruncate逐步清除大文件以降低删除时的IO压力,提供了一个名为slowrm的示例程序,避免了直接删除导致的IO直到100%的问题。程序在删除100多G文件时,IO使用率保持在10-20%,并给出了编译和使用方法。
摘要由CSDN通过智能技术生成

背景:数据库的IO压力非常大,如果在线上删除大表,对IO以及业务会造成很大的抖动;作为一名DBA的通用做法是,建立.frm 以及.ibd的硬连接,然后在drop table tablename;但是表文件依然存在于该机器上,如果直接用rm删除,会造成IO的until达到100%

问题:那么如何解决删除文件时,如果避免IO达到100%呢?

解决方案:通过ftruncate逐渐清除文件,下面本人提供自己写的slowrm来删除文件,测试io使用率10-20%之间,删除速度1个小时100多G(这里只是一个粗略的版本,各位看官可以自己修改下)

#include

#include

#include

#include

#include

#include

//判读输入是否合法

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<

return -1;

}

const char *filename=argv[1];

if(fileInputLegal(filename) < 0){

return -1;

}

if((fd = open(filename,O_RDWR)) < 0 ){

std::cout<

return -1;

}

if(lstat(filename,&buf) <0){

std::cout<

return -1;

}

fileSize = buf.st_size;

while(fileSize > deleteBytes ){

fileSize = fileSize - deleteBytes;

if(ftruncate(fd,fileSize) < 0){

std::cout<

return -2;

}

//这里特别要注意,设置的时间越短,ftruncate调用越频繁,设置不当,适得其反

usleep(20000);

}

if(ftruncate(fd,0) < 0){

std::cout<

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<

return -1;

}

if(opendir(pfile) != NULL){

std::cout<

return -1;

}

return 0;

}

编译方法:

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

使用方法:

aed9ea2a06877c2eedbd787371db5f58.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值