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. python windows下安装pip及rarfile

    python之所以被广泛使用,倒不见得是本身语法简单,而是而nodejs/javascript一样把三方库的依赖管理简化了,而不用和java一样非得通过maven管理,而且还得打包后在classpat ...

  2. java 从 PKCS12(比如pfx格式)证书中提取私钥证书(PrivateKey)和受信任的公钥证书(X509Certificate)的序列号(SerialNumber)

    import lombok.Cleanup; import lombok.Getter; import lombok.Setter; import lombok.SneakyThrows; impor ...

  3. Oracle的“ORA-00937: 不是单组分组函数” 如何解决?

    之前在编写oracle的sql语句时遇到这个问题,这里做个记录 问题描述:ORA-00937: 不是单组分组函数 问题原因:select语句中又在查询某一列的值,其中还有聚合函数 原先本人编写SQL是 ...

  4. SSL证书原理讲解

    一直以来都对数字证书的签发,以及信任等事情一知半解.总算有个闲适的周末来总结和深入一下相关的知识. CA: CA(Certificate Authority)是证书的签发机构,它是负责管理和签发证书的 ...

  5. npm和yarn常用调试命令

    yarn查看全局安装路径 yarn global dir npm查看所有全局安装的包<全局路径也会显示> npm list --depth=0 -global

  6. bootcss 之 .table-hover 类 鼠标悬停

    通过添加 .table-hover 类可以让 <tbody> 中的每一行对鼠标悬停状态作出响应. <table class="table table-hover" ...

  7. WebGL学习笔记(十五):模板缓冲

    可以用来干啥? 模板缓冲一般用来实现一些地面反射投影和类似镜子的特殊效果,如下: 开启模板缓冲 默认情况下,模板缓冲是关闭的,模板缓冲如果处于关闭状态,运行模板相关的代码不会报错,但是不会出现预期的效 ...

  8. Python 使用 paho-mqtt

    https://blog.csdn.net/weixin_41656968/article/details/80848542 https://blog.csdn.net/lhh08hasee/arti ...

  9. LeetCode 100. Same Tree (判断树是否完全相同)

    100. Same Tree Given two binary trees, write a function to check if they are the same or not. Two bi ...

  10. Docker使用 - 容器

    查看容器 命令:docker  ps  [options] options有: -a:查看所有容器,包含不在运行中的(不带-a参数,是只显示运行中的容器) -q:只显示容器ID -s:多加一列来显示总 ...