快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

怎么用C++实现数据库删除大表

本篇内容介绍了“怎么用C++实现数据库删除大表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

东河网站制作公司哪家好,找成都创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站建设等网站项目制作,到程序开发,运营维护。成都创新互联公司于2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联公司

背景:数据库的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

使用方法:

怎么用C++实现数据库删除大表

“怎么用C++实现数据库删除大表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


网站题目:怎么用C++实现数据库删除大表
文章链接:http://6mz.cn/article/jopess.html

其他资讯