【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
使用方法:
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30221425/viewspace-2636414/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30221425/viewspace-2636414/
- 点赞
- 收藏
- 分享
- 文章举报
- mysql数据库创建、删除数据库
- mysql之delete删除记录后数据库大小不变
- mysql can't rmdir 删除数据库报错
- 删除数据库时提示数据库正在被使用,无法删除(Cannot drop database databasename because it is currently in use)的问题
- c++实现二叉树的插入、删除、查询、遍历和树形打印
- ORCALE数据库删除用户 ORA-01940: 无法删除当前已连接的用户
- Oracle删除(1)删除数据库
- 删除数据库所有存储过程的SQL语句 转
- Hive学习第三课 创建数据库和删除数据库
- [转]MSSQL数据库触发器--更新(update),删除(delete),插入(insert)
- PHP插入数据库代码,编辑,删除
- [转帖]记录:删除数据库中重复数据的几个方法
- 数据库中删除语句Drop、Delete、Truncate的相同点和不同点的比较
- Android程序员学PHP开发(39)-ThinkPHP5.0(11)后台操作数据库(2)查询与删除-phpStudy+Sublime
- C/C++访问数据库——Oracle之OCI篇
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- C++操作文件进行读取、删除、修改指定行
- C++删除文本文件空行
- 数据库中两张表之间的数据同步实现思路(增加、删除、更新)
- C++从string中删除所有的某个特定字符