我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查

这篇文章主要介绍“MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查”,在日常操作中,相信很多人在MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
2023-07-02

mysql怎么删除数据库表

在MySQL中,删除数据库表可以使用DROP TABLE语句。这个操作会移除表及其所有的数据,因此在执行之前请确保已经备份了任何重要数据。以下是具体步骤:登录到MySQL服务器。打开命令行工具或终端,并使用mysql命令登录到MySQL服
mysql怎么删除数据库表
2024-05-22

mysql数据库怎么删除表数据

可以通过以下方法删除 mysql 表数据:1. truncate table:立即删除所有数据,重置自增主键值。2. delete 语句:逐行删除数据,可使用 where 子句指定条件。3. where 子句:用于指定要删除的行,支持比较和
mysql数据库怎么删除表数据
2024-08-05

mysql怎么删除表数据库

使用 drop table 语句删除表,最简单的方法是直接删除,只需提供表名即可。级联删除则可以通过 cascade 选项删除表及其相关记录,而 restrict 选项只删除表,如果存在外键约束则会失败。如何用 MySQL 删除表直接删除
mysql怎么删除表数据库
2024-08-05

怎么删除mysql数据库表

要删除 mysql 数据库表,可以使用 drop table 语句,其中 table_name 为要删除的表名。该语句具有可选的 if exists 子句,可确保仅在表存在时才删除它。如需删除名为 users 的表,可使用 drop tab
怎么删除mysql数据库表
2024-08-05

数据库mysql怎么删除表

可以使用 drop table table_name 命令删除 mysql 表,但需注意以下步骤:备份重要数据,因为删除表不可逆。处理外键约束:cascade:自动删除相关记录。restrict:阻止删除。如何删除 MySQL 表删除表的
数据库mysql怎么删除表
2024-08-05

mysql数据库怎么删除表

使用 drop table 语句删除 mysql 表。步骤:1. 登录 mysql 并选择要删除表所在的数据库。2. 使用 drop table table_name 语句删除表,其中 table_name 是要删除的表的名称。3. 输入
mysql数据库怎么删除表
2024-08-06

mysql数据库表怎么删除

要删除 mysql 数据库表,请执行以下步骤:打开 mysql 命令窗口并连接到数据库。使用 drop table 表名命令删除表(替换表名为要删除的表)。运行 show tables 命令确认表已删除。如何删除 MySQL 数据库表删除
mysql数据库表怎么删除
2024-08-05

怎么删除mysql表格数据库数据

删除 mysql 表中数据的方法:truncate table 命令:通过不记录日志的方式快速删除所有数据,无法回滚。delete 语句:根据条件删除特定行,可使用 where 子句过滤行和 limit 子句限制行数。如何删除 MySQL
怎么删除mysql表格数据库数据
2024-08-05

PHP中怎么删除数据库表

本篇文章给大家分享的是有关PHP中怎么删除数据库表,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。PHP删除数据库表具体实现代码如下function deldata($dbnam
2023-06-17

mysql怎么删除表里数据库

可以使用 delete 语句从 mysql 表中删除记录:指定要删除记录的表名 (table_name)使用 where 子句指定删除条件 (condition)如何在 MySQL 中删除表中的记录要从 MySQL 表中删除记录,可以使用
mysql怎么删除表里数据库
2024-08-05

怎么在mysql数据库删除表

mysql删除表的命令为drop table table_name。步骤:1. 打开客户端并连接数据库;2. 执行drop table命令并指定要删除的表名;3.按enter键执行命令。注意:此操作不可逆,删除前请确认;先删除引用该表的外键
怎么在mysql数据库删除表
2024-08-05

mysql数据库中表怎么删除

删除 mysql 数据库中的表的步骤如下:确保拥有删除权限。使用 drop table table_name 命令删除表。可使用附加选项,如级联删除外键 (cascade) 或检查表是否存在 (if exists)。在删除表之前,请确保备份
mysql数据库中表怎么删除
2024-08-05

mysql数据库表数据删除怎么恢复

mysql 数据删除恢复方法:从备份中恢复:还原已创建的数据库备份。恢复日志恢复:使用启用的恢复日志记录来解析并恢复数据。undo 日志恢复:回滚 undo 日志以恢复已删除的数据。第三方工具恢复:利用第三方工具恢复已删除的数据。注意:恢复
mysql数据库表数据删除怎么恢复
2024-08-05

oracle怎么批量删除数据库表

要批量删除数据库表,可以使用Oracle SQL的DROP TABLE命令。以下是一个示例:DROP TABLE table1, table2, table3;这将同时删除名为table1、table2和table3的三个表。要注意的是,
oracle怎么批量删除数据库表
2024-04-09

oracle数据库怎么删除注册表

oracle 数据库通常不存储在 windows 注册表中。可以通过以下步骤手动删除 oracle 数据库:停止 oracle 数据库服务。删除 oracle 数据库目录及其所有内容。删除任何手动创建的 oracle 数据库文件。卸载 or
oracle数据库怎么删除注册表
2024-04-19

MongoDB实现创建删除数据库、创建删除表(集合 )、数据增删改查

一、 数据库使用开启 mongodb 服务:要管理数据库,必须先开启服务,开启服务使用 mongod --dbpath c:\mongodb管理 mongodb 数据库:(一定要在新的 cmd 中输入)mongo清屏:cls查
2022-06-26

mysql 大表批量删除大量数据的实现方法

问题参考自:https://www.zhihu.com/question/440066129/answer/1685329456 ,mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业和个体户,个体户的数据量
2022-05-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录