Oracle大表改为分区表及表空间切换方案

一、            背景

由于之前数据库表和索引放在一个表空间导致表空间数据文件增长太快,文件数量即将达到Oracle表空间的限制,需要对表(没有分区,有些表数据量多达几十亿,文件大小TB级)进行表空间迁移,并对某些表改造为分区表。

二、            可选方案分析

1.    使用IMP/EXP

导入(import)导出(export)工具年头已久,将数据导出为二进制文件,将会在11g r2之后废弃,只用于遗留数据的导入导出

此工具可以完成所需功能,但有如下限制:

1)         导出数据量大时非常慢,只能分批操作

2)         不支持表名映射,需要第三个用户或者数据库参与

3)         需要操作用户有DBA权限

4)         需要有IMP/EXP工具操作权限

5)         在客户端操作,受到网络影响

2.    使用IMPDP/IMPDP

EXPDP/IMPDP工具从10g开始引入,参数格式与EXP/IMP类似

优点:

1)         可以并发执行导入导出任务

2)         可以导入导出多个文件

3)         无需缓存,直接操作数据库和目标文件

4)         不受网络影响,expdp服务端程序

5)         支持对象映射,可直接映射表空间和表

6)         可以从未分区表导入到分区表

缺点:

1)         需要服务器约5TB的磁盘空间来存储二进制文件,可以分批导出

2)         一次性导入undo空间要足够大

3.    使用alter table ** move tablespace ***

此命令是将一个表移动到另外一个表空间中

优点:

1)         对于大表move时,对此表的查询不受影响,只有DML操作受影响

2)         索引结构不受影响,只需move完成后rebuild

3)         与其它对象依赖关系不受影响,操作前不必为对象间的依赖关系操心

4)         move操作可以parallel。

5)         NOLOGGING选项可大大加快重建速度,如果要move的表是nologging的,则不需指定

缺点:

1)         当前的用户必须对原表空间和新表空间都有操作权限

2)         不能改变表结构从普通表转换为分区表

3)         数据太大可能操作不成功

4)         经过验证不会释放原表空间数据文件已经格式化的磁盘空间

5)         当目标表空间不足时会中途才提示失败

4.    采用表重定义

把一个数据量非常大的普通表改造成分区表,如果离线操作能够解决问题,就不要用在线重定义,例如一些静态数据、历史数据的归档迁移,可使用CTAS、alter table move、或导出导入完成

使用场景:

1)         修改表的物理属性、存储参数

2)         将表迁移到别的表空间

3)         消除表碎片、释放空间

4)         在表中增加、删除或重命名字段

5)         大批量改变表中的数据

原理:

通过DBMS_REDEFINITION包来实现,首先会创建一个快速刷新的物化视图作为过渡表,然后将源表的数据加载到过渡表中,并在源表上创建物化视图日志,以支持快速刷新同步数据

限制条件与风险:

1)         使用基于主键的方式,则原表与重定义后的表必须有相同的主键

2)         使用基于ROWID的方式,不能是索引组织表

3)         有物化视图或者物化视图日志的表、物化视图容器表、高级队列表、索引组织表的溢出表、拥有BFILE,LOGN列的表、 Cluster表、sys和system下的表、临时表不能在线重定义

4)         不支持水平数据子集

5)         在列映射时只能使用有确定结果的表达式,如子查询就不行

6)         中间表有新增列,则不能有NOT NULL约束

7)         原表和中间表之间不能有引用完整性

8)         在线重定义无法采用nologging

9)         表空间至少要留有比源表所用空间更大的剩余空间,也就说至少要事先创建5T的表空间

10)     对业务的影响小,但过程耗时较长,测试两千万的数据花费十多分钟   20

11)     如果源表上的事务操作过于频繁,可能会发生较严重的等待,不存在事务

参考:https://www.sohu.com/a/166577098_505827

5.    采用CATS +RENAME

CTAS这种方法采用DDL语句,不产生UNDO,只产生少量REDO,建表后数据已经在分布到各个分区中,最后交换源表与目标表的名字即可

核心sql:create table t(id, time) partition by range (time) (partition t1 values less than (to_date('201311', 'yyyymm')), partition t2 values less than (maxvalue)) nologging parallel 4 as select /*+parallel*/ id, time from s;

性能提升方式:

1)   加nologging:alter table t nologging;完成后根据需要将表修改为logging

2)   并行DDL: alter session enable parallel dml;

3)         查询并行

6.    采用INSERT+RENAME

这种方法适用于包含大数据量的表转到分区表中的一个分区的操作,就是先建立分区表结构然后使用insert来实现,将满足一个分区的数据查到某个中间表中,然后交换中间表和目标表的分区,每个部分都做完后交换源表与目标表的名字(alter table p exchange partition p1 with table t)。

性能提升:

1)         表修改为nologging

2)         启用并行DML,alter session enable parallel dml;

3)         采用 append方式插入

4)         所有数据插入完成后再建索引

不足:

1)         仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据,不过当前不存在

2)         要求数据分布到多个分区中,会增加操作的复杂度,效率也会降低

7.    数据清洗方式

这种方法就是先建立表结构,然后建立任务每个一段时间,从源表查询一定时间方位内的数据插入到新表中,最后交换源表与目标表的名字,操作简单。

性能提升:

5)         表修改为nologging,

6)         数据插入完成后再建索引

7)         启用并行DML,alter session enable parallel dml;

8)         采用 append方式插入

三、            迁移原则

  1. 将所有的索引都放在TM_INDX表空间
  2. 迁移后的表(或者分区)尽量均匀分布在新的表空间
  3. 选择合适的表结构(聚簇表、IOT、分区表…),提升查询性能、可维护性
  4. 合理设置表结构的参数,提升查询性能、节约存储空间
  5. 选择合适的索引(函数、位图…)、删除不合理的无用的索引

四、            迁移步骤

1.    小表

对于小表或者数据量稳定的表不需要分区,不需要做表空间迁移,或者直接采用方案5(ctas+rename)方式均匀迁移到新的表空间中

2.    迁移大表

首先排除方案3(不能释放空间)和方案4(效率低,基本不涉及事务)

1)         确认需要操作的表(迁移、重建、删除)

2)         删除功能重复的表

3)         先迁移数据量相对比较小的表(10-100G),分别验证方案1、2、5、6、7的效率和可行性

4)         根据验证结果选择最优的方式迁移大表

3.    索引

将用不到的索引删除

将所有放在TM_DATA表空间的索引rebuild到TM_INDX表空间

Oracle大表改为分区表及表空间切换方案的更多相关文章

  1. Oracle在线重定义(online redefinition)--将普通表改为分区表

    使用Oracle的在线重定义技术,可以将Oracle的普通表改为分区表.操作如下: STEP1:测试表是否可以在线重定义,这里以unixdev数据库的LIJIAMAN.BSTEST为例 EXEC DB ...

  2. SNF软件开发机器人-子系统-功能-功能类型(普通表改为树型表)

    功能类型(普通表改为树型表) 功能类型分为普通功能和树形功能.因为资源表中不存在ParentId字段,故只能将多表的主表改为树型表. 1.效果展示: 2.使用说明: (1)当需要用一张普通的资源表显示 ...

  3. 【Teradata SQL】FALLBACK表改为NO FALLBACK表

    FALLBACK表在数据库中会留存双份数据,增加了数据可用性,但浪费了存储空间.变更表属性语句如下: alter table tab_fallback ,no fallback;

  4. ORACLE普通表转换成分区表

    转http://mp.weixin.qq.com/s?__biz=MzAwMjkyMjEwNg==&mid=2247484761&idx=1&sn=ce080581145931 ...

  5. oracle大数据量。表分区提示查询效率

    现在业务有一张usertrack 日志记录表.每天会产生30万条数据.数据量大查询效率会非常慢 所以我考虑通过表分区来提示效率  逻辑上是一张表.但是分区后会按照分区条件将数据分在不同的物理文件 优点 ...

  6. 分区表,桶表,外部表,以及hive一些命令行小工具

    hive中的表与hdfs中的文件通过metastore关联起来的.Hive的数据模型:内部表,分区表,外部表,桶表受控表(managed table):包括内部表,分区表,桶表 内部表: 我们删除表的 ...

  7. 使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响?

    使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响? 1.问题:各操作间或者性能上会不会有影响? 如果有该如何解决? 多用户操作的影响主要是回锁定记录,oracl ...

  8. Oracle Temp表空间切换

    来源于:  http://www.2cto.com/database/201507/418564.html 一.TEMP表空间作用 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时 ...

  9. Oracle 11gR2 用exp无法导出空表解决方法

    Oracle 11gR2 用exp无法导出空表解决方法 在11gR2中有个新特性,当表无数据时,不分配segment以节省空间.Oracle 当然在运行export导出时,空表则无法导出,可是还是有解 ...

随机推荐

  1. NioEventLoopGroup源码分析与线程设定

    我的以Netty Socket编程的代码为例, 1.EventLoopGroup 进入EventLoopGroup,这是一个特殊的EventExecutorGroup,在事件循环中,在selectio ...

  2. p7zip p7zip -d 7z

  3. arris1750 pandorabox安装bandwidthd之后带宽监控(nlbwmon)报资源不足

    nlbwmon 报错资源不足不能看的原因很可能是内存不足导致,因为重启进程会概率可用一下,且删除老的数据后又好用了. 可能与设置的最大数据库条数有关,条数过大导致申请内存大,改成默认的10000. 可 ...

  4. R3300L Android相关的记录

    在寻找高版本Android固件的过程中遇到一个Android6.0的固件, 刷上去之后发现没有Root. 因为原发布者设置了收费的QQ群, 固件开机图上就是QQ群号, 满以为交了钱之后应该能有Root ...

  5. sql server中raiserror的用法(动态参数传值)

    1.raiserrror定义: 返回用户定义的错误信息并设系统标志,记录发生错误.通过使用 RAISERROR 语句,客户端可以从 sysmessages 表中检索条目, 或者使用用户指定的严重度和状 ...

  6. Scrapy爬虫Demo 爬取资讯分类

    爬取新浪网导航页所有下所有大类.小类.小类里的子链接,以及子链接页面的新闻内容. 效果演示图: items.py import scrapy import sys reload(sys) sys.se ...

  7. 如何分析redis中的慢查询

    慢查询的两个参数配置 慢查询只记录命令执行时间,并不包括命令排队和网络传输时间.因此客户端执行命令的时间会大于命令实际执行时间.因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求 ...

  8. fatal error: sys/videoio.h: No such file or directory

    Determining if the include file sys/videoio.h exists failed with the following output:Change Dir: /h ...

  9. Celery-系统守护进程

    1. 使用systemd控制Celery 用法: systemctl {start|stop|restart|status} celery.service 配置文件: /etc/celery/cele ...

  10. General VDPConfig对讲配置工具

    General VDPConfig大华楼宇对讲配置工具是ConfigTool的一个对讲模块,主要服务对象为可视对讲的门口机和室内机,大华可视对讲在独户应用中,利用了自身在视频监控领域的优势,充分整合了 ...