我拿联机在线重定义常用的作用:
1)回收高水位
2)将普通表转化为分区表
--因为对象改变了,同义词失效,相关存储过程失效
--索引名字和表空间能保持不变
--默认需要主键进行重定义,否则使用rowid
--检查是否可以在线重定义
begin
DBMS_REDEFINITION.CAN_REDEF_TABLE (
uname => 'COMM',
tname => 'ACTION_PRESENT_RECODE',
options_flag => DBMS_REDEFINITION.CONS_USE_PK, --DBMS_REDEFINITION.CONS_USE_ROWID
part_name => NULL);
end ;
/
--按照在线重定义后的最终表结构,创建中间表
create table INT_ACTION_PRESENT_RECODE as select * from ACTION_PRESENT_RECODE WHERE 1=2 ;
实际执行的过程中,还是得把表的ddl定义给捞出来,重新执行一遍。
使用create table as的方法会丢失很多东西,比如字段的default值、comment等。
尤其是default值会导致应用出问题。
--开始重定义过程
begin
DBMS_REDEFINITION.START_REDEF_TABLE (
uname => 'COMM',
orig_table => 'ACTION_PRESENT_RECODE',
int_table => 'INT_ACTION_PRESENT_RECODE',
col_mapping => NULL,
options_flag => DBMS_REDEFINITION.CONS_USE_PK,
orderby_cols => NULL,
part_name => NULL);
end;
/
--将相关的表信息拷贝过去
--Automatically create any triggers, indexes, grants, and constraints.
DECLARE
num_errors PLS_INTEGER;
begin
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
uname => 'COMM',
orig_table => 'ACTION_PRESENT_RECODE',
int_table => 'INT_ACTION_PRESENT_RECODE',
copy_indexes => 1,
copy_triggers => TRUE,
copy_constraints => TRUE,
copy_privileges => TRUE,
ignore_errors => FALSE,
num_errors => num_errors,
copy_statistics => TRUE);
end ;
/
--将重定义过程的变化量同步过去
begin
DBMS_REDEFINITION.SYNC_INTERIM_TABLE (
uname => 'COMM',
orig_table => 'ACTION_PRESENT_RECODE',
int_table => 'INT_ACTION_PRESENT_RECODE',
part_name => NULL);
end ;
/
--结束重定义
begin
DBMS_REDEFINITION.FINISH_REDEF_TABLE (
uname => 'COMM',
orig_table => 'ACTION_PRESENT_RECODE',
int_table => 'INT_ACTION_PRESENT_RECODE',
part_name => NULL);
end ;
/
--如果有错误,用该过程强制结束重定义过程
begin
DBMS_REDEFINITION.ABORT_REDEF_TABLE (
uname => 'COMM',
orig_table => 'ACTION_PRESENT_RECODE',
int_table => 'INT_ACTION_PRESENT_RECODE',
part_name => NULL);
end ;
/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10867315/viewspace-712992/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10867315/viewspace-712992/