oralce 超过1亿条数据的数据库表清理实践

2018-08-18 16:58 无腿鸟 阅读(331) 评论(0) 编辑 收藏

问题:当一个表的数据量超过一亿条,要删除其中的5000w条,如何处理

如果直接使用delete语句,会涉及到到大量的磁盘IO,并产生大量的数据库日志,效率很低,删除速度慢,可能导致事务中断,甚至有服务器硬盘空间撑爆的可能。

本文提供的思路是先将数据表需要保留的数据不带索引导出,然后导入一个新表中 ,对新表重建索引后将老表、新表进行重命名,这样就完成了删除操作,效率有了很大提升。

主要分为三步,1.数据导出2. 数据导入 3.表以及索引重命名 。下面脚本是运行在oracle数据库上。

具体步骤如下:

1.数据导出:

进入数据库:sqlplus ,输入用户名与密码。进入sql运行界面。

创建虚拟目录:create or replace directory exp_dir as ‘/home/oracle/‘;

给目录授权,若失败继续:grant read,write on directory exp_dir to oracle;

提交:commit;

退出数据库:exit;

导出全量数据: expdp user/[email protected]  dumpfile=exp_table_eg_his_bak.dmp directory=exp_dir  tables= exp_table_eg_his  compression=all

dumpfile是指明dump文件名,directory是上面建立的虚拟目录,tables指明要导出的表。compression说明要对数据进行压缩,减少磁盘占用。数据量比较大,导出时间长,建议后台运行。

如果没有数据库用户密码,可使用操作系统oracle的权限以管理员身份进行导出。脚本如下:

expdp \‘/ as sysdba \‘   dumpfile= exp_table_eg_his.bak .dmp directory=exp_dir tables= user.exp_table_eg_his compression=all

注意,exp_table_eg_his前要加user.,用以说明是哪个用户的表。导出全量的数据只是为了备份而已。

导出保留数据 :

expdp user/[email protected]  dumpfile=exp_table_eg_his_new.dmp directory=exp_dir tables= exp_table_eg_his Query=\"where plat_number like \‘2018%\‘\"  exclude=index

这里需要注意,query查询条件中的“”,‘’都要用\进行转义,否则会报错,exclude参数用来排除索引,oracle的索引是全局的,相同的索引名只能存在一个,为了后续方便导入,需要导出时把索引排除。

2. 数据导入:

impdp user/[email protected]  directory=exp_dir dumpfile=exp_table_eg_his_new.dmp remap_table= exp_table_eg_his: exp_table_eg_his _new

remap_table用来将导入时将dump的表映射为新的表名。

进入数据库:进入toad

重建索引:

create unique  INDEX exp_table_eg_his_ix_new ON exp_table_eg_his_new    (plat_number)  。

关于建索引,最好将原表的的索引创建脚本导出,修改下索引名字与表名,这样可以保证索引的参数一致。

3. 重命名表与索引:

表重命名:alter table exp_table_eg_his rename to exp_table_eg_his _bak

alter table exp_table_eg_his _new rename to exp_table_eg_his

索引重命名:

alter index exp_table_eg_his_ix rename to exp_table_eg_his_ix_bak

alter index exp_table_eg_his_ix_new rename to exp_table_eg_his_ix

如果代码中没有显式用到索引名字,在数据库表重命名后索引也可以不用重命名。

删除原his表:drop table exp_table_eg_his_bak。备份表已无用,可以删掉了。

原文地址:https://www.cnblogs.com/lcword/p/11553117.html

时间: 2024-10-17 08:56:17

oralce 超过1亿条数据的数据库表清理实践的相关文章

亿条数据在PHP中实现Mysql数据库分表100张

当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: 1 $i=0; 2 while($i<=99){ 3 echo "$newNumber \r\n"; 4 $sql="CREATE TABLE `code_".$i."` ( 5  `full_code` char(10) NOT NULL, 6  `create_time` int(10) 

mysql 造1亿条记录的单表--大数据表

读写文件 背景及木:现有数据1000w单表,为压力测试准备1亿条数据. 步骤: 1.将1000w条记录,除id外都导入到多个文件中: //DELIMITER DROP PROCEDURE if EXISTS createManyTable; create PROCEDURE createManyTable() BEGIN DECLARE i int; DECLARE fileName VARCHAR(30); set i=1; while i<251 DO SET fileName=CONCAT

通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中  先看一下我要实现的功能界面:   这个界面的功能在图中已有展现,课程分配(教师教授哪门课程)在之前的页面中已做好.这个页面主要实现的是授课,即给老师教授的课程分配学生.此页面实现功能的步骤已在页面中有所体现,这里不再赘述,此篇文章主要介绍:我是如何通过js从前台获取数

sql*loader的使用(iostat数据导入数据库表)

目的:将iostat指令的数据,导入到文件iostat.dat中,然后通过sqlldr将iostat数据倒入到数据库中 第一步:U1/tiger用户建立表iostat create table iostat(device varchar(10),tps float(20),mb_read_s float(20),mb_wrtn_s float(20) ,mb_read float(20),mb_wrtn float(20)); 第二步:创建源数据文件 Iostat –md /dev/sda2 >

一张6亿条数据表引发的事故

业务人员告诉我某系统磁盘IO持续高达300MB/s,系统平台为AIX,遂 topas 查看果然如此. 用下面脚本到Oracle数据库中看了一下: SELECT Disk_Reads DiskReads, Executions, SQL_ID, SQL_Text SQLText, SQL_FullText SQLFullText FROM ( SELECT Disk_Reads, Executions, SQL_ID, LTRIM(SQL_Text) SQL_Text, SQL_FullText,

1.3万亿条数据查询如何做到毫秒级响应?

关注微信公众号"程序员黄小斜",选择"置顶或者星标" 一起成为更好的自己! ![](https://img2018.cnblogs.com/blog/1813797/201912/1813797-20191230133159470-930879899.jpg) 作者:孙晓光 出处:http://itindex.net/ 知乎,在古典中文中意为"你知道吗?",它是中国的 Quora,一个问答网站,其中各种问题由用户社区创建,回答,编辑和组织. 作为

《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

  先看一下我要实现的功能界面:   这个界面的功能在图中已有展现,课程分配(教师教授哪门课程)在之前的页面中已做好.这个页面主要实现的是授课,即给老师教授的课程分配学生.此页面实现功能的步骤已在页面中有所体现,这里不再赘述,此篇文章主要介绍:我是如何通过js从前台获取数据,然后通过ajax技术向后台一般处理程序传递JSON,后台又是如何获取传来的JSON,并对JSON数据转换,然后将转换后的数据写入数据库的! 介绍这些步骤实现前,先说说自己的辛酸:絮叨辛酸,是因为为了实现这个功能,我真的用了很

保存 http request 的数据到数据库表

开发需求:把 http request 对象的数据保存到数据库中 第一步:编写 RequestInfoService 类,保存方法名是 saveRequestInfo // 保存request信息 public void saveRequestInfo(HttpServletRequest request){ Connection conn = null; PreparedStatement pstmt = null; BaseDao baseDao = new BaseDao(); try {

Excel表数据导入数据库表中

***Excel表数据导入到数据库表中 通过数据库表的模板做成‘Excel’表的数据导入到数据库相应的表中(注意:主表 和 从表的关系,要先导‘主表’在导入从表) 过程:通过数据库的导入工具—先导入为一张临时表,在插入到正式表中.语句如下: --YK_TYPK插入数据 insert into YK_TYPK --插入'YK_TYPK(通用品库)'数据 select * from Sheet1$_TYPK_caoyao ---------------------------------------