对于stream复制环境的源数据库一端,对归档日志的清理需要注意一些问题,不是所有的归档都可以随意删除,如果误删了capture进程还需要读取的归档日志就会出现capture虽然能正常启动 status也是enable状态,但是数据缺法复制。
这里需要注意一个capture进程的参数REQUIRED_CHECKPOINT_SCN这个参数表示capture进程重新启动时需要scan的最小scn号,可以通过这个参数找到需要为capture进程保留的归档日志。这里还需要讲的一个参数是capture进程的_CHEKPOINT_FREQUENCY参数这个参数的表示logminer做一次checkpoint需要挖掘的日志大小,这个参数的单位是M,ORACLE官方建议设置为500M,也就是说当logminer处理了500M大小的redo的时候会做一次logminer的checkpoint,checkpoint之后REQUIRED_CHECKPOINT_SCN被更新,所以通过设_CHEKPOINT_FREQUENCY的大小,可以控制需要保留的归档的大小,可以使用dbms_capture_adm.set_parameter过程修改_CHEKPOINT_FREQUENCY参数 下面是一个测试例子: 通过REQUIRED_CHECKPOINT_SCN确定需要保留的archive log: SQL> conn strmadmin/strmadmin Connected. SQL> COLUMN CONSUMER_NAME HEADING 'Capture|Process|Name' FORMAT A15 SQL> COLUMN SOURCE_DATABASE HEADING 'Source|Database' FORMAT A10 SQL> COLUMN SEQUENCE# HEADING 'Sequence|Number' FORMAT 99999 SQL> COLUMN NAME HEADING 'Required|Archived Redo Log|File Name' FORMAT A40 SQL> SELECT r.CONSUMER_NAME, 2 r.SOURCE_DATABASE, 3 r.SEQUENCE#, 4 r.NAME 5 FROM DBA_REGISTERED_ARCHIVED_LOG r, DBA_CAPTURE c 6 WHERE r.CONSUMER_NAME = c.CAPTURE_NAME AND 7 r.NEXT_SCN >= c.REQUIRED_CHECKPOINT_SCN;
Capture Required Process Source Sequence Archived Redo Log Name Database Number File Name --------------- ---------- -------- ---------------------------------------- CAPTURE_A SOURCE 100 /arch/1_100_714317792.dbf CAPTURE_A SOURCE 101 /arch/1_101_714317792.dbf CAPTURE_A SOURCE 102 /arch/1_102_714317792.dbf CAPTURE_A SOURCE 103 /arch/1_103_714317792.dbf CAPTURE_A SOURCE 104 /arch/1_104_714317792.dbf
可以看到capture重新启动的时候需要的日志是从sequence 100以后的,现在我们首先关闭掉capture然后rename/arch/1_100_714317792.dbf 再重新启动capture,观察caputre情况
SQL> exec dbms_capture_adm.stop_capture('capture_a');
PL/SQL procedure successfully completed.
SQL> host [oracle@primary arch]$ cd /arch [oracle@primary arch]$ ls 1_100_714317792.dbf 1_51_714317792.dbf 1_60_714317792.dbf 1_69_714317792.dbf 1_78_714317792.dbf 1_87_714317792.dbf 1_96_714317792.dbf 1_101_714317792.dbf 1_52_714317792.dbf 1_61_714317792.dbf 1_70_714317792.dbf 1_79_714317792.dbf 1_88_714317792.dbf 1_97_714317792.dbf 1_102_714317792.dbf 1_53_714317792.dbf 1_62_714317792.dbf 1_71_714317792.dbf 1_80_714317792.dbf 1_89_714317792.dbf 1_98_714317792.dbf 1_103_714317792.dbf 1_54_714317792.dbf 1_63_714317792.dbf 1_72_714317792.dbf 1_81_714317792.dbf 1_90_714317792.dbf 1_99_714317792.dbf 1_104_714317792.dbf 1_55_714317792.dbf 1_64_714317792.dbf 1_73_714317792.dbf 1_82_714317792.dbf 1_91_714317792.dbf 1_47_714317792.dbf 1_56_714317792.dbf 1_65_714317792.dbf 1_74_714317792.dbf 1_83_714317792.dbf 1_92_714317792.dbf 1_48_714317792.dbf 1_57_714317792.dbf 1_66_714317792.dbf 1_75_714317792.dbf 1_84_714317792.dbf 1_93_714317792.dbf 1_49_714317792.dbf 1_58_714317792.dbf 1_67_714317792.dbf 1_76_714317792.dbf 1_85_714317792.dbf 1_94_714317792.dbf 1_50_714317792.dbf 1_59_714317792.dbf 1_68_714317792.dbf 1_77_714317792.dbf 1_86_714317792.dbf 1_95_714317792.dbf [oracle@primary arch]$ mv 1_100_714317792.dbf 1_100_714317792.dbfdfdfdfd [oracle@primary arch]$ ls 1_100_714317792.dbfdfdfdfd 1_52_714317792.dbf 1_62_714317792.dbf 1_72_714317792.dbf 1_82_714317792.dbf 1_92_714317792.dbf 1_101_714317792.dbf 1_53_714317792.dbf 1_63_714317792.dbf 1_73_714317792.dbf 1_83_714317792.dbf 1_93_714317792.dbf 1_102_714317792.dbf 1_54_714317792.dbf 1_64_714317792.dbf 1_74_714317792.dbf 1_84_714317792.dbf 1_94_714317792.dbf 1_103_714317792.dbf 1_55_714317792.dbf 1_65_714317792.dbf 1_75_714317792.dbf 1_85_714317792.dbf 1_95_714317792.dbf 1_104_714317792.dbf 1_56_714317792.dbf 1_66_714317792.dbf 1_76_714317792.dbf 1_86_714317792.dbf 1_96_714317792.dbf 1_47_714317792.dbf 1_57_714317792.dbf 1_67_714317792.dbf 1_77_714317792.dbf 1_87_714317792.dbf 1_97_714317792.dbf 1_48_714317792.dbf 1_58_714317792.dbf 1_68_714317792.dbf 1_78_714317792.dbf 1_88_714317792.dbf 1_98_714317792.dbf 1_49_714317792.dbf 1_59_714317792.dbf 1_69_714317792.dbf 1_79_714317792.dbf 1_89_714317792.dbf 1_99_714317792.dbf 1_50_714317792.dbf 1_60_714317792.dbf 1_70_714317792.dbf 1_80_714317792.dbf 1_90_714317792.dbf 1_51_714317792.dbf 1_61_714317792.dbf 1_71_714317792.dbf 1_81_714317792.dbf 1_91_714317792.dbf
启动capture [oracle@primary arch]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on Wed Mar 31 14:46:39 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> conn strmadmin/strmadmin Connected. SQL> exec dbms_capture_adm.start_capture('capture_a');
PL/SQL procedure successfully completed.
SQL>
重新启动capture日志中发现下面信息 Streams CAPTURE C001 started with pid=23, OS id=7950 Wed Mar 31 14:46:55 2010 LOGMINER: Parameters summary for session# = 84 LOGMINER: Number of processes = 3, Transaction Chunk Size = 1 LOGMINER: Memory Size = 10M, Checkpoint interval = 3000M
capture虽然启动,但是logminer一直没有开始正常工作。
SQL> SET LINESIZE 200 COLUMN CAPTURE_NAME HEADING 'Capture|Process|Name' FORMAT A15 COLUMN QUEUE_NAME HEADING 'Capture|Process|Queue' FORMAT A15 COLUMN RULE_SET_NAME HEADING 'Positive|Rule Set' FORMAT A15 COLUMN NEGATIVE_RULE_SET_NAME HEADING 'Negative|Rule Set' FORMAT A15 COLUMN STATUS HEADING 'Capture|Process|Status' FORMAT A15 COLUMN ERROR_MESSAGE HEADING 'Capture|Process|E_MESSAGE' FORMAT A20 SQL> SQL> SQL> SQL> SQL> SQL> SQL> SELECT CAPTURE_NAME, QUEUE_NAME, RULE_SET_NAME, NEGATIVE_RULE_SET_NAME, STATUS,ERROR_NUMBER,ERROR_MESSAGE FROM DBA_CAPTURE; 2
Capture Capture Capture Capture Process Process Positive Negative Process Process Name Queue Rule Set Rule Set Status ERROR_NUMBER E_MESSAGE --------------- --------------- --------------- --------------- --------------- ------------ -------------------- CAPTURE_A Q_CAP_QUEUE RULESET$_60 ENABLED
SQL> COLUMN CAPTURE_NAME HEADING 'Capture|Name' FORMAT A15 SQL> COLUMN STATE HEADING 'State' FORMAT A27 SQL> COLUMN STATE_CHANGED HEADING 'State|Change Time' SQL> COLUMN CREATE_MESSAGE HEADING 'Last Message|Create Time' SQL> SELECT CAPTURE_NAME, 2 STATE, 3 TO_CHAR(STATE_CHANGED_TIME, 'HH24:MI:SS MM/DD/YY') STATE_CHANGED, 4 TO_CHAR(CAPTURE_MESSAGE_CREATE_TIME, 'HH24:MI:SS MM/DD/YY') CREATE_MESSAGE 5 FROM V$STREAMS_CAPTURE;
Capture State Last Message Name State Change Time Create Time --------------- --------------------------- ----------------- ----------------- CAPTURE_A DICTIONARY INITIALIZATION 14:49:52 03/31/10
SQL>
可以看到重启后capture虽然是enable状态 但是一直是处于DICTIONARY INITIALIZATION中,无法正常同步数据
现在我们把rename了的归档文件rename回原来的名字 [oracle@primary arch]$ ls 1_100_714317792.dbfdfdfdfd 1_52_714317792.dbf 1_62_714317792.dbf 1_72_714317792.dbf 1_82_714317792.dbf 1_92_714317792.dbf 1_101_714317792.dbf 1_53_714317792.dbf 1_63_714317792.dbf 1_73_714317792.dbf 1_83_714317792.dbf 1_93_714317792.dbf 1_102_714317792.dbf 1_54_714317792.dbf 1_64_714317792.dbf 1_74_714317792.dbf 1_84_714317792.dbf 1_94_714317792.dbf 1_103_714317792.dbf 1_55_714317792.dbf 1_65_714317792.dbf 1_75_714317792.dbf 1_85_714317792.dbf 1_95_714317792.dbf 1_104_714317792.dbf 1_56_714317792.dbf 1_66_714317792.dbf 1_76_714317792.dbf 1_86_714317792.dbf 1_96_714317792.dbf 1_47_714317792.dbf 1_57_714317792.dbf 1_67_714317792.dbf 1_77_714317792.dbf 1_87_714317792.dbf 1_97_714317792.dbf 1_48_714317792.dbf 1_58_714317792.dbf 1_68_714317792.dbf 1_78_714317792.dbf 1_88_714317792.dbf 1_98_714317792.dbf 1_49_714317792.dbf 1_59_714317792.dbf 1_69_714317792.dbf 1_79_714317792.dbf 1_89_714317792.dbf 1_99_714317792.dbf 1_50_714317792.dbf 1_60_714317792.dbf 1_70_714317792.dbf 1_80_714317792.dbf 1_90_714317792.dbf 1_51_714317792.dbf 1_61_714317792.dbf 1_71_714317792.dbf 1_81_714317792.dbf 1_91_714317792.dbf [oracle@primary arch]$ mv 1_100_714317792.dbfdfdfdfd 1_100_714317792.dbf [oracle@primary arch]$
下面是rename后的日志 LOGMINER: Parameters summary for session# = 84 LOGMINER: Number of processes = 3, Transaction Chunk Size = 1 LOGMINER: Memory Size = 10M, Checkpoint interval = 3000M LOGMINER: session# = 84, reader process P000 started with pid=13 OS id=7972 LOGMINER: session# = 84, preparer process P002 started with pid=25 OS id=7976 LOGMINER: session# = 84, builder process P001 started with pid=24 OS id=7974 Wed Mar 31 14:52:41 2010 LOGMINER: Begin mining logfile: /arch/1_100_714317792.dbf Wed Mar 31 14:52:54 2010 LOGMINER: End mining logfile: /arch/1_100_714317792.dbf Wed Mar 31 14:52:54 2010 LOGMINER: Begin mining logfile: /arch/1_101_714317792.dbf
可以看到capture已经恢复正常工作
现在我们在来看看capture的状态
SQL> conn strmadmin/strmadmin Connected. SQL> SET LINESIZE 200 SQL> COLUMN CAPTURE_NAME HEADING 'Capture|Process|Name' FORMAT A15 SQL> COLUMN QUEUE_NAME HEADING 'Capture|Process|Queue' FORMAT A15 SQL> COLUMN RULE_SET_NAME HEADING 'Positive|Rule Set' FORMAT A15 SQL> COLUMN NEGATIVE_RULE_SET_NAME HEADING 'Negative|Rule Set' FORMAT A15 SQL> COLUMN STATUS HEADING 'Capture|Process|Status' FORMAT A15 SQL> COLUMN ERROR_MESSAGE HEADING 'Capture|Process|E_MESSAGE' FORMAT A20 SQL> SELECT CAPTURE_NAME, QUEUE_NAME, RULE_SET_NAME, NEGATIVE_RULE_SET_NAME, STATUS,ERROR_NUMBER,ERROR_MESSAGE 2 FROM DBA_CAPTURE;
Capture Capture Capture Capture Process Process Positive Negative Process Process Name Queue Rule Set Rule Set Status ERROR_NUMBER E_MESSAGE --------------- --------------- --------------- --------------- --------------- ------------ -------------------- CAPTURE_A Q_CAP_QUEUE RULESET$_60 ENABLED
SQL> COLUMN CAPTURE_NAME HEADING 'Capture|Name' FORMAT A15 SQL> COLUMN STATE HEADING 'State' FORMAT A27 SQL> COLUMN STATE_CHANGED HEADING 'State|Change Time' SQL> COLUMN CREATE_MESSAGE HEADING 'Last Message|Create Time' SQL> SELECT CAPTURE_NAME, 2 STATE, 3 TO_CHAR(STATE_CHANGED_TIME, 'HH24:MI:SS MM/DD/YY') STATE_CHANGED, 4 TO_CHAR(CAPTURE_MESSAGE_CREATE_TIME, 'HH24:MI:SS MM/DD/YY') CREATE_MESSAGE 5 FROM V$STREAMS_CAPTURE;
Capture State Last Message Name State Change Time Create Time --------------- --------------------------- ----------------- ----------------- CAPTURE_A CAPTURING CHANGES 14:55:05 03/31/10 14:55:03 03/31/10
可以看到capture进程已经正常 状态变为CAPTURING CHANGES 数据同步恢复。
由此可见对于stream环境的archive log管理一定要注意保留capture重启所需要的archive log,以免capture无法启动