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亿条数据的数据库表清理实践的更多相关文章

  1. 超过70亿条数据的mysql 去重

    1.数据库层面: 2.业务层面:接口去重.浏览器显示端去重:

  2. 过千万、亿条数据的mysql表更新 mysql 线程状态

    分段更新 UPDATE question SET `status`=1 WHERE status!=1 LIMIT 3000;UPDATE answer SET `status`=1 WHERE st ...

  3. net.sz.framework 框架 ORM 消消乐超过亿条数据排行榜分析 天王盖地虎

    序言 天王盖地虎, 老婆马上生孩子了,在家待产,老婆喜欢玩消消乐类似的休闲游戏,闲置状态,无聊的分析一下消消乐游戏的一些技术问题: 由于我主要是服务器研发,客户端属于半吊子,所以就分析一下消消乐排行榜 ...

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

    当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: $i=0; while($i<=9 ...

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

    当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: $i=0; while($i<=9 ...

  6. PostgreSQL中COUNT的各条件下(1亿条数据)例子

    test=# insert into tbl_time1 select generate_series(1,100000000),clock_timestamp(),now(); INSERT 0 1 ...

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

    读写文件 背景及木:现有数据1000w单表,为压力测试准备1亿条数据. 步骤: 1.将1000w条记录,除id外都导入到多个文件中: //DELIMITER DROP PROCEDURE if EXI ...

  8. insert 一条数据 然后拿出这条数据在数据库中生成的ID

    [insert 一条数据 然后拿出这条数据在数据库中生成的ID] <insert id="insert" parameterType="management&quo ...

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

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

随机推荐

  1. mysql57重新安装后无法再次启动mysql57服务“本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动。”--解决方法

    本地计算机上的MySQL服务启动后停止.某些服务在未由其他服务或程序使用时将自动. (win10,mysql5.7+) 解决方法: 第一步:查看MySQL57安装路径 只要在programData路径 ...

  2. 关于SqlServer数据库数据备份失败的问题

    当备份的失败,出现说什么应该支持多少个介质簇,但实际出现了多少介质簇,这个时候就要考虑备份的地址是不是出现问题. 首先,检查备份地址,是不是多于两个以上,那么在备份的时候应该注意,备份地址最好留一个, ...

  3. Host is not allowed to connect to this MySQL server

    解决方法: [root@GYQ-Prod-Zabbix ~]# mysql -u root -p Enter password: Welcome to the MariaDB monitor. Com ...

  4. Android自动化测试探索(四)uiautomator2简介和使用

    uiautomator2简介 项目Git地址: https://github.com/openatx/uiautomator2 安装 #1. 安装 uiautomator2 使用pip进行安装, 注意 ...

  5. linux 进程管理与调度(一)

    进程结构 进程在内核的源代码中以结构体表示,篇幅很长,在此列举一小段关键代码,可以发现是个双向链表,具体的可以在内核目录下找一个叫"sched.h"的头文件. struct tas ...

  6. DevExpress中实现GridControl的分页功能

    DevExpress中如何实现GridControl的分页功能 简介:DevExpress中如何实现GridControl的分页功能, 主要是利用DataNavigator和GridControl组合 ...

  7. 三大框架整合模板ssh

    1.web.xml配置 <!-- 让spring随web启动而创建的监听器 --> <listener> <listener-class>org.springfra ...

  8. Mac上搭建Python集成环境

    Jenkins安装 第一种方式下载安装包 官网 https://jenkins.io/download/ 下载安装包 第二种通过homebrew安装,前提需要安装jdk(推荐) brew instal ...

  9. LeetCode 321. Create Maximum Number

    原题链接在这里:https://leetcode.com/problems/create-maximum-number/description/ 题目: Given two arrays of len ...

  10. 013——MATLAB硬件支持包离线下载

    (一)参考文献:https://blog.csdn.net/hyperorbit/article/details/88095384 (二)去下列网址下载离线包下载工具:https://ww2.math ...