您的位置:首页 > 数据库 > Oracle

ORACLE在线重定义

2016-07-21 11:52 489 查看
1、检查是否能够重定义

EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('用户名', '源表', DBMS_REDEFINITION.CONS_USE_PK);

2、开始重定义

EXEC DBMS_REDEFINITION.START_REDEF_TABLE('用户名', '源表','目标表');

3、复制约束,索引,授权

DECLARE

num_errors PLS_INTEGER;

begin

DBMS_REDEFINITION.copy_table_dependents(uname=> '用户名',

                                                   orig_table    => '源表',

                                                   int_table     => '目标表',

                                                   num_errors => num_errors,copy_statistics => true);

end;

/

4、同步数据

EXEC  dbms_redefinition.sync_interim_table(uname=> '用户名',orig_table => '源表',int_table  => '目标表');

5、结束

EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('用户名', '源表','目标表');

6、若死掉了,用这句终止
EXEC DBMS_REDEFINITION.abort_redef_table('用户名', '源表','目标表');

7、一般会遇到一个bug,

ORA-01442: 要修改为 NOT NULL 的列已经是 NOT NULL

11G可以忽略继续执行,但需要检查是否有无效对象

8、对于有外键的一定要格外小心,外键还是会指定到创建的INIT新表,导致报错

重定义物化视图,定义为有分区的视图

create  materialized view FACT_MV_CLI_AREACODE

partition by range(COMDATE)

(

partition P_2013 values less than (TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),

partition P_2014 values less than (TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),

partition P_2015 values less than (TO_DATE(' 2016-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),

partition P_2016 values less than (TO_DATE(' 2017-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),

partition P_2017 values less than (TO_DATE(' 2018-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),

partition P_2018 values less than (TO_DATE(' 2019-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))

)

tablespace 表空间 

nologging

build immediate 

REFRESH COMPLETE ON DEMAND

WITH ROWID

enable query rewrite

as

原视图查询语句;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: