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

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

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

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

create table BSTEST_tmp
( TIMEKEY VARCHAR2(40),
ITEMNAME VARCHAR2(40),
SITENAME VARCHAR2(40),
SITEVALUE VARCHAR2(40)
)
partition by range (timekey)
( partition part_201711 values less than(‘201712010000000000000‘),
partition part_201712 values less than(‘201801010000000000000‘),
partition part_201801 values less than(‘201802010000000000000‘),
partition part_201802 values less than(‘201803010000000000000‘),
partition part_201803 values less than(‘201804010000000000000‘),
partition part_201804 values less than(‘201805010000000000000‘),
partition part_201805 values less than(‘201806010000000000000‘),
partition part_201806 values less than(‘201807010000000000000‘),
partition part_201807 values less than(‘201808010000000000000‘),
partition part_201808 values less than(‘201809010000000000000‘),
partition part_201809 values less than(‘201810010000000000000‘),
partition part_201810 values less than(‘201811010000000000000‘),
partition part_201811 values less than(‘201812010000000000000‘),
partition part_201812 values less than(‘201901010000000000000‘),
partition part_201901 values less than(‘201902010000000000000‘),
partition part_201902 values less than(‘201903010000000000000‘),
partition part_201903 values less than(‘201904010000000000000‘),
partition part_201904 values less than(‘201905010000000000000‘),
partition part_201905 values less than(‘201906010000000000000‘),
partition part_201906 values less than(‘201907010000000000000‘),
partition part_201907 values less than(‘201908010000000000000‘),
partition part_201908 values less than(‘201909010000000000000‘),
partition part_201909 values less than(‘201910010000000000000‘),
partition part_201910 values less than(‘201911010000000000000‘),
partition part_201911 values less than(‘201912010000000000000‘),
partition part_201912 values less than(‘202001010000000000000‘),
partition part_202001 values less than(‘202002010000000000000‘),
partition part_202002 values less than(‘202003010000000000000‘),
partition part_202003 values less than(‘202004010000000000000‘),
partition part_202004 values less than(‘202005010000000000000‘),
partition part_max values less than(maxvalue)
);

STEP3:执行在线重定义

exec dbms_redefinition.start_redef_table(‘LIJIAMAN‘, ‘BSTEST‘, ‘BSTEST_TMP‘);

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

STEP4:将中间表的内容与数据源同步

execute dbms_redefinition.sync_interim_table(‘LIJIAMAN‘, ‘BSTEST‘, ‘BSTEST_TMP‘);

STEP5:结束在线重定义

exec dbms_redefinition.finish_redef_table(‘LIJIAMAN‘, ‘BSTEST‘, ‘BSTEST_TMP‘);

STEP6:创建index、创建约束,两种方法创建速度差不多

alter session set db_file_multiblock_read_count=128;
alter table BSTEST add constraint BSPANELPROCESSDATAITEM_PKS primary key(timekey,itemname,sitename) using index local tablespace users;

STEP7:收集统计信息

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创建的中间表

drop table BSTEST_TMP;


如果要了解在线重定义的详细用法及使用注意事项,可参阅官方文档:
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)

原文地址:https://www.cnblogs.com/lijiaman/p/9985346.html

时间: 2024-10-07 23:08:27

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

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

实验环境:RHEL 6.4 + Oracle 11.2.0.3实验:在线重定义 普通表 为 分区表,包括主键对应的索引都改造为分区索引. 1,构造普通表t_objects conn test1/test1; create table t_objects as select * from dba_objects; SQL> select count(1) from t_objects; COUNT(1) ---------- 468738 --t_objects建立主键和索引 alter tabl

使用ORACLE在线重定义将普通表改为分区表

1.首先建立测试表,并插入测试数据: create table myPartition(id number,code varchar2(5),identifier varchar2(20)); insert into myPartition values(1,'01','01-01-0001-000001'); insert into myPartition values(2,'02','02-01-0001-000001'); insert into myPartition values(3,

oracle在线重定义表

在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统.Oracle提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就无法完成了.而且,对于被大量DML语句访问的表,幸运的是,Oracle从9i版本开始提供了在线重定义表功能,通过调用DBMS_REDEFINITION包,可以在修改表结构的同时允许DML操作. 在线重定义表具有以下功能:修改表的存储参数:可以将表转移到其他表空间:增加并行查询选项:增加或删除分区:重

一个完整的以在线重定义方式普通表转分区表的方案

1. 转分区表原因 生产数据库,一张表,一亿多行数据,绝大部分查询按月为维度做时间范围查 询,未分区状态下,查询IO量大,计划以分区截剪的方式减少IO量,提升前前台查询性能 2. 实施目的 将未分区的oXX_XXt_owner.id_oXXXdx_mX表以(stat_XXcle)字段为分区键,以在定义的方式转换成按月分区表的时间范围分区表,利且在线重定义的特性,保留权限的不漏赋以及极少时间的影响生产. 3. 注意事项 (1)       数据库若是双节点,只需在其中一个节点的数据库上实施. (2

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

Oracle大表改为分区表及表空间切换方案 一.            背景 由于之前数据库表和索引放在一个表空间导致表空间数据文件增长太快,文件数量即将达到Oracle表空间的限制,需要对表(没有分区,有些表数据量多达几十亿,文件大小TB级)进行表空间迁移,并对某些表改造为分区表. 二.            可选方案分析 1.    使用IMP/EXP 导入(import)导出(export)工具年头已久,将数据导出为二进制文件,将会在11g r2之后废弃,只用于遗留数据的导入导出 此工具可

ORACLE系统包DBMS_REDEFINITION实现表的在线重定义

ORACLE自带的DBMS_REDEFINITION包功能非常强大,可以用于降低高水位线,回收碎片空间,对表做在线重定义(添加或删除字段,改变字段类型,普通表重定义表为分区表,分区表重定义表为普通表等等) 另外,它有一个非常强大的功能,"在线"二字体现得淋漓尽致,但是也并不是完全的在线,因为在完成重定义前的最后一下,会持会表级排他锁,但这个锁定时间是可控的. 如果你也曾为delete无法降低高水位线而烦恼或者由于历史表太大导致维护困难,我相信这篇文章将对你有很大的感触,因此相信绝大朋友

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

今天在做数据抽取的时候,发现有一张业务表数据量达到了5000W,所以就想将此表改为分区表.分区表的有点如下: 1.改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度.2.增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用:3.维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可:4.均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能. 第一步:首先对要在线重定义的表自行验证,看该表是否可以重定义,如果不可以则会提示错误信息 SQL>

oracle 11g在线重定义 普通表变分区表

第一种方法使用主键id进行重定义--createusertestidentifiedby1accountunlock;--grantresource--grantcreateanytable,alteranytable,dropanytable,lockanytable,selectanytabletotest;--<1>创建测试表,以下使用在线重定义把表转换为分区表,created为分区键,object_id为.. v.17173.com/playlist_17354294.htmlv.17

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

1.1.TAB_TAOBAO_BILL 1.1.1检查下这张表是否可以在线重定义,无报错表示可以,报错会给出错误信息: exec dbms_redefinition.can_redef_table('ycheng', 'P_TAB_TAOBAO_BILL'); 1.1.2.expdp导出表进行备份(这里的DATA_PUMP_1目录是/data1/dpdump) expdp \'\/ as sysdba\' directory=DATA_PUMP_1 tables=TAB_TAOBAO_BILL