第一种方法
,,,,使用主键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)