Streams Replication Practice: Table Level

--------------------------------------------------------------------------------------------------------------------

配置工作...

1. 首先在源数据库和目标数据上都将相关的参数设置好,(参见http://www.cnblogs.com/fangwenyu/archive/2011/03/07/1970260.html

   Source Database:lo.oracle.com

SQL> select global_name from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
LO.ORACLE.COM

SQL
> show parameter streams_pool_size

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
streams_pool_size big integer 200M

SQL
> show parameter global_names

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean TRUE

SQL
> show parameter compatible

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 10.2.0.1.0

SQL
> show parameter job_queue

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 10

SQL
> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online
log sequence 1812
Next log sequence to archive 1814
Current log sequence 1814
SQL
>

   Destination Database: orcl.oracle.com

SQL> select global_name from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
ORCL.ORACLE.COM

SQL
> show parameter streams_pool_size

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
streams_pool_size big integer 200M

SQL
> show parameter global_names

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean TRUE

SQL
> show parameter compatible

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 10.2.0.1.0

SQL
> show parameter job_queue

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 10


2.  在源数据和目标数据上创建专属于streams的用户, 并赋予相应的权限

SQL> create tablespace streams_tbs
2 datafile 'streams_tbs01.dbf'
3 size 25m;

Tablespace created.

SQL
> create user strmadmin identified by strmadmin
2 default tablespace streams_tbs
3 quota unlimited on streams_tbs;

User created.

SQL
> grant dba, select_catalog_role to strmadmin;

Grant succeeded.


 3. 在source database 上用schema strmamdin 创建连接到target database的db link

-- on source db: lo.oracle.com

SQL> conn strmadmin/strmadmin
Connected.
SQL
> create database link orcl.oracle.com
2 connect to strmadmin identified by strmadmin
3 using 'orcl';

Database link created.

SQL
> select * from dual@orcl.oracle.com;

D
-
X

4. 分别在source database和target database创建队列

-- source databse: lo.oracle.com

SQL> show user
USER is "STRMADMIN"
SQL
> exec dbms_streams_adm.set_up_queue();

PL
/SQL procedure successfully completed.

SQL
> select * from streams_queue_table;

no rows selected

-- target database: orcl.oracle.com

SQL> show user
USER is "STRMADMIN"
SQL
> exec dbms_streams_adm.set_up_queue();

PL
/SQL procedure successfully completed.

SQL
> select * from streams_queue_table;

no rows selected

5. 在源数据上配置capture streams

SQL> begin
2 dbms_streams_adm.add_table_rules
3 ( table_name => 'scott.emp',
4 streams_type => 'capture',
5 streams_name => 'capture_stream',
6 queue_name => 'strmadmin.streams_queue',
7 include_dml => true,
8 include_ddl => true,
9 inclusion_rule => true);
10 end;
11 /

PL
/SQL procedure successfully completed.

这时候可以查看dba_capture看看capture的状态...

SQL> select capture_name, status, captured_scn, applied_scn from dba_capture;

CAPTURE_NAME STATUS CAPTURED_SCN APPLIED_SCN
------------------------------ -------- ------------ -----------
CAPTURE_STREAM DISABLED

注意这个时候capture process还没有启动,因此状态还是'disbabled', 而且captured_scn 和 applied_scn都为空。

注意到source database的alert文件的变化...

注意到虽然我没有显示给source database设置supplemental logging, 数据库已经“偷偷”地在database level设置了minimal supplemental logging了...

Tue Mar 01 19:48:11 2011
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
Tue Mar
01 19:48:11 2011
SUPLOG: Updated supplemental logging attributes at scn
= 66589705
SUPLOG: minimal = ON, primary key = OFF
SUPLOG: unique = OFF, foreign key = OFF, all column = OFF

Completed:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
Tue Mar
01 19:48:11 2011
ALTER SYSTEM ARCHIVE LOG
Tue Mar
01 19:48:11 2011
Thread
1 cannot allocate new log, sequence 1807
Private strand flush
not complete
Current log# 2 seq# 1806 mem# 0: C:\ORACLE\PRODUCT\10.2.0\ORADATA\LO\REDO02.LOG
Tue Mar
01 19:48:12 2011
Thread
1 advanced to log sequence 1807 (LGWR switch)
Current log# 3 seq# 1807 mem# 0: C:\ORACLE\PRODUCT\10.2.0\ORADATA\LO\REDO03.LOG
Tue Mar
01 19:48:13 2011
Tue Mar
01 19:48:13 2011
Logminer Bld: Build started
Tue Mar
01 19:48:14 2011
Thread
1 advanced to log sequence 1808 (LGWR switch)
Current log# 1 seq# 1808 mem# 0: C:\ORACLE\PRODUCT\10.2.0\ORADATA\LO\REDO01.LOG
Tue Mar
01 19:48:14 2011
Tue Mar
01 19:48:14 2011
Logminer Bld: Lockdown Complete. DB_TXN_SCN
is 0 66589705
Tue Mar
01 19:48:30 2011
ALTER SYSTEM ARCHIVE LOG
Tue Mar
01 19:48:30 2011
Thread
1 cannot allocate new log, sequence 1809
Checkpoint not complete
Current log# 1 seq# 1808 mem# 0: C:\ORACLE\PRODUCT\10.2.0\ORADATA\LO\REDO01.LOG
Tue Mar
01 19:48:33 2011
Thread
1 advanced to log sequence 1809 (LGWR switch)
Current log# 2 seq# 1809 mem# 0: C:\ORACLE\PRODUCT\10.2.0\ORADATA\LO\REDO02.LOG
Tue Mar
01 19:48:34 2011
Tue Mar
01 19:48:34 2011
Logminer Bld: Done

6. 在源数据上配置Propagation streams.

SQL> begin
2 dbms_streams_adm.add_table_propagation_rules
3 ( table_name => 'scott.emp',
4 streams_name => 'sour_to_targ',
5 source_queue_name => 'strmadmin.streams_queue',
6 destination_queue_name => 'strmadmin.streams_queue@orcl.oracle.com',
7 include_dml => true,
8 include_ddl => true,
9 source_database => 'lo.oracle.com',
10 inclusion_rule => true,
11 queue_to_queue => true);
12 end;
13 /

PL
/SQL procedure successfully completed.

也可以查询dba_propagation来查看propagation process的状态信息,

SQL> select propagation_name, status from dba_propagation;

PROPAGATION_NAME STATUS
------------------------------ --------
SOUR_TO_TARG ENABLED

而且这个时候会发现多了一个job, 

SQL> select job, what from dba_jobs;

JOB
----------
WHAT
--------------------------------------------------------------------------------
38
next_date := sys.dbms_aqadm.aq$_propaq(job);

21
EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();


SQL
>

7. 切换到目标数据,配置apply streams


SQL> begin
2 dbms_streams_adm.add_table_rules
3 ( table_name => 'scott.emp',
4 streams_type => 'apply',
5 streams_name => 'apply_stream',
6 queue_name => 'strmadmin.streams_queue',
7 include_dml => true,
8 include_ddl => true,
9 source_database => 'lo.oracle.com',
10 inclusion_rule => true);
11 end;
12 /

PL
/SQL procedure successfully completed.

SQL
> select apply_name, status from dba_apply;

APPLY_NAME STATUS
------------------------------ --------
APPLY_STREAM DISABLED

8. 给目标数据库设置instantiation scn.


因为source database 和 target database都有表scott.emp, 因此不需要通过exp/imp来进行数据的导出和导入,只需要给target database设置一下instantiation scn就可以了。

首先获得source database的scn,

-- lo.oracle.com

SQL> select dbms_flashback.get_system_change_number() from dual;

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()
-----------------------------------------
66592260

然后在target database上执行如下操作...

-- orcl.oracle.com

SQL> show user
USER is "STRMADMIN"

SQL
> begin
2 dbms_apply_adm.set_table_instantiation_scn
3 (source_object_name => 'scott.emp',
4 source_database_name => 'lo.oracle.com',
5 instantiation_scn => 66592260);
6 end;
7 /

PL
/SQL procedure successfully completed.

9. 在target数据上启动apply process...

SQL> show user
USER is "STRMADMIN"
SQL
> begin
2 dbms_apply_adm.start_apply
3 ('apply_stream');
4 end;
5 /

PL
/SQL procedure successfully completed.

这个时候可以在alert文件中看到类似如下内容...

Streams APPLY A001 started with pid=25, OS id=444
Streams Apply Reader started P000
with pid=26 OS id=3316
Streams Apply Server started P001
with pid=27 OS id=3084

10. 在source数据上启动capture process.

SQL> show user
USER is "STRMADMIN"
SQL
> begin
2 dbms_capture_adm.start_capture('capture_stream');
3 end;
4 /

PL
/SQL procedure successfully completed.

注意这时候dba_capture数据的变化...

SQL> select capture_name, status, captured_scn, applied_scn from dba_capture;

CAPTURE_NAME STATUS CAPTURED_SCN APPLIED_SCN
------------------------------ -------- ------------ -----------
CAPTURE_STREAM ENABLED 66589715 66589715

这个时候除了status变成了enabled, captured_scn和applied_scn也都有值了,而且值是一样的。 而且注意到这个值小于之前得到的scn --66592260, 嘛原因??

  

 同时注意到alert文件内容的变化...

ue Mar 01 19:58:47 2011
Streams CAPTURE C001 started
with pid=40, OS id=1112
Tue Mar
01 19:58:50 2011
LOGMINER: Parameters summary
for session# = 1
LOGMINER:
Number of processes = 3, Transaction Chunk Size = 1
LOGMINER: Memory Size
= 10M, Checkpoint interval = 1000M
Tue Mar
01 19:58:50 2011
LOGMINER: krvxpsr summary
for session# = 1
LOGMINER: StartScn:
66591231 (0x0000.03f819ff)
LOGMINER: EndScn:
0
LOGMINER: HighConsumedScn:
66589715 (0x0000.03f81413)
LOGMINER: session_flag
0x1
LOGMINER: LowCkptScn:
0 (0x0000.00000000)
LOGMINER: HighCkptScn:
0 (0x0000.00000000)
LOGMINER: SkipScn:
66589715 (0x0000.03f81413)
LOGMINER: session#
= 1, reader process P000 started with pid=41 OS id=2616
LOGMINER: session#
= 1, builder process P001 started with pid=42 OS id=3740
LOGMINER: session#
= 1, preparer process P002 started with pid=43 OS id=4080
Tue Mar
01 19:58:52 2011
LOGMINER:
Begin mining logfile during dictionary load for session 1 thread 1 sequence 1808, E:\ORACLE\FLASH_RECOVERY_AREA\LO\ARCHIVELOG\2011_03_01\O1_MF_1_1808_6PSQ8KV8_.ARC
Tue Mar
01 19:59:04 2011
Thread
1 advanced to log sequence 1810 (LGWR switch)
Current log# 3 seq# 1810 mem# 0: C:\ORACLE\PRODUCT\10.2.0\ORADATA\LO\REDO03.LOG
............... 

----------------------------------------------------------------------------------------------------------------------

设置完毕了,下面就可以开始测试了....


1. 测试下DML

确认下源数据...

SQL> select empno, ename, deptno from scott.emp where empno=7900;

EMPNO ENAME DEPTNO
---------- ---------- ----------
7900 JAMES 30

现在在source database:lo.oracle.com做如下改动...

SQL> update scott.emp set deptno=40 where empno=7900;

1 row updated.

SQL
> commit;

Commit complete.

现在查看target database:orcl.oracle.com...

SQL> select empno, ename, deptno from scott.emp where empno=7900;

EMPNO ENAME DEPTNO
---------- ---------- ----------
7900 JAMES 40

可以看到orcl.oracle.com的数据被同步了。

2. 现在看看DDL操作...

source database: lo.oracle.com

SQL> alter table scott.emp add (just_4_test number);

Table altered.

SQL
> desc scott.emp;
Name
Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
JUST_4_TEST
NUMBER

target database: orcl.oracle.com

SQL> desc scott.emp;
Name
Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
JUST_4_TEST
NUMBER

看到表结构也跟着发生了变化。

--------------------------------------------------------------------------------------------------------------------------------

环境清理 Clean Up

  

source database: lo.oracle.com

SQL> exec dbms_capture_adm.stop_capture('capture_stream');

PL
/SQL procedure successfully completed.

SQL
> exec dbms_capture_adm.drop_capture('capture_stream');

PL
/SQL procedure successfully completed.

SQL
> exec dbms_propagation_adm.stop_propagation('sour_to_targ');

PL
/SQL procedure successfully completed.

SQL
> exec dbms_propagation_adm.drop_propagation('sour_to_targ');

PL
/SQL procedure successfully completed.

SQL
> select * from dba_capture;

no rows selected

SQL
> select * from dba_propagation;

no rows selected

SQL
> select job, what from dba_jobs;

JOB
----------
WHAT
--------------------------------------------------------------------------------
21
EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();


SQL
> exec dbms_streams_adm.remove_streams_configuration();

PL
/SQL procedure successfully completed.

target database: orcl.oracle.com

SQL> exec dbms_apply_adm.stop_apply('apply_stream');

PL
/SQL procedure successfully completed.

SQL
> exec dbms_apply_adm.drop_apply('apply_stream');

PL
/SQL procedure successfully completed.

SQL
> exec dbms_streams_adm.remove_streams_configuration;

PL
/SQL procedure successfully completed.

SQL
> select * from dba_apply;

no rows selected

最后删除创建的queue/queue table (both source & target database)

SQL> exec dbms_aqadm.stop_queue('streams_queue');

PL
/SQL procedure successfully completed.

SQL
> exec dbms_aqadm.drop_queue('streams_queue');

PL
/SQL procedure successfully completed.

SQL
> select * from streams_queue_table;

no rows selected

SQL
> exec dbms_aqadm.drop_queue_table('streams_queue_table');

PL
/SQL procedure successfully completed.

SQL
> select * from streams_queue_table;
select * from streams_queue_table
*
ERROR at line
1:
ORA
-00942: table or view does not exist
posted @ 2011-03-07 23:02  FangwenYu  阅读(997)  评论(0编辑  收藏  举报