使用Oracle的在线重定义技术,可以将Oracle的普通表改为分区表。操作如下:

STEP1:测试表是否可以在线重定义,这里以unixdev数据库的LIJIAMAN.BSTEST为例

  1. EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('LIJIAMAN','BSTEST', DBMS_REDEFINITION.CONS_USE_PK);

如果表上没有主键,则会报错:
SQL> exec dbms_redefinition.start_redef_table('LIJIAMAN', 'BSTEST', 'BSTEST_TMP');
ORA-12089: 不能联机重新定义无主键的表 "LIJIAMAN"."BSTEST"
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 56
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1498
ORA-06512: 在 line 1

STEP2:创建中间表
除了表名称外,该中间表的形式需要与我们最终的分区表的形式一模一样,如列名,列的数据类型、分区字段,分区方法等。

如果要删除列,请不要在临时表的定义中包括它们。如果要添加列,则将列定义添加到临时表中。如果要修改列,请使用所需的属性在临时表中创建它。

不必使用重新定义该表的所有索引,约束,授予和触发器来创建临时表,因为在复制相关对象时,这些将在步骤5中定义。

  1. create table BSTEST_tmp
  2. ( TIMEKEY VARCHAR2(40),
  3. ITEMNAME VARCHAR2(40),
  4. SITENAME VARCHAR2(40),
  5. SITEVALUE VARCHAR2(40)
  6. )
  7. partition by range (timekey)
  8. ( partition part_201711 values less than(''),
  9. partition part_201712 values less than(''),
  10. partition part_201801 values less than(''),
  11. partition part_201802 values less than(''),
  12. partition part_201803 values less than(''),
  13. partition part_201804 values less than(''),
  14. partition part_201805 values less than(''),
  15. partition part_201806 values less than(''),
  16. partition part_201807 values less than(''),
  17. partition part_201808 values less than(''),
  18. partition part_201809 values less than(''),
  19. partition part_201810 values less than(''),
  20. partition part_201811 values less than(''),
  21. partition part_201812 values less than(''),
  22. partition part_201901 values less than(''),
  23. partition part_201902 values less than(''),
  24. partition part_201903 values less than(''),
  25. partition part_201904 values less than(''),
  26. partition part_201905 values less than(''),
  27. partition part_201906 values less than(''),
  28. partition part_201907 values less than(''),
  29. partition part_201908 values less than(''),
  30. partition part_201909 values less than(''),
  31. partition part_201910 values less than(''),
  32. partition part_201911 values less than(''),
  33. partition part_201912 values less than(''),
  34. partition part_202001 values less than(''),
  35. partition part_202002 values less than(''),
  36. partition part_202003 values less than(''),
  37. partition part_202004 values less than(''),
  38. partition part_max values less than(maxvalue)
  39. );

STEP3:执行在线重定义

  1. exec dbms_redefinition.start_redef_table('LIJIAMAN', 'BSTEST', 'BSTEST_TMP');

备注:该步骤执行时间较长,3.7GB的表执行了60s

STEP4:[可选] 将中间表的内容与数据源同步,减少执行“结束在线重定义”的时间

  1. execute dbms_redefinition.sync_interim_table('LIJIAMAN', 'BSTEST', 'BSTEST_TMP');

STEP5:添加索引,约束,授权和触发器

使用以下两种方法之一,将要重新定义的表中的依赖对象(例如触发器,索引,实例化视图日志,授权和约束)和统计信息复制到临时表中。方法1是首选方法,因为它比较自动,但是有时您可能会选择使用方法2。方法1还使您能够将表统计信息复制到临时表中。

方法1:自动创建从属对象
使用该COPY_TABLE_DEPENDENTS过程可在临时表上自动创建相关对象。此过程还注册从属对象。注册从属对象可以使这些对象及其复制的对等对象的身份稍后在重新定义完成过程中自动交换。结果是,重新定义完成后,从属对象的名称将与原始从属对象的名称相同。

  1. DECLARE
  2. num_errors PLS_INTEGER;
  3. BEGIN
  4. DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('LIJIAMAN', 'BSTEST', 'BSTEST_TMP',DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
  5. END;
  6. /

查看是否有错误信息:

  1. select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS;

方法2:手动创建从属对象
您可以在临时表上手动创建依赖对象。

  1. alter table BSTEST add constraint BSPANELPROCESSDATAITEM_PKS primary key(timekey,itemname,sitename) using index local tablespace users;

STEP6:结束在线重定义

  1. exec dbms_redefinition.finish_redef_table('LIJIAMAN', 'BSTEST', 'BSTEST_TMP');

STEP7:收集统计信息

  1. exec dbms_stats.gather_table_stats(ownname=>'LIJIAMAN', tabname=>'BSTEST', method_opt=> 'FOR ALL INDEXED COLUMNS', estimate_percent => 10, cascade=>true);

备注:该步骤执行时间较长,3.7GB的表执行了36s,如果嫌慢,可以并行收集

STEP8:确认无误之后,删除STEP2创建的中间表

  1. drop table BSTEST_TMP;

===========================

回退操作:如果执行过程中发生错误,可以使用以下语句回退

  1. BEGIN
  2. DBMS_REDEFINITION.ABORT_REDEF_TABLE(uname => 'LIJIAMAN',
  3. orig_table => 'BSTEST',
  4. int_table => 'BSTEST_TMP');
  5. END;
  6. /

如果要了解在线重定义的详细用法及使用注意事项,可参阅官方文档:
1. https://docs.oracle.com/cd/E11882_01/server.112/e25494/tables.htm#ADMIN11677
2. How To Partition Existing Table Using DBMS_REDEFINITION (文档 ID 472449.1)

Oracle在线重定义(online redefinition)--将普通表改为分区表的更多相关文章

  1. Oracle在线重定义DBMS_REDEFINITION 普通表—>分区表

    实验环境:RHEL 6.4 + Oracle 11.2.0.3实验:在线重定义 普通表 为 分区表,包括主键对应的索引都改造为分区索引. 1,构造普通表t_objects conn test1/tes ...

  2. oracle在线重定义表

    在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统.Oracle提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就 ...

  3. Oracle 在线重定义表分区

    ==================原始表================原始表=====================原始表 create table BUILDING_temp(building ...

  4. 在线重定义(Rdefine Table online)

    二.        概念理解 在线重定义用于对表的逻辑或者物理结构的修改,而且在修改时不影响表的可用性与传统方式相比.当一个表被重定义时,会被锁定为exclusive mode很短一段时间,这段时间的 ...

  5. 通过DBMS_REDEFINITION包对表在线重定义

    基础介绍 Oracle Online Redefinition可以保证在数据表进行DDL类型操作,如插入.删除数据列,分区处理的时候,还能够支持DML操作,特别是insert/update/delet ...

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

    Oracle大表改为分区表及表空间切换方案 一.            背景 由于之前数据库表和索引放在一个表空间导致表空间数据文件增长太快,文件数量即将达到Oracle表空间的限制,需要对表(没有分 ...

  7. oracle 11g 将非分区表转换为分区表在线重定义

    --操作的用户需要有以下的权限 GRANT CONNECT, RESOURCE TO CMIGDW; GRANT EXECUTE ON DBMS_REDEFINITION TO CMIGDW; GRA ...

  8. (Oracle)已有数据表建立表分区—在线重定义

    今天在做数据抽取的时候,发现有一张业务表数据量达到了5000W,所以就想将此表改为分区表.分区表的有点如下: 1.改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度.2.增强可用性: ...

  9. oracle普通表转分区表(在线重定义方式)

    1.1.TAB_TAOBAO_BILL 1.1.1检查下这张表是否可以在线重定义,无报错表示可以,报错会给出错误信息: exec dbms_redefinition.can_redef_table(' ...

随机推荐

  1. Scrapy爬虫requests

    requests 模块 模块的由来: 浏览器可以浏览网站, 是由于浏览器发送了requests , 各种请求.打开一个网站可能有几十到几百个请求. 从而服务器端会反馈各种因应不同请求生成的数据. 我们 ...

  2. 10分钟学会Less开发环境搭建与初体验

    Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充. 今天看一下,10分钟能不能手把手快速教会你Le ...

  3. ideal key

    常用快捷键 设置快捷键:File -> Settings -> IDE Settings -> Keymap -> 选择“eclipse” -> 然后“Copy”一份 - ...

  4. Perl学习笔记(1)----入门

    在UNIX/Linux 系统上,打开命令终端,输入 'rpm -q perl' 查看系统是否安装了 perl ---- 在自己的CentOS7 系统上,默认自带了 perl 软件: root@javi ...

  5. CentOS 7运维管理笔记(12)----GUI配置工具Webmin的安装

    早期的Linux系统管理员或是Web管理员在修改服务器配置时使用最多的就是vi编辑器,但是现在越来越多的基于GUI界面的配置工具出现了,毕竟人们还是喜欢以直接的可视化的方式来修改服务器的配置,而不是再 ...

  6. 大V云集!参加首届阿里巴巴在线技术峰会的八大理由

    由阿里巴巴集团.阿里巴巴技术协会(ATA)和阿里云云栖社区联合举办的首届阿里巴巴在线技术峰会(Alibaba Online Technology Summit)将于7月19日-21日20:00-21: ...

  7. Vue2.0中的Ajax请求

    Vue可以借助于vue-resource来实现Ajax请求 http请求报文 浏览器与服务器数据交互是遵循http协议的,当浏览器要访问服务器的时候,浏览器需要将相关请求数据提交给服务器. 格式分为: ...

  8. 十五、css3 Filter--滤镜

    如何实现下图的效果-—这里就用到了滤镜 给灰色弹框这个标签元素加“伪类”如下: #nearStoreContent .popChoose li:before { 1. z-index:; 2. pos ...

  9. c# 依赖注入之---setterInjection(转)

    图3.1 Setter注入示意 定义一个接口: namespace SetterInjection { internal interface IServiceClass { string Servic ...

  10. MYSQL 升序排序但值为0的排最后

    转载 http://blog.csdn.net/looksun/article/details/51445205 如一张表的数据如下: 需要根据gz列的值进行升序排序,但值为0的排在最后面,即最终结果 ...