Oracle-在线重定义操作文档

2015年10月8日

15:51

在线重定义的大致操作流程如下:

(1)创建基础表A,如果存在,就不需要操作。

(2)创建临时的分区表B。

(3)开始重定义,将基表A的数据导入临时分区表B。

(4)结束重定义,此时在DB的 Name Directory里,已经将2个表进行了交换。即此时基表A成了分区表,我们创建的临时分区表B 成了普通表。 此时我们可以删除我们创建的临时表B。它已经是普通表。

下面看一个示例:

1. 创建基本表和索引

SQL> create table unpar_table (id number(10) primary key,create_date date);

Table created.

SQL>  insert into unpar_table select rownum, created from dba_objects;

72491 rows created.

SQL> create index create_date_ind on unpar_table(create_date);

Index created.

SQL> commit;

Commit complete.

2. 收集表的统计信息

SQL> exec dbms_stats.gather_table_stats(ownname=>'dev',tabname=>'unpar_table', cascade => true);

PL/SQL procedure successfully completed.

3. 创建临时分区表

SQL> create table par_table (id number primary key, time date) partition by range (time) (partition p1 values less than (to_date('2004-7-1', 'yyyy-mm-dd')),partition p2 values less than (to_date('2005-1-1', 'yyyy-mm-dd')),partition p3 values less than (to_date('2005-7-1', 'yyyy-mm-dd')),partition p4 values less than (maxvalue));

Table created.

4. 进行重定义操作

4.1 检查重定义的合理性

SQL> exec dbms_redefinition.can_redef_table(uname=>'dev',tname=>'unpar_table');

PL/SQL procedure successfully completed.

4.2 如果4.1 没有问题,开始重定义,这个过程可能要等一会。

这里要注意:如果分区表和原表列名相同,可以用如下方式进行:

SQL>  BEGIN

DBMS_REDEFINITION.start_redef_table(

uname => 'dev',

orig_table => 'unpar_table',

int_table => 'par_table');

end;

/

BEGIN

*

ERROR at line 1:

ORA-42016: shape of interim table does not match specified column mapping

ORA-06512: at "SYS.DBMS_REDEFINITION", line 52

ORA-06512: at "SYS.DBMS_REDEFINITION", line 1646

ORA-06512: at line 2

如果分区表的列名和原表不一致,那么在开始重定义的时候,需要重新指定映射关系:

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE('dev','unpar_table','par_table','ID  ID, create_date  TIME',DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL procedure successfully completed.

这一步操作结束后,数据就已经同步到这个临时的分区表里来了。

4.3 同步新表,这是可选的操作

SQL> begin

dbms_redefinition.sync_interim_table(

uname => 'DEV',

orig_table => 'unpar_table',

int_table => 'par_table');

end;

/

PL/SQL procedure successfully completed.

4.4 创建索引,在线重定义只重定义数据,索引还需要单独建立。

SQL>  create index create_date_ind2 on par_table(time);

Index created.

4.5 收集新表的统计信息

SQL> exec dbms_stats.gather_table_stats(ownname=>'dev',tabname=>'par_table', cascade => true);

PL/SQL procedure successfully completed.

4.6 结束重定义

SQL> begin

dbms_redefinition.finish_redef_table(

uname => 'dev',

orig_table => 'unpar_table',

int_table => 'par_table');

end;

/

PL/SQL procedure successfully completed.

结束重定义的意义:

基表unpar_table 和临时分区表par_table 进行了交换。 此时临时分区表par_table成了普通表,我们的基表unpar_table成了分区表。

我们在重定义的时候,基表unpar_table是可以进行DML操作的。 只有在2个表进行切换的时候会有短暂的锁表。

5. 删除临时表

SQL> DROP TABLE par_table;

表已删除。

6. 索引重命名

SQL> ALTER INDEX create_date_ind2 RENAME TO create_date_ind;

索引已更改。

7. 验证

SQL>  select partitioned from user_tables where table_name = 'UNPAR_TABLE';

PAR

---

YES

SQL>  select partition_name from user_tab_partitions where table_name = 'UNPAR_TABLE';

PARTITION_NAME

------------------------------

P1

P2

P3

P4

SQL>  select count(*) from unpar_table;

COUNT(*)

----------

72500

SQL> select count(*) from unpar_table partition (p4);

COUNT(*)

----------

72500

SQL> select count(*) from par_table;

COUNT(*)

----------

72500

SQL> select count(*) from unpar_table partition (p1);

COUNT(*)

----------

0

SQL> select count(*) from unpar_table partition (p2);

COUNT(*)

----------

0

已使用 Microsoft OneNote 2010 创建
一个用于存放所有笔记和信息的位置

Oracle-在线重定义操作文档的更多相关文章

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

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

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

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

  3. oracle在线重定义表

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

  4. Oracle 在线重定义表分区

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

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

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

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

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

  7. Oracle 12C 新特性之在线重命名、迁移活跃的数据文件

    Oracle 数据库 12c 版本中对数据文件的迁移或重命名不再需要太多繁琐的步骤,可以使用 ALTER DATABASE MOVE DATAFILE 这样的 SQL 语句对数据文件进行在线重命名和移 ...

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

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

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

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

随机推荐

  1. 加快AndroidStudio运行速度的方法

    之前用过其他人加速AndroidStudio构建速度的方法,确实在编译时有一定的效果 但是在实际使用中,随着项目越来越大,AndroidStudio有时还是会卡死,或者直接黑屏,我的笔记本是8g内存 ...

  2. Tomcat默认打开项目设置

    Tomcat设置默认启动项目 Tomcat设置默认启动项目,顾名思义,就是让可以在浏览器的地址栏中输入ip:8080,就能访问到我们的项目.具体操作如下: 1.打开tomcat的安装根目录,找到Tom ...

  3. mind nerverr later(转)

    每个人都有感到失落迷惘的时候.人生用专制又霸道的方式运行着,每当我们心想一切尘埃落定.生活稳固的时候,生活总爱给我们惊喜,粉碎我们短暂的安逸,让我们不得不重新思考—_— “我走对路了吗?” “我能够赚 ...

  4. SQL语句 远程操作数据库

    --远程操作数据库SQL语句exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '211.81.251.85 'exec sp_addlinkedsr ...

  5. BZOJ3036: 绿豆蛙的归宿&Wikioi2488:绿豆蛙的归宿

    3036: 绿豆蛙的归宿 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 108  Solved: 73[Submit][Status] Descript ...

  6. 博弈论(男人八题):POJ 1740 A New Stone Game

    A New Stone Game Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5694   Accepted: 3119 ...

  7. Java---基于TCP协议的相互即时通讯小程序

    这是几年前,新浪的一个面试题~要求是3天之内实现~ 通过TCP 协议,建立一个服务器端. 通过配置服务器端的IP和端口: 客户端之间就可以相互通讯~ 上线了全部在线用户会收到你上线的通知. 下线了全部 ...

  8. JavaScript高级程序设计4.pdf

    虽然执行环境的类型总共只有两种——全局和局部(函数),但还有其他方法延长作用域链,有些语句可以在作用域链的前端临时增加一个变量对象,执行后会被移除try-catch语句的catch块和with语句 w ...

  9. PHP用ajia代码写三级联动下拉

    下面是我做三级联动下拉的步骤以及逻辑 第一步:先做一个省市区表格 第二步:建个PHP页面显示用我是在<body>里放<div>用来接收要显示的省市区表格信息,里面嵌入jquer ...

  10. 不区分大小写的in_array实现 thinkphp框架

    // 不区分大小写的in_array实现 function in_array_case($value,$array) { return in_array(strtolower($value),arra ...