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

第一种方法

,,,,使用主键id进行重定义


——创建用户测试确认1账户解锁;,

——格兰特resource 

——格兰特创建任何表,改变任何表,删除任何表,锁定任何表,选择任何表测试;,

——& lt; 1比;创建测试表,以下使用在线重定义把表转换为分区表,创建为分区键,object_id为主键

删除表test01清洗;

创建表test01 select *从dba_objects object_id不是零,

alter table test01添加主键(object_id);,

select * from test01;


——& lt; 2比;创建分区表

创建表test01_new 

分区的范围(创建)

——区间(NUMTOYMINTERVAL(1月))

间隔(numtodsinterval(1天))

店(用户)

(

,分区p0值小于(to_date (' 2008-01-01 ', ' yyyy-mm-dd '))

),

select * from test01,创建不是零和1 !=1;

alter table test01_new添加主键(object_id);,


——判断目标表是否可以使用主键进行在线重定义,也可以使用rowid

exec dbms_redefinition。can_redef_table(‘测试’,‘TEST01 dbms_redefinition.cons_use_pk);


——把用户测试的TEST01表的定义改为test01_new表的定义

exec dbms_redefinition。start_redef_table(“测试”、“TEST01”、“TEST01_NEW”);


,将中间表与原始表同步。(仅当要对表TEST01进行更新时才需要执行该操作。)

exec dbms_redefinition。sync_interim_table(“测试”、“TEST01”、“TEST01_NEW”);


——结束重定义表

exec dbms_redefinition。finish_redef_table(“测试”、“TEST01”、“TEST01_NEW”);


——如果重定义失败,解锁

exec dbms_redefinition。abort_redef_table(“测试”、“TEST01”、“TEST01_NEW”);



——优点:

——保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。

——只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。

,而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。

——不足:实现上比上面两种略显复杂,适用于各种情况。

,然而,在线表格重定义也不是完美无缺的。下面列出了Oracle9i重定义过程的部分限制:

,你必须有足以维护两份表格拷贝的空间。

——你不能更改主键栏。

——表格必须有主键。

——必须在同一个大纲中进行表格重定义。

——在重定义操作完成之前,你不能对新加栏加以非空约束。

——表格不能包含长,BFILE以及用户类型(UDT)。

——不能重定义链表(群集表)。

——不能在系统和系统大纲中重定义表格。

——不能用具体化视图日志(物化视图日志)来重定义表格;不能重定义含有具体化视图的表格。

——不能在重定义过程中进行横向分集(水平构造子集)



第二种方法

使用rowid进行重定义,一般在没有主键的情况下使用


——其他如上

——判断目标表是否可以使用主键进行在线重定义,也可以使用rowid

exec dbms_redefinition。can_redef_table(‘测试’,‘TEST01 dbms_redefinition.cons_use_rowid);


——把用户测试的TEST01表的定义改为test01_new表的定义

exec dbms_redefinition。start_redef_table(‘测试’,‘TEST01’,‘TEST01_NEW’, null, 2),


,将中间表与原始表同步。(仅当要对表TEST01进行更新时才需要执行该操作。)

exec dbms_redefinition。sync_interim_table(“测试”、“TEST01”、“TEST01_NEW”);


——结束重定义表

exec dbms_redefinition。finish_redef_table(“测试”、“TEST01”、“TEST01_NEW”);


——如果重定义失败,解锁

exec dbms_redefinition。abort_redef_table(“测试”、“TEST01”、“TEST01_NEW”);


第三种方法

——& lt; 3祝辞重命名表

alter table test01 重命名test01_bak;

alter table test01_bak重命名test01 ;


——& lt; 4祝辞检查是否缺漏数据,补齐数据

select * from test01 t1

up_time不是零,索引键不能有空数据,否则插入失败

,和不存在(从test01 选择1;t2在t1。id=t2。id)


插入test01 

select * from test01_bak t1

up_time不是零,索引键不能有空数据,否则插入失败

,和不存在(从test01 选择1;,t2, t1。id=t2。id)

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