热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

oracle11g在线重定义(onlineredefinition)介绍

【实验】对于在线重定义的步骤,这里不再具体说明,我们通过一个实验来演示一下,下面是一个把普通表转换成分区表在线重定义的例子一、首先创建用户tj,并授予能够完成在线重定义的权限和角色SQLcreateusertjidentifiedbytj2defaulttablespaceu

【实验】 对于在线重定义的步骤,这里不再具体说明,我们通过一个实验来演示一下,下面是一个把普通表转换成分区表在线重定义的例子 一、首先创建用户tj,并授予能够完成在线重定义的权限和角色 SQL create user tj identified by tj 2 default tablespace u

【实验】

对于在线重定义的步骤,这里不再具体说明,我们通过一个实验来演示一下,下面是一个把普通表转换成分区表在线重定义的例子

一、首先创建用户tj,并授予能够完成在线重定义的权限和角色

SQL> create user tj identified by tj

2 default tablespace users

3 temporary tablespace temp

4 quota unlimited on users;

User created.

SQL> GRANT CREATE SESSION, CREATE ANY TABLE,ALTER ANY TABLE,

2 DROP ANY TABLE, LOCK ANY TABLE ,SELECT ANY TABLE,

3 CREATE ANY INDEX,CREATE ANY TRIGGER

4 TO TJ;

Grant succeeded.

SQL> GRANT EXECUTE_CATALOG_ROLE TO TJ;

Grant succeeded.

二、使用TJ用户登录,创建表DEMO,作为在线重定义的原始表,在表上添加主键和一个索引

SQL> conn tj/tj

Connected.

SQL> create table demo as select empno,ename,sal,deptno from scott.emp;

Table created.

SQL> set linesize 120

SQL> set pagesize 60

SQL> select * from demo;

EMPNO ENAME SAL DEPTNO

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

7369 SMITH 6000 20

7499 ALLEN 1600 30

7521 WARD 1250 30

7566 JONES 2975 20

7654 MARTIN 1250 30

7698 BLAKE 2850 30

7782 CLARK 2450 10

7788 SCOTT 1000 20

7839 KING 5000 10

7844 TURNER 1500 30

7876 ADAMS 1100 20

7900 JAMES 950 30

7902 FORD 3000 20

7934 MILLER 1300 10

14 rows selected.

SQL> alter table demo add constraint demo_pk primary key(empno);

Table altered.

SQL> create index demo_idx on demo(ename);

Index created.

SQL> select object_id,object_name,object_type,status from user_objects;

OBJECT_ID OBJECT_NAME OBJECT_TYPE STATUS

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

77125 DEMO TABLE VALID

77126 DEMO_PK INDEX VALID

77127 DEMO_IDX INDEX VALID

三、使用CAN_REDEF_TABLE确认表是否可以做在线重定义

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('TJ', 'DEMO');

PL/SQL procedure successfully completed.

四、创建中间表,当然这是一个空表,使用START_REDEF_TABLE开始在线重定义

SQL> create table demo_tmp

2 partition by range(deptno)

3 (

4 partition p1 values less than (11),

5 partition p2 values less than (21),

6 partition p3 values less than (31)

7 )

8 as

9 select * from demo where 1=2;

Table created.

SQL> select object_id,object_name,object_type,status from user_objects;

OBJECT_ID OBJECT_NAME OBJECT_TYPE STATUS

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

77129 DEMO_TMP TABLE VALID

77130 DEMO_TMP TABLE PARTITION VALID

77132 DEMO_TMP TABLE PARTITION VALID

77131 DEMO_TMP TABLE PARTITION VALID

77127 DEMO_IDX INDEX VALID

77126 DEMO_PK INDEX VALID

77125 DEMO TABLE VALID

7 rows selected.

SQL> BEGIN

2 DBMS_REDEFINITION.START_REDEF_TABLE('TJ', 'DEMO', 'DEMO_TMP');

3 END;

4 /

PL/SQL procedure successfully completed.

SQL> select object_id,object_name,object_type,status from user_objects;

OBJECT_ID OBJECT_NAME OBJECT_TYPE STATUS

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

77134 RUPD$_DEMO TABLE VALID

77133 MLOG$_DEMO TABLE VALID

77129 DEMO_TMP TABLE VALID

77130 DEMO_TMP TABLE PARTITION VALID

77132 DEMO_TMP TABLE PARTITION VALID

77131 DEMO_TMP TABLE PARTITION VALID

77127 DEMO_IDX INDEX VALID

77126 DEMO_PK INDEX VALID

77125 DEMO TABLE VALID

9 rows selected.

我们注意到Oracle新建了两张表RUPD$_DEMO和MLOG$_DEMO,其实Oracle在线重定义是通过物化视图的LOG来实现的。做完这一步后,在中间表中也有了相同的数据

SQL> select * from demo;

EMPNO ENAME SAL DEPTNO

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

7369 SMITH 6000 20

7499 ALLEN 1600 30

7521 WARD 1250 30

7566 JONES 2975 20

7654 MARTIN 1250 30

7698 BLAKE 2850 30

7782 CLARK 2450 10

7788 SCOTT 1000 20

7839 KING 5000 10

7844 TURNER 1500 30

7876 ADAMS 1100 20

7900 JAMES 950 30

7902 FORD 3000 20

7934 MILLER 1300 10

14 rows selected.

SQL> select * from demo_tmp;

EMPNO ENAME SAL DEPTNO

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

7782 CLARK 2450 10

7839 KING 5000 10

7934 MILLER 1300 10

7369 SMITH 6000 20

7566 JONES 2975 20

7788 SCOTT 1000 20

7876 ADAMS 1100 20

7902 FORD 3000 20

7499 ALLEN 1600 30

7521 WARD 1250 30

7654 MARTIN 1250 30

7698 BLAKE 2850 30

7844 TURNER 1500 30

7900 JAMES 950 30

14 rows selected.

五、使用COPY_TABLE_DEPENDENTS把原始表的权限、约束、索引、物化视图LOG在中间表上创建一份

SQL> set serveroutput on

SQL> var v_err number

SQL> exec DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('TJ', 'DEMO', 'DEMO_TMP', NUM_ERRORS => :V_ERR);

PL/SQL procedure successfully completed.

SQL> print v_err

V_ERR

----------

0

SQL> select object_id,object_name,object_type,status from user_objects;

OBJECT_ID OBJECT_NAME OBJECT_TYPE STATUS

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

77137 TMP$$_DEMO_PK0 INDEX VALID

77138 TMP$$_DEMO_IDX0 INDEX VALID

77134 RUPD$_DEMO TABLE VALID

77133 MLOG$_DEMO TABLE VALID

77129 DEMO_TMP TABLE VALID

77130 DEMO_TMP TABLE PARTITION VALID

77132 DEMO_TMP TABLE PARTITION VALID

77131 DEMO_TMP TABLE PARTITION VALID

77127 DEMO_IDX INDEX VALID

77126 DEMO_PK INDEX VALID

77125 DEMO TABLE VALID

11 rows selected.

SQL> select table_name,index_name,status from user_indexes where table_name='DEMO_TMP';

TABLE_NAME INDEX_NAME STATUS

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

DEMO_TMP TMP$$_DEMO_IDX0 VALID

DEMO_TMP TMP$$_DEMO_PK0 VALID

这里我们看到,Oracle在中间表DEMO_TMP上又根据原始表DEMO建了两个索引

六、如果在线重定义的时间比较长,而在这个过程中有其他的DML语句操作在原始表上,Oracle通过SYNC_INTERIM_TABLE来做同步

SQL> insert into demo values(1000,'TOMMY',1350,10);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from demo;

EMPNO ENAME SAL DEPTNO

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

7369 SMITH 6000 20

7499 ALLEN 1600 30

7521 WARD 1250 30

7566 JONES 2975 20

7654 MARTIN 1250 30

7698 BLAKE 2850 30

7782 CLARK 2450 10

7788 SCOTT 1000 20

7839 KING 5000 10

7844 TURNER 1500 30

7876 ADAMS 1100 20

7900 JAMES 950 30

7902 FORD 3000 20

7934 MILLER 1300 10

1000 TOMMY 1350 10

15 rows selected.

SQL> select * from demo_tmp;

EMPNO ENAME SAL DEPTNO

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

7782 CLARK 2450 10

7839 KING 5000 10

7934 MILLER 1300 10

7369 SMITH 6000 20

7566 JONES 2975 20

7788 SCOTT 1000 20

7876 ADAMS 1100 20

7902 FORD 3000 20

7499 ALLEN 1600 30

7521 WARD 1250 30

7654 MARTIN 1250 30

7698 BLAKE 2850 30

7844 TURNER 1500 30

7900 JAMES 950 30

14 rows selected.

上面插入一条记录到原始表DEMO中,中间表上是看不到的,这个操作会被记录在MLOG$_DEMO中,需要我们主动同步到DEMO_TMP中

SQL> desc MLOG$_DEMO

Name Null? Type

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

EMPNO NUMBER(4)

DMLTYPE$$ VARCHAR2(1)

OLD_NEW$$ VARCHAR2(1)

CHANGE_VECTOR$$ RAW(255)

XID$$ NUMBER

SQL> select empno,DMLTYPE$$,OLD_NEW$$ from MLOG$_DEMO;

EMPNO D O

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

1000 I N

SQL> EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('TJ', 'DEMO', 'DEMO_TMP');

PL/SQL procedure successfully completed.

SQL> select * from demo;

EMPNO ENAME SAL DEPTNO

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

7369 SMITH 6000 20

7499 ALLEN 1600 30

7521 WARD 1250 30

7566 JONES 2975 20

7654 MARTIN 1250 30

7698 BLAKE 2850 30

7782 CLARK 2450 10

7788 SCOTT 1000 20

7839 KING 5000 10

7844 TURNER 1500 30

7876 ADAMS 1100 20

7900 JAMES 950 30

7902 FORD 3000 20

7934 MILLER 1300 10

1000 TOMMY 1350 10

15 rows selected.

SQL> select * from demo_tmp;

EMPNO ENAME SAL DEPTNO

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

7782 CLARK 2450 10

7839 KING 5000 10

7934 MILLER 1300 10

1000 TOMMY 1350 10

7369 SMITH 6000 20

7566 JONES 2975 20

7788 SCOTT 1000 20

7876 ADAMS 1100 20

7902 FORD 3000 20

7499 ALLEN 1600 30

7521 WARD 1250 30

7654 MARTIN 1250 30

7698 BLAKE 2850 30

7844 TURNER 1500 30

7900 JAMES 950 30

15 rows selected.

SQL> select empno,DMLTYPE$$,OLD_NEW$$ from MLOG$_DEMO;

no rows selected

严格意义上来说,第六步不是必须的,当做第七步的时候,Oracle会自动同步数据,不过这样会加长表不可用的时间,所以还是建议我们单独做

七、完成在线重定义,在这一步中,要对原始表DEMO以独占的方式锁定。

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('TJ', 'DEMO', 'DEMO_TMP');

PL/SQL procedure successfully completed.

SQL> select object_id,object_name,object_type,status from user_objects;

OBJECT_ID OBJECT_NAME OBJECT_TYPE STATUS

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

77129 DEMO TABLE VALID

77130 DEMO TABLE PARTITION VALID

77131 DEMO TABLE PARTITION VALID

77132 DEMO TABLE PARTITION VALID

77125 DEMO_TMP TABLE VALID

77138 DEMO_IDX INDEX VALID

77127 TMP$$_DEMO_IDX0 INDEX VALID

77137 DEMO_PK INDEX VALID

77126 TMP$$_DEMO_PK0 INDEX VALID

9 rows selected.

操作完成后,我们发现RUPD$_DEMO和MLOG$_DEMO被自动删除,另外我们也可以看到重定义的效果了

SQL> SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'DEMO';

TABLE_NAME PARTITION_NAME

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

DEMO P1

DEMO P2

DEMO P3

SQL> select table_name,index_name,status from user_indexes where table_name='DEMO';

TABLE_NAME INDEX_NAME STATUS

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

DEMO DEMO_IDX VALID

DEMO DEMO_PK VALID

SQL> select table_name,index_name,status from user_indexes where table_name='DEMO_TMP';

TABLE_NAME INDEX_NAME STATUS

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

DEMO_TMP TMP$$_DEMO_IDX0 VALID

DEMO_TMP TMP$$_DEMO_PK0 VALID

SQL> select * from demo partition(p1);

EMPNO ENAME SAL DEPTNO

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

7782 CLARK 2450 10

7839 KING 5000 10

7934 MILLER 1300 10

1000 TOMMY 1350 10

推荐阅读
  • 如何在不同数据库中提取前N%的记录
    本文详细介绍了如何在SQL Server、Oracle和MySQL等不同数据库中提取前N%的记录。通过具体的示例和代码,帮助读者理解和掌握这些方法。 ... [详细]
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • 解决SQL Server数据库sa登录名无法连接的问题
    在安装SQL Server数据库后,使用Windows身份验证成功,但使用SQL Server身份验证时遇到问题。本文将介绍如何通过设置sa登录名的密码、启用登录名状态以及开启TCP协议来解决这一问题。 ... [详细]
  • 在将Web服务器和MySQL服务器分离的情况下,是否需要在Web服务器上安装MySQL?如果安装了MySQL,如何解决PHP连接MySQL服务器时出现的连接失败问题? ... [详细]
  • SQL 连接详解与应用
    本文详细介绍了 SQL 连接的概念、分类及实际应用,包括内连接、外连接、自连接等,并提供了丰富的示例代码。 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • 本文介绍了如何在 Spring 3.0.5 中使用 JdbcTemplate 插入数据并获取 MySQL 表中的自增主键。 ... [详细]
  • BIEE中的最终用户界面被称为Presentation Layer(展现层)。展现层呈现的内容与用户在Web报表开发界面中看到的一致,使用业务语言进行描述,隐藏了技术细节,如星型模型。本文将详细介绍展现层的设计要点及其与业务模型层的关系。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • PHP 使用 Cookie 进行访问授权的方法
    本文介绍了如何使用 PHP 和 Cookie 实现访问授权,包括表单验证、数据库查询和会话管理等关键步骤。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 操作系统如何通过进程控制块管理进程
    本文详细介绍了操作系统如何通过进程控制块(PCB)来管理和控制进程。PCB是操作系统感知进程存在的重要数据结构,包含了进程的标识符、状态、资源清单等关键信息。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 深入解析HTML5字符集属性:charset与defaultCharset
    本文将详细介绍HTML5中新增的字符集属性charset和defaultCharset,帮助开发者更好地理解和应用这些属性,以确保网页在不同环境下的正确显示。 ... [详细]
author-avatar
繁华落尽的星空
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有