您现在的位置是:首页 >
当前栏目
快速清空超大数据表
快速 数据表 清空 超大
2023-06-13 09:11:05 时间
快速清空超大数据表
作者:matrix 被围观: 1,412 次 发布时间:2020-08-31 分类:Python 零零星星 | 无评论 »
这是一个创建于 730 天前的主题,其中的信息可能已经有所发展或是发生改变。
第一次drop超过GB的数据表,没想到竟然会执行的这么慢。尝试过TRUNCATE
和DROP
都不满意。
后来就直接找到数据库储存的文件来删除,这样比起使用sql语句操作会快得多,但也是危险操作,无法找回。
删除操作脚本
运行环境 python3.7,依赖pymysql
,根据自身情况配置变量mysql_data_dir,db_config,table_names,condition_save
fast_drop_table.py
#codeing=utf-8
"""
快速清空超大数据表 保留想要数据
"""
import pymysql
import os
mysql_data_dir = '/mnt/mysql_data/db_name/' #数据库文件所在路径
# 数据库连接配置
db_config = {'host': '127.0.0.1', 'port': 3306, 'user': 'user', 'password': 'password', 'db': 'db_name', 'charset': 'utf8'}
# 需要清空操作的数据表
table_names = [
"com_hhtjim_badata_trades_eos_this_quarter",
"com_hhtjim_badata_trades_eth_this_quarter",
]
# 数据表保留的查询条件
condition_save = "timestamp > '2020-02-20T00:00:00Z'"
# condition_save = False# 不保留
class Db:
'''
简单数据库连接操作类
'''
def __init__(self,**kwargs):
self.connection = pymysql.connect(**kwargs)
self.cursor = self.connection.cursor()
if __name__ == "__main__":
mysql = Db(**db_config)
for table_name in table_names:
os.link('{}{}.frm'.format(mysql_data_dir,table_name), '{}{}.frm.h'.format(mysql_data_dir,table_name))
os.link('{}{}.ibd'.format(mysql_data_dir,table_name), '{}{}.ibd.h'.format(mysql_data_dir,table_name))
mysql.cursor.execute('CREATE TABLE {0}_back like {0}'.format(table_name))
mysql.connection.commit()
if condition_save:
mysql.cursor.execute("INSERT INTO {0}_back SELECT * FROM {0} WHERE {1} ;".format(table_name,condition_save))
mysql.connection.commit()
mysql.cursor.execute("drop table {}".format(table_name))
mysql.connection.commit()
mysql.cursor.execute("alter table {0}_back rename to {0};".format(table_name))
mysql.connection.commit()
os.unlink('{}{}.frm.h'.format(mysql_data_dir,table_name))
os.unlink('{}{}.ibd.h'.format(mysql_data_dir,table_name))
print('succeed: {}'.format(table_name))
具体步骤
### 找到frm,ibd文件
根据数据库存储路径找到需要删除的表名的frm,ibd文件。
### 建立硬连接
$ ln mytable.ibd mytable.ibd.h
$ ln mytable.frm mytable.frm.h
### 备份表结构
CREATE TABLE mytable_back like mytable;
### 备份想要保留的数据
INSERT INTO mytable_back SELECT * FROM mytable WHERE timestamp > '2020-02-27T00:00:00Z' ;
### 删除旧表
drop table mytable;
### 修改备份表名字
alter table mytable_back rename to mytable;
### 删除硬连接
$ rm -f mytable.frm.h mytable.ibd.h
参考: https://blog.csdn.net/weixin_34034261/article/details/86250223
相关文章
- jQuery 快速入门教程
- 80PPT 概率编程with Fast Exact Symbolic Inference 快速准确符号推理
- dpOracle Expdp快速导出数据表(oracle导出表exp)
- Linux操作:快速打开PDF文件的命令(linux打开pdf命令)
- MySQL:快速导入数据表结构(mysql导入数据表结构)
- MySQL中文参考手册:帮助你快速掌握MySQL(mysql中文参考手册)
- 利用Linux系统快速制作软件镜像(linux制作镜像)
- Mysql实现拼音快速检索汉字(mysql拼音查询汉字)
- 修改如何快速修改MySQL用户名密码(mysql用户名密码)
- MySQL遍历表数据:实现快速扫描(mysql遍历表数据)
- 网卡驱动程序安装Linux网口网卡驱动程序快速安装指南(linux网口)
- 服务Linux下快速启动邮件服务(linux启动邮件)
- Mysql: 快速构建数据表(mysql创建数据表)
- 连接MySQL服务器:快速开启你的数据库之旅(连接到mysql服务器)
- Oracle技巧:如何快速截取字符串前两位?(oracle截取前两位)
- Oracle数据库快速导入数据表(oracle imp 表)
- MySQL遍历数据表实现数据快速查询(mysql 遍历数据表)
- 如何快速使用MySQL查看数据表(mysql显示数据表)
- Oracle快速插入大量数据的简易指南(oracle插入大量数据)
- CDH集群中快速登录MySQL的方法(cdh集群登录mysql)
- 使用CMD命令快速删除Oracle数据表(cmd删除oracle表)