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/passwd@sername 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/passwd123@sername 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/passwd123@sername 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。备份表已无用,可以删掉了。
oralce 超过1亿条数据的数据库表清理实践的更多相关文章
- 超过70亿条数据的mysql 去重
1.数据库层面: 2.业务层面:接口去重.浏览器显示端去重:
- 过千万、亿条数据的mysql表更新 mysql 线程状态
分段更新 UPDATE question SET `status`=1 WHERE status!=1 LIMIT 3000;UPDATE answer SET `status`=1 WHERE st ...
- net.sz.framework 框架 ORM 消消乐超过亿条数据排行榜分析 天王盖地虎
序言 天王盖地虎, 老婆马上生孩子了,在家待产,老婆喜欢玩消消乐类似的休闲游戏,闲置状态,无聊的分析一下消消乐游戏的一些技术问题: 由于我主要是服务器研发,客户端属于半吊子,所以就分析一下消消乐排行榜 ...
- 亿条数据在PHP中实现Mysql数据库分表100张
当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: $i=0; while($i<=9 ...
- 1亿条数据在PHP中实现Mysql数据库分表100张
当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: $i=0; while($i<=9 ...
- PostgreSQL中COUNT的各条件下(1亿条数据)例子
test=# insert into tbl_time1 select generate_series(1,100000000),clock_timestamp(),now(); INSERT 0 1 ...
- mysql 造1亿条记录的单表--大数据表
读写文件 背景及木:现有数据1000w单表,为压力测试准备1亿条数据. 步骤: 1.将1000w条记录,除id外都导入到多个文件中: //DELIMITER DROP PROCEDURE if EXI ...
- insert 一条数据 然后拿出这条数据在数据库中生成的ID
[insert 一条数据 然后拿出这条数据在数据库中生成的ID] <insert id="insert" parameterType="management&quo ...
- 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...
随机推荐
- js常用的数组去重方法
给出以下数组 var arr1 = new Array('1','2','3','3','5','4','5','6','5','5','88'); 实现对数组的去重 1. 双重for循环去重 Arr ...
- SpringMVC框架笔记02_参数绑定返回值文件上传异常处理器JSON数据交互_拦截器
目录 第1章 高级参数的绑定 1.1 参数的分类 1.2 数组类型的参数的绑定 1.3 集合类型的参数的绑定 第2章 @RequestMapping的用法 2.1 URL路径映射 2.2 请求方法限定 ...
- 编写订单支付api中遇到的问题
首先我是按照已经有的已经有的支付api去编写订单支付api,但是由于两者是有区别的,所以类似去搬用难免会出问题,首先我是套用已经写好的model,然后写相应的serializer,实现序列化之后就开始 ...
- 搭建exsi主机6.5版本
1.服务器读取到镜像,进入此图: 2.回车或者F11安装进行下一步 至此exsi主机安装和配置IP完成(80和443端口的开关会影响远程登录) 在浏览器输入IP登录exsi主机 正常安装centos就 ...
- java容器二:List接口实现类源码分析
一.ArrayList 1.存储结构 动态数组elementData transient Object[] elementData; 除此之外还有一些数据 //默认初始容量 private stati ...
- java基础(10)---leetcode的String、数组以及集合的一些使用
整数 一.整数反转_7 /* 12345 变成 54321 */ public class 整数反转_7 { public static void main(String[] args){ int x ...
- minhash pyspark 源码分析——hash join table是关键
从下面分析可以看出,是先做了hash计算,然后使用hash join table来讲hash值相等的数据合并在一起.然后再使用udf计算距离,最后再filter出满足阈值的数据: 参考:https:/ ...
- 用数组实现strstr函数
用数组实现strstr函数char * mystrstr(char * dest, char *src){ int i = 0; int j = 0; //匹配个数 int count = 0; in ...
- 【Java】《Java程序设计基础教程》第三章学习
3.1 类 类在Java语言中是一种最基本的引用数据类型,是组成Java程序的基本要素.具有相同属性(状态)和方法(行为)的一组对象的集合称为类,其内部包括属性和方法两个主要部分. 3.11 类的定义 ...
- 结构型模式(二) 桥接模式(Bridge)
一.动机(Motivation) 在很多游戏场景中,会有这样的情况:[装备]本身会有的自己固有的逻辑,比如枪支,会有型号的问题,同时现在很多的游戏又在不同的介质平台上运行和使用,这样就使得游戏的[装备 ...