返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么用C++实现数据库删除大表
  • 165
分享到

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

2023-06-03 09:06:40 165人浏览 安东尼
摘要

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

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

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

使用方法:

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

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

--结束END--

本文标题: 怎么用C++实现数据库删除大表

本文链接: https://lsjlt.com/news/233917.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么用C++实现数据库删除大表
    本篇内容介绍了“怎么用C++实现数据库删除大表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景:数据库的IO压力非常大,如果在线上删除大表...
    99+
    2023-06-03
  • MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查
    这篇文章主要介绍“MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查”,在日常操作中,相信很多人在MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-07-02
  • mysql怎么删除数据库表
    在MySQL中,删除数据库表可以使用DROP TABLE语句。这个操作会移除表及其所有的数据,因此在执行之前请确保已经备份了任何重要...
    99+
    2024-05-22
    mysql
  • mysql怎么删除表数据库
    使用 drop table 语句删除表,最简单的方法是直接删除,只需提供表名即可。级联删除则可以通过 cascade 选项删除表及其相关记录,而 restrict 选项只删除表,如果存在...
    99+
    2024-08-05
    mysql
  • 怎么删除mysql数据库表
    要删除 mysql 数据库表,可以使用 drop table 语句,其中 table_name 为要删除的表名。该语句具有可选的 if exists 子句,可确保仅在表存在时才删除它。如...
    99+
    2024-08-05
    mysql
  • 数据库mysql怎么删除表
    可以使用 drop table table_name 命令删除 mysql 表,但需注意以下步骤:备份重要数据,因为删除表不可逆。处理外键约束:cascade:自动删除相关记录。rest...
    99+
    2024-08-05
    mysql
  • mysql数据库表怎么删除
    要删除 mysql 数据库表,请执行以下步骤:打开 mysql 命令窗口并连接到数据库。使用 drop table 表名命令删除表(替换表名为要删除的表)。运行 show tables ...
    99+
    2024-08-05
    mysql linux macos
  • mysql数据库怎么删除表
    使用 drop table 语句删除 mysql 表。步骤:1. 登录 mysql 并选择要删除表所在的数据库。2. 使用 drop table table_name 语句删除表,其中 ...
    99+
    2024-08-06
    mysql
  • mysql数据库怎么删除表数据
    可以通过以下方法删除 mysql 表数据:1. truncate table:立即删除所有数据,重置自增主键值。2. delete 语句:逐行删除数据,可使用 wher ...
    99+
    2024-08-05
    mysql
  • 怎么删除mysql表格数据库数据
    删除 mysql 表中数据的方法:truncate table 命令:通过不记录日志的方式快速删除所有数据,无法回滚。delete 语句:根据条件删除特定行,可使用 wher&...
    99+
    2024-08-05
    mysql
  • PHP中怎么删除数据库表
    本篇文章给大家分享的是有关PHP中怎么删除数据库表,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。PHP删除数据库表具体实现代码如下function deldata($...
    99+
    2023-06-17
  • mysql数据库中表怎么删除
    删除 mysql 数据库中的表的步骤如下:确保拥有删除权限。使用 drop table table_name 命令删除表。可使用附加选项,如级联删除外键 (cascade) 或检查表是否...
    99+
    2024-08-05
    mysql 数据丢失
  • mysql怎么删除表里数据库
    可以使用 delete 语句从 mysql 表中删除记录:指定要删除记录的表名 (table_name)使用 where 子句指定删除条件 (condition) ...
    99+
    2024-08-05
    mysql
  • 怎么在mysql数据库删除表
    mysql删除表的命令为drop table table_name。步骤:1. 打开客户端并连接数据库;2. 执行drop table命令并指定要删除的表名;3.按enter键执行命令。...
    99+
    2024-08-05
    mysql
  • mysql数据库表数据删除怎么恢复
    mysql 数据删除恢复方法:从备份中恢复:还原已创建的数据库备份。恢复日志恢复:使用启用的恢复日志记录来解析并恢复数据。undo 日志恢复:回滚 undo 日志以恢复已删除的数据。第三...
    99+
    2024-08-05
    mysql phpmyadmin 数据丢失
  • oracle怎么批量删除数据库表
    要批量删除数据库表,可以使用Oracle SQL的DROP TABLE命令。以下是一个示例: DROP TABLE table1, ...
    99+
    2024-04-09
    oracle 数据库
  • oracle数据库怎么删除注册表
    oracle 数据库通常不存储在 windows 注册表中。可以通过以下步骤手动删除 oracle 数据库:停止 oracle 数据库服务。删除 oracle 数据库目录及其所有内容。删...
    99+
    2024-04-19
    oracle
  • MongoDB实现创建删除数据库、创建删除表(集合 )、数据增删改查
    一、 数据库使用 开启 mongodb 服务:要管理数据库,必须先开启服务,开启服务使用  mongod --dbpath c:\mongodb 管理 mongodb 数据库:(一定要在新的 cmd 中输入...
    99+
    2022-06-26
    MongoDB 创建删除数据库 创建删除表 创建删除对象 数据增删改查
  • MongoDB实现创建删除数据库、创建删除表(集合)、数据增删改查
    一、 数据库使用 开启 mongodb 服务:要管理数据库,必须先开启服务,开启服务使用  mongod --dbpath c:\mongodb 管理 mongodb ...
    99+
    2024-04-02
  • mysql 大表批量删除大量数据的实现方法
    问题参考自:https://www.zhihu.com/question/440066129/answer/1685329456 ,mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业...
    99+
    2022-05-11
    mysql 大表批量删除 mysql 大表批量
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作