Oracle大表改为分区表及表空间切换方案
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方式插入
三、 迁移原则
- 将所有的索引都放在TM_INDX表空间
- 迁移后的表(或者分区)尽量均匀分布在新的表空间
- 选择合适的表结构(聚簇表、IOT、分区表…),提升查询性能、可维护性
- 合理设置表结构的参数,提升查询性能、节约存储空间
- 选择合适的索引(函数、位图…)、删除不合理的无用的索引
四、 迁移步骤
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大表改为分区表及表空间切换方案的更多相关文章
- Oracle在线重定义(online redefinition)--将普通表改为分区表
使用Oracle的在线重定义技术,可以将Oracle的普通表改为分区表.操作如下: STEP1:测试表是否可以在线重定义,这里以unixdev数据库的LIJIAMAN.BSTEST为例 EXEC DB ...
- SNF软件开发机器人-子系统-功能-功能类型(普通表改为树型表)
功能类型(普通表改为树型表) 功能类型分为普通功能和树形功能.因为资源表中不存在ParentId字段,故只能将多表的主表改为树型表. 1.效果展示: 2.使用说明: (1)当需要用一张普通的资源表显示 ...
- 【Teradata SQL】FALLBACK表改为NO FALLBACK表
FALLBACK表在数据库中会留存双份数据,增加了数据可用性,但浪费了存储空间.变更表属性语句如下: alter table tab_fallback ,no fallback;
- ORACLE普通表转换成分区表
转http://mp.weixin.qq.com/s?__biz=MzAwMjkyMjEwNg==&mid=2247484761&idx=1&sn=ce080581145931 ...
- oracle大数据量。表分区提示查询效率
现在业务有一张usertrack 日志记录表.每天会产生30万条数据.数据量大查询效率会非常慢 所以我考虑通过表分区来提示效率 逻辑上是一张表.但是分区后会按照分区条件将数据分在不同的物理文件 优点 ...
- 分区表,桶表,外部表,以及hive一些命令行小工具
hive中的表与hdfs中的文件通过metastore关联起来的.Hive的数据模型:内部表,分区表,外部表,桶表受控表(managed table):包括内部表,分区表,桶表 内部表: 我们删除表的 ...
- 使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响?
使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响? 1.问题:各操作间或者性能上会不会有影响? 如果有该如何解决? 多用户操作的影响主要是回锁定记录,oracl ...
- Oracle Temp表空间切换
来源于: http://www.2cto.com/database/201507/418564.html 一.TEMP表空间作用 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时 ...
- Oracle 11gR2 用exp无法导出空表解决方法
Oracle 11gR2 用exp无法导出空表解决方法 在11gR2中有个新特性,当表无数据时,不分配segment以节省空间.Oracle 当然在运行export导出时,空表则无法导出,可是还是有解 ...
随机推荐
- 删除DB2实例下的数据库
db2ilist 查看所有实例 db2 get instance 查看当前连接的实例 db2 list db directory 查看当前实例下连接的数据库 ==================== ...
- mybatis自定义插件(拦截器)开发详解
mybatis插件(准确的说应该是around拦截器,因为接口名是interceptor,而且invocation.proceed要自己调用,配置中叫插件)功能非常强大,可以让我们无侵入式的对SQL的 ...
- 【转】MySQL的安装与配置——详细教程-window系统下
https://www.cnblogs.com/winton-nfs/p/11524007.html 免安装版的Mysql MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库 ...
- css3中的盒子模型
1.示例一 实现左右布局,左侧宽度200px,右侧自适配 代码如下: <!DOCTYPE html> <html lang="en"> <head&g ...
- ESB企业服务总线到底是什么东西呢?
顾名思义,企业服务总线(ESB)就是一条企业架构的总线,所有的企业服务都挂接到该总线上对外公布,企业服务总线负责管理服务目录,解析服务请求者的请求方法.消息格式,并对服务提供者进行寻址,转发服务请求. ...
- 卷积神经网络概念及使用 PyTorch 简单实现
卷积神经网络 卷积神经网络(CNN)是深度学习的代表算法之一 .具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络”.随着深度学习理论的提出和数值计算设备 ...
- full text search
definition https://www.techopedia.com/definition/17113/full-text-search A full-text search is a comp ...
- PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习
1020 Tree Traversals (25分) Suppose that all the keys in a binary tree are distinct positive intege ...
- Hadoop深入学习之HA
1. 基本原理 2.x版本中,HDFS架构解决了单点故障问题,即引入双NameNode架构,同时借助共享存储系统来进行元数据的同步,共享存储系统类型一般有几类,如:Shared NAS+NFS.Boo ...
- EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器功能简介---实时数据统计报表、视频文件上传、点播、分享、集成
熟悉EasyDSS流媒体服务器的小伙伴应该都知道,EasyDSS通过将EasyRTMP推流的直播流进行直播转码.智能处理.视频分发,再通过 CDN 分发节点分发到终端播放 SDK为观众播放高清低延时的 ...