基于dbms_redefinition在线重定义表(二)

2014-11-24 08:53:44 · 作者: · 浏览: 3
NUM_ROWS
------------------------------ ----------
TB_EMP 0
TB_EMP_INT 0
--对重定义表执行DML操作
--此时使用了dbms_lock.sleep (5),也就是整个操作完成需要500s,我们在这个期间实施重定义
scott@USBO> get ins_tb_emp.sql
1 DECLARE
2 v_deptno NUMBER (2);
3 BEGIN
4 FOR i IN 1 .. 100
5 LOOP
6 IF MOD (i, 2) = 0
7 THEN
8 v_deptno := 10;
9 ELSE
10 v_deptno := 20;
11 END IF;
12 INSERT INTO tb_emp
13 SELECT i,
14 'Name_' || TO_CHAR (i),
15 'Job_' || TO_CHAR (i),
16 TO_CHAR (SYSDATE, 'yyyymmdd hh24:mi:ss'),
17 i + 100,
18 v_deptno
19 FROM DUAL;
20 dbms_lock.sleep (5);
21 COMMIT;
22 END LOOP;
23* END;
24 /
--下面再开启一个新的session,用于在线重定义表
scott@USBO> set serveroutput on;
--校验表能否被重定义
scott@USBO> exec dbms_redefinition.can_redef_table('SCOTT','TB_EMP');
--开始重定义
scott@USBO> exec dbms_redefinition.start_redef_table('SCOTT', 'TB_EMP', 'TB_EMP_INT',-
> 'EMPNO EMPNO, ENAME NAME, SAL*1.10 SALARY, HIREDATE HIREDATE,DEPTNO DEPTNO');
--可以从视图user_snapshots查询到临时表的信息
scott@USBO> select name,table_name,updatable,status from user_snapshots;
NAME TABLE_NAME UPD STATUS
------------------------------ ------------------------------ --- -------
TB_EMP_INT TB_EMP_INT NO VALID
--查看表tb_emp_int,此时也有5条记录被插入
scott@USBO> select count(*) from tb_emp_int;
COUNT(*)
----------
5
--正在插入到tb_emp_int产生的日志信息,从6开始,实际上执行start_redef_table时前5条记录已经被复制到临时表
scott@USBO> select * from mlog$_tb_emp;
EMPNO SNAPTIME$$ D O CHANGE_VEC XID$$
---------- ----------------- - - ---------- ----------
6 40000101 00:00:00 I N FE 1.4074E+15
7 40000101 00:00:00 I N FE 5.6299E+14
8 40000101 00:00:00 I N FE 2.2519E+15
9 40000101 00:00:00 I N FE 1.4075E+15
scott@USBO> select * from rupd$_tb_emp;
no rows selected
--检查约束等是否已经添加到临时表
scott@USBO> select constraint_name,table_name,status from user_constraints where table_name='TB_EMP_INT';
no rows selected
--注册依赖对象
scott@USBO> exec dbms_redefinition.register_dependent_object('SCOTT', 'TB_EMP', 'TB_EMP_INT', -
> dbms_redefinition.cons_trigger, 'SCOTT', 'tr_bf_tb_emp_hiredate', 'tr_bf_tb_emp_int_hiredate');
PL/SQL procedure successfully completed.
scott@USBO> select constraint_name,table_name,status from user_constraints where table_name='TB_EMP_INT';
no rows selected
--将重定义表的依赖对象复制到临时表
scott@USBO> DECLARE
2 retval NUMBER (5);
3 BEGIN
4 DBMS_REDEFINITION.copy_table_dependents ('SCOTT', 'TB_EMP', 'TB_EMP_INT', 0,
5 copy_constraints => TRUE,
6 num_errors => retval);
7 DBMS_OUTPUT.put_line (retval);
8 END;
9 /
PL/SQL procedure successfully completed.
--查看临时表上的依赖对象,可以看到出现了以TMP$$开头的相关约束
scott@USBO> select constraint_name,table_name,status from user_constraint