ORACLE 10G 数据库 通过 STREAM 实现数据库双向同步


ORACLE 10G 数据库 通过STREAM实现数据库双向同步 1 STREAM概述 Oracle 从9i 开始推出 streams,用于提供灵活的复制和容灾解决方案。但是 9i 的streams 配置相当的麻烦,少说也有十几个步骤,还容易出错。10gR2 则将整 个配置过程封装在几个简单的 PL/SQL 过程中,使得配置过程大大的简化。但是 实际的配置步骤还是一样的,Oracle 只是利用这些 PL/SQL 过程先生成对应的脚 本,然后再执行脚本进行配置。这个过程可以全自动完成,也可以先将脚本生成 到某个指定的目录,我们根据需要修改脚本,然后再执行脚本进行配置,这样就 灵活又方便。 Streams 的原理其实很简单,通过 logmnr 技术从 oracle 的log 中解析出数据, 然后传递到目标库并应用,从而将源库的数据复制到目标库。当然,复制可以是 双向的,也可以是单向的。双向复制还需要考虑数据冲突的问题。而多源复制其 实是双向复制的基础上衍生而来的。 整个的复制过程可以分成三个步骤:捕获(capture),传播(propagation)和应用 (apply),利用高级队列(advance queue)来将这三个步骤的数据串起来,通过在 步骤中定义不同的规则(rule)来控制需要复制的数据。复制可以基于全库,基于 表空间,基于用户或者基于表,提供了相当大的灵活性。 捕获进程可以直接在源库捕获日志,也可以先将日志(归档日志或者联机日志) 传递另外的库中进行捕获,这就是本地捕获(local capture)和异地捕获 (downstream capture)。对于异地捕获,根据是传递归档日志还是联机日志,可 以分为普通的异地捕获和实时异地捕获。日志的传递其实和 DataGuard 中是一样 的机制。Oracle11g 的streams 还提供了同步捕获,这里暂时不涉及了。 描述一下复制的简单过程如下: 首先捕获进程从日志解析出数据,封装在一个个的逻辑改变记录(LCR:logical change record)中,将这些 lcr 压进捕获队列中,然后传播进程从捕获队列取得 数据压进应用队列中,最后应用进程从应用队列取得 LCR 并应用到目标库中。LCR 可以分为 row LCR(DML 操作记录)和DDL LCR(DDL 操作记录),所以 streams 复制 可以支持 DDL 操作的复制。 Streams 复制需要先进行一次初始化建立基线,然后在此基础上复制增量数据。 对于全库的初始化,可以使用 RMAN。表空间复制的初始化可以使用 transport tablespace,而对于用户复制和表复制,则可以使用 exp/imp 或者 expdb/impdp。 2 双向同步说明 一般情况下,只需要把数据库从源库同步到目标数据库,原库做交易库,目标库作为查询库。 但是也有这样的需求:源库作为后台应用程序的数据库,目标库作为前台应用程序的数据库, 双方都要操作数据库,数据库要求一致。这样需要数据库双向同步,而且同时把数据库变更 应用到对方数据库。 3 部署步骤 构建 Oracle 双向流复制是一个十分复杂的过程,我写这个文档的目的是尽量有 条理地列出所需做的工作,帮助 DBA 更有效的建设流复制环境。 1.以scott 模式为复制示例,一般只要在创建数据库时选择了安装 sample schema,都会存在该 scott 模式;至少保证源库中存在该 schema,以便可以初 始化到目标库中。 2.在源和目标 2个数据库中创建 strmadmin 流管理用户,当然你也可以选用其他 名字。同时在 2个库中都要创建 streams 使用的表空间,以便让 logmnr 使用它. 3.1 打开归档模式 如果数据库已经处于归档模式,则可以跳过此步骤。 sqlplus "/as sysdba shutdown immediate; startup mount; alter database archivelog; alter database open; 3.2 创建stream 表空间和管理用户 CREATE TABLESPACE streams_tbs DATAFILE 'XXXXXX' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED; /* 10g r2 中logmnr 默认使用 SYSAUX 表空间 */ exec DBMS_LOGMNR_D.SET_TABLESPACE ('streams_tbs'); /* 创建完表空间后,接着要创建 strmadmin 用户 */ CREATE USER strmadmin IDENTIFIED BY strmadmin DEFAULT TABLESPACE streams_tbs QUOTA UNLIMITED ON streams_tbs; GRANT DBA TO strmadmin; BEGIN DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE( grantee => 'strmadmin', grant_privileges => true); END; / /* 可以通过查询 dba_streams_administrator 视图检查用户是否正确授予流管 理权限 */ SQL> SELECT * FROM dba_streams_administrator; USERNAME LOC ACC ------------------------------ --- --- MACLEAN YES YES STRMADMIN YES YES 3.3 修改数据库初始化参数 3.在2边数据库中都需要设置合理的实例初始化参数,我们以 10g release2 为 例: 参数名与推荐值:_job_queue_interval = 1 描述:job 的队列的扫描参数,默认为 5,即 5s 扫描一次 出于何种考虑:设置较小的_job_queue_interval 有利于 propagation 作业 如何设置:alter system set "_job_queue_interval"=1 scope=spfile; /* 注意 scope=spfile 的参数都需要重启实例方能生效 */ 参数名与推荐值:COMPATIBLE>= 10.2.0.0 描述:数据库版本兼容性参数,以前介绍过,不再展开 出于何种考虑:10g release2 的部分 Streams 新特性要求该参数至少为 10.2.0.0 或更高 如何设置:只有从较低版本升级到 10g r2 的数据库需要设置该参数, alter system set compatible="10.2.0.0" scope=spfile; 参数名与推荐值:GLOBAL_NAMES=true 描述:指定是否要求 database link 名与数据库全局名一致,默认为 FALSE 也就 是不需要一致 出于何种考虑:帮助我们准确识别 database link 和数据库的关系,避免误操作 如何设置:alter system set global_names=true scope=spfile; 参数名与推荐值:job_queue_processes>4 描述:指定了实例中 job 队列进程的数量(如J000…J999). 出于何种考虑:该参数控制了实例中能够并行运行的 job 的最大值,应设一个大 于已配置的 propagations 数量的值,同时也要考虑到可能还有其他数据库作业 如何设置:alter system set job_queue_processes=15; 参数名与推荐值:PARALLEL_MAX_SERVERS 描述:指定了实例中最大并行进程的数量 出于何种考虑: 在Streams 环境中,capture 进程和 apply 进程都会用到多个并行进程。 设置该初始化参数为适当值(10*CPU#)以保证总是有足够的可用并行进程; 每多一个 capture 或apply 进程,则有必要为该参数+2 再加上加入的 capture 或apply 进程的并行度 parallelism 参数。 如何设置: alter system set PARALLEL_MAX_SERVERS=40; 参数名与推荐值:REMOTE_ARCHIVE_ENABLE 描述:指定是否将归档日志传送到远程目的地 出于何种考虑:只有 downstream capture 时会用到,不展开 参数名与推荐值:SGA_MAX_SIZE 描述:设置合理的 SGA 内存最大值 出于何种考虑:常见参数,不展开 参数名与推荐值:SGA_TARGET=0 描述:disable 掉10g 中的 Automatic Shared Memory Management. 出于何种考虑:Oracle 推荐在 stream 环境中手动指定 streams_pool 和 shared_pool 的大小而不使用 10g 中的内存自动管理特性 如何设置: alter system set sga_target=0; 参数名与推荐值:调优 STREAMS_POOL_SIZE 描述: 为流池指定大小。流池包括了缓存的队列消息。此外,流池也会被用于并行 capture 和apply 的内部通信。 建议参考 V$STREAMS_POOL_ADVICE 视图的信息判断最佳大小,避免 spill 溢出 出于何种考虑: 该参数可以动态修改。若该参数归零则实例中 streams 相关的进程和作业都将无 法运行。流池的大小受到以下因素的影响: 1.capture 进程的并行度,每增加一个 capture 进程有必要为流池增加 10MB 的 大小; 此外当 capture 参数 PARALLELISM 大于 1时,有必要为流池增加 10Mb*parallelism 的大小; 举例来说,若某 capture 进程的并行度 parallelism 设置为 3,则需要为 Streams 池增加 30Mb。 2.apply 进程的并行度,每增加一个 apply 进程有必要为 streams pool 增加 1MB; 此外当 apply 进程的并行度大于 1时,为 streams pool 增加 1Mb*parallelism 的大小; 举例来说某apply进程的parallelism被设置为5,则需要为streams池增加5Mb。 3.Logical Change Records(LCRS)被存储在 buffered queues 缓存队列中; 适当增加 Streams pool 大小以适应源库和目标库上数据复制的数据量; Oracle 建议在低负载的数据库上最小设置 Streams pool 为256Mb,而在活跃度 高的 OLTP 环境中设置为 500Mb; 通过 V$STREAMS_POOL_ADVISE 视图给出的建议进一步调整 Streams Pool 的大小 到一个合理值以避免过多的缓存队列溢出到磁盘上。 如何设置: select * from v$streams_pool_advice; /* 查询 v$streams_pool_advice 视图了解不同 streams_Pool_size 情况下的 estd_spill_time */ alter system set streams_pool_size=500M; 完成以上设置后建议重启实例以便让全部参数生效,2边都要做。 3.4 添加追加日志 为scott schema 下的对象创建追加日志(supplemental log),可以使用 dbms_capture_adm 包的 prepare_schema_instantiation 存储过程为指定模式创 建追加日志: NAME prepare_schema_instantiation() FUNCTION prepare a schema for instantiation PARAMETERS schema_name -(IN) the name of the schema to prepare supplemental_logging -(IN) supplemental logging level ('NONE', 'KEYS', or 'ALL') NOTES KEYS means PRIMARY KEY, UNIQUE INDEX, and FOREIGN KEY levels combined. --------------------------------------------------------------------- -------*/ PROCEDURE prepare_schema_instantiation( schema_name IN VARCHAR2, supplemental_logging IN VARCHAR2 DEFAULT 'KEYS'); /* 其默认 supplemental_logging 选项为 Key,即为 PRIMARY KEY, UNIQUE INDEX, and FOREIGN KEY 等键 创建 IMPLICIT 的追加日志 */ /* 在10g 或以上版本中 prepare_xxx_instantiation 存储过程也会隐式地创建 追加日志组了 (In versions 10g and above,prepare_xxx_instantiation procedure implicitly creates supplemenal log groups. Type of supplemental logging that is enabled implicitly using this command can be checked using the sql in the following link to the documentation. However, additional supplemental logging might need to be enabled depending on the requirements as mentioned above)。 可以通过以下查询了解其追加日志组的属性: SELECT SCHEMA_NAME, SUPPLEMENTAL_LOG_DATA_PK log_pk, SUPPLEMENTAL_LOG_DATA_FK log_fk, SUPPLEMENTAL_LOG_DATA_UI log_ui, SUPPLEMENTAL_LOG_DATA_ALL log_all FROM DBA_CAPTURE_PREPARED_SCHEMAS; SCHEMA_NAME LOG_PK LOG_FK LOG_UI LOG_ALL ------------------------------ -------- -------- -------- -------- SCOTT IMPLICIT IMPLICIT IMPLICIT NO 3.5 创建DB-LINK 创建dblink 之前,需要在源和目标数据库服务器上创建对方数据库的连接字符串 此处略去 在源库上创建到目标库 strmadmin 用户的 database link: conn strmadmin/strmadmin; Connected. create database link clinicb.rh3.oracle.com connect to strmadmin identified by strmadmin using 'clinicb.rh3.oracle.com'; Database link created. /* 其中 clinicb.rh3.oracle.com 为目标库的全局数据库名,clinicb 为 db_name,rh3.oracle.com 为domain_name */ 在目标库上创建到源库 strmadmin 用户的 database link: conn strmadmin/strmadmin; Connected. create database link clinica.rh2.oracle.com connect to strmadmin identified by strmadmin using 'clinica.rh2.oracle.com'; Database link created. /* 其中 clinica.rh2.oracle.com 为源库的全局数据库名,clinica 为数据库名, rh2.oracle.com 为domain_name */ 3.6 创建队列 3.6.1在源库中分别为 capture 和apply 创建队列 queue begin dbms_streams_adm.set_up_queue( queue_table => 'apply_srctab', queue_name => 'apply_src', queue_user => 'strmadmin'); end; / PL/SQL procedure successfully completed. begin dbms_streams_adm.set_up_queue( queue_table => 'capture_srctab', queue_name => 'capture_src', queue_user => 'strmadmin'); end; / PL/SQL procedure successfully completed. 3.6.2在目标库分别为 capture 和apply 创建队列 queue conn strmadmin/strmadmin@clinicb.rh3.oracle.com Connected. begin dbms_streams_adm.set_up_queue( queue_table => 'apply_desttab', queue_name => 'apply_dest', queue_user => 'strmadmin'); end; / PL/SQL procedure successfully completed. begin dbms_streams_adm.set_up_queue( queue_table => 'capture_desttab', queue_name => 'capture_dest', queue_user => 'strmadmin'); end; / PL/SQL procedure successfully completed. 3.7 创建进程 3.7.1在源库 clinica 上为scott 模式创建 capture process: conn strmadmin/strmadmin@clinica.rh2.oracle.com Connected. begin dbms_streams_adm.add_schema_rules ( schema_name => 'scott', streams_type => 'capture', streams_name => 'captures_src', queue_name => 'capture_src', include_dml => true, include_ddl => true, inclusion_rule => true); end; / PL/SQL procedure successfully completed. 9. 3.7.2在源库 clinica 上创建 apply process: conn strmadmin/strmadmin@clinica.rh2.oracle.com Connected. begin dbms_streams_adm.add_schema_rules ( schema_name => 'scott', streams_type => 'apply', streams_name => 'applys_src', queue_name => 'apply_src', include_dml => true, include_ddl => true, source_database => 'clinicb.rh3.oracle.com'); end; / PL/SQL procedure successfully completed. 10.若需要在源库中解决冲突处理,则有必要设置 conflict handlers,可以参 考这个 streams 文件链 接:http://download-east.oracle.com/docs/cd/B19306_01/server.102/b1422 8/conflict.htm 3.7.3在源库 clinica 上配置 propagation process: begin dbms_streams_adm.add_schema_propagation_rules ( schema_name => 'scott', streams_name => 'prop_src_to_dest', source_queue_name => 'capture_src', destination_queue_name => 'apply_dest@clinicb.rh3.oracle.com', include_dml => true, include_ddl => true, source_database => 'clinica.rh2.oracle.com'); end; / PL/SQL procedure successfully completed. 3.7.4在目标库 clinicb 上配置 capture process begin dbms_streams_adm.add_schema_rules ( schema_name => 'scott', streams_type => 'capture', streams_name => 'captures_dest', queue_name => 'capture_dest', include_dml => true, include_ddl => true); end; / PL/SQL procedure successfully completed. 3.7.5在目标库上配置 apply process conn strmadmin/strmadmin@clinicb.rh3.oracle.com Connected. begin dbms_streams_adm.add_schema_rules ( schema_name => 'scott', streams_type => 'apply', streams_name => 'applys_dest', queue_name => 'apply_dest', include_dml => true, include_ddl => true, source_database => 'clinica.rh2.oracle.com'); end; / PL/SQL procedure successfully completed. 3.7.6在目标库上配置 propagation process begin dbms_streams_adm.add_schema_propagation_rules ( schema_name => 'scott', streams_name => 'prop_dest_to_src', source_queue_name => 'capture_dest', destination_queue_name => 'apply_src@clinica.rh2.oracle.com', include_dml => true, include_ddl => true, source_database => 'clinicb.rh3.oracle.com'); end; / PL/SQL procedure successfully completed. 3.8 设置模式实例化 SCN 在目标库上初始化 scott 模式下的对象,有多种方法可以完成初始化。若对象均 不存在,在可以使用 export/import 导入导出工具完成 instantiation,若对象 均已经存在,则直接使用 dbms_apply_adm.set_schema_instantiation_scn 存 储过程。 我们的环境中 scott 模式已存在于目标库中: 3.8.1源库 clinica 上以目标库 clinicb 的 SCN 设置模式实例化 SCN(schema instantiation SCN) conn strmadmin/strmadmin@clinicb.rh3.oracle.com Connected. declare v_scn number; begin v_scn := dbms_flashback.get_system_change_number(); dbms_apply_adm.set_schema_instantiation_scn@clinica.rh2.oracle.com( source_schema_name => 'scott', source_database_name => 'clinicb.rh3.oracle.com', instantiation_scn => v_scn, recursive => true); end; / 3.8.2目标库 conn strmadmin/strmadmin@clinica.rh2.oracle.com Connected. declare v_scn number; begin v_scn := dbms_flashback.get_system_change_number(); dbms_apply_adm.set_schema_instantiation_scn@clinicb.rh3.oracle.com( source_schema_name => 'scott', source_database_name => 'clinica.rh2.oracle.com', instantiation_scn => v_scn, recursive => true); end; / PL/SQL procedure successfully completed. 17.若需要在目标库中解决冲突处理,则有必要设置 conflict handlers,可以 参考这个 streams 文件链接: http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14228/c onflict.htm 3.9 启动进程 3.9.1在目标库中启动 capture 和apply 进程 启动 Apply: /* 以disable_on_erro 参数为'N'启动 apply 进程,即便遭遇错误,apply 也会 继续处理 LCR */ conn strmadmin/strmadmin@clinicb.rh3.oracle.com Connected. begin dbms_apply_adm.set_parameter ( apply_name => 'applys_dest', parameter => 'disable_on_error', value => 'N'); end; / PL/SQL procedure successfully completed. exec dbms_apply_adm.start_apply (apply_name=> 'applys_dest'); PL/SQL procedure successfully completed. 在目标库中启动 capture process: exec dbms_capture_adm.start_capture (capture_name=>'captures_dest'); PL/SQL procedure successfully completed. 3.9.2在源库启动 capture 和apply 进程 begin dbms_apply_adm.set_parameter ( apply_name => 'applys_src', parameter => 'disable_on_error', value => 'N'); end; / PL/SQL procedure successfully completed. exec dbms_apply_adm.start_apply (apply_name=> 'applys_src'); PL/SQL procedure successfully completed. 在源库启动 capture: exec dbms_capture_adm.start_capture (capture_name=>'captures_src'); PL/SQL procedure successfully completed. 4 测试双向流复制 4.1 测试ddl 语句 SQL> conn scott/tiger@clinica.rh2.oracle.com Connected. SQL> create table test_streams(t1 int); Table created. SQL> conn scott/tiger@clinicb.rh3.oracle.com Connected. SQL> desc test_streams; Name Null? Type ----------------------------------------- -------- ---------------------------- T1 NUMBER(38) SQL> create table anti_test(t1 int); Table created. SQL> conn scott/tiger@clinica.rh2.oracle.com Connected. SQL> desc anti_test; Name Null? Type ----------------------------------------- -------- ---------------------------- T1 NUMBER(38) /* ddl 语句双向复制成功 */ 4.2 测试dml 语句 SQL> conn scott/tiger@clinica.rh2.oracle.com Connected. SQL> desc 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) SQL> update emp set sal=sal+50; 14 rows updated. SQL> commit; Commit complete. SQL> select sum(sal) from emp; SUM(SAL) ---------- 29725 SQL> conn scott/tiger@clinicb.rh3.oracle.com Connected. SQL> select sum(sal) from emp; SUM(SAL) ---------- 29725 SQL> update emp set sal=sal+50; 14 rows updated. SQL> commit; Commit complete. SQL> select sum(sal) from emp; SUM(SAL) ---------- 30425 SQL> conn scott/tiger@clinica.rh2.oracle.com Connected. SQL> select sum(sal) from emp; SUM(SAL) ---------- 30425 /* dml 语句双向复制成功 */ 5 STREAM监控管理 5.1 capture 进程管理 capture 进程信息 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 SELECT CAPTURE_NAME, QUEUE_NAME, RULE_SET_NAME, NEGATIVE_RULE_SET_NAME, STATUS,ERROR_NUMBER,ERROR_MESSAGE FROM DBA_CAPTURE; --显示 capture 进程的统计信息 COLUMN CAPTURE_NAME HEADING 'Capture|Name' FORMAT A7 COLUMN PROCESS_NAME HEADING 'Capture|Process|Number' FORMAT A7 COLUMN SID HEADING 'Session|ID' FORMAT 9999 COLUMN SERIAL# HEADING 'Session|Serial|Number' FORMAT 9999 COLUMN STATE HEADING 'State' FORMAT A27 COLUMN TOTAL_MESSAGES_CAPTURED HEADING 'Redo|Entries|Evaluated|In Detail' FORMAT 9999999 COLUMN TOTAL_MESSAGES_ENQUEUED HEADING 'Total|LCRs|Enqueued' FORMAT 999999 SELECT c.CAPTURE_NAME, SUBSTR(s.PROGRAM,INSTR(s.PROGRAM,'(')+1,4) PROCESS_NAME, c.SID, c.SERIAL#, c.STATE, c.TOTAL_MESSAGES_CAPTURED, c.TOTAL_MESSAGES_ENQUEUED FROM V$STREAMS_CAPTURE c, V$SESSION s WHERE c.SID = s.SID AND c.SERIAL# = s.SERIAL#; --查看 cpture 状态和最后一个 message 形成的时间 COLUMN CAPTURE_NAME HEADING 'Capture|Name' FORMAT A15 COLUMN STATE HEADING 'State' FORMAT A27 COLUMN STATE_CHANGED HEADING 'State|Change Time' COLUMN CREATE_MESSAGE HEADING 'Last Message|Create Time' SELECT CAPTURE_NAME, STATE, TO_CHAR(STATE_CHANGED_TIME, 'HH24:MI:SS MM/DD/YY') STATE_CHANGED, TO_CHAR(CAPTURE_MESSAGE_CREATE_TIME, 'HH24:MI:SS MM/DD/YY') CREATE_MESSAGE FROM V$STREAMS_CAPTURE; --capture 性能查看 COLUMN CAPTURE_NAME HEADING 'Capture|Name' FORMAT A15 COLUMN ELAPSED_CAPTURE_TIME HEADING 'Elapsed|Capture|Time' FORMAT 99999999.99 COLUMN ELAPSED_RULE_TIME HEADING 'Elapsed|Rule|Evaluation|Time' FORMAT 99999999.99 COLUMN ELAPSED_ENQUEUE_TIME HEADING 'Elapsed|Enqueue|Time' FORMAT 99999999.99 COLUMN ELAPSED_LCR_TIME HEADING 'Elapsed|LCR|Creation|Time' FORMAT 99999999.99 COLUMN ELAPSED_PAUSE_TIME HEADING 'Elapsed|Pause|Time' FORMAT 99999999.99 SELECT CAPTURE_NAME, (ELAPSED_CAPTURE_TIME/100) ELAPSED_CAPTURE_TIME, (ELAPSED_RULE_TIME/100) ELAPSED_RULE_TIME, (ELAPSED_ENQUEUE_TIME/100) ELAPSED_ENQUEUE_TIME, (ELAPSED_LCR_TIME/100) ELAPSED_LCR_TIME, (ELAPSED_PAUSE_TIME/100) ELAPSED_PAUSE_TIME FROM V$STREAMS_CAPTURE; --capture 进程重启需要的 redo COLUMN CONSUMER_NAME HEADING 'Capture|Process|Name' FORMAT A15 COLUMN SOURCE_DATABASE HEADING 'Source|Database' FORMAT A10 COLUMN SEQUENCE# HEADING 'Sequence|Number' FORMAT 99999 COLUMN NAME HEADING 'Required|Archived Redo Log|File Name' FORMAT A40 SELECT r.CONSUMER_NAME, r.SOURCE_DATABASE, r.SEQUENCE#, r.NAME FROM DBA_REGISTERED_ARCHIVED_LOG r, DBA_CAPTURE c WHERE r.CONSUMER_NAME = c.CAPTURE_NAME AND r.NEXT_SCN >= c.REQUIRED_CHECKPOINT_SCN; 5.2 propagation 进程管理 --buffer_queues 信息 COLUMN QUEUE_SCHEMA HEADING 'Queue Owner' FORMAT A15 COLUMN QUEUE_NAME HEADING 'Queue Name' FORMAT A15 COLUMN MEM_MSG HEADING 'Messages|in Memory' FORMAT 99999999 COLUMN SPILL_MSGS HEADING 'Messages|Spilled' FORMAT 99999999 COLUMN NUM_MSGS HEADING 'Total Messages|in Buffered Queue' FORMAT 99999999 SELECT QUEUE_SCHEMA, QUEUE_NAME, (NUM_MSGS - SPILL_MSGS) MEM_MSG, SPILL_MSGS, NUM_MSGS FROM V$BUFFERED_QUEUES; --显示各个 propagation 的基本信息 COLUMN PROPAGATION_NAME HEADING 'Propagation' FORMAT A17 COLUMN SUBSCRIBER_ADDRESS HEADING 'Destination|Database' FORMAT A11 COLUMN CURRENT_ENQ_SEQ HEADING 'Current|Enqueued|Sequence' FORMAT 99999999 COLUMN LAST_BROWSED_SEQ HEADING 'Last|Browsed|Sequence' FORMAT 99999999999999 COLUMN LAST_DEQUEUED_SEQ HEADING 'Last|Dequeued|Sequence' FORMAT 99999999999999 COLUMN NUM_MSGS HEADING 'Number of|Messages|in Queue|(Current)' FORMAT 999999999999 COLUMN TOTAL_SPILLED_MSG HEADING 'Number of|Spilled|Messages|(Cumulative)' FORMAT 9999999999999 set linesize 200 SELECT p.PROPAGATION_NAME, s.SUBSCRIBER_ADDRESS, s.CURRENT_ENQ_SEQ, s.LAST_BROWSED_SEQ, s.LAST_DEQUEUED_SEQ, s.NUM_MSGS, s.TOTAL_SPILLED_MSG FROM DBA_PROPAGATION p, V$BUFFERED_SUBSCRIBERS s, V$BUFFERED_QUEUES q WHERE q.QUEUE_ID = s.QUEUE_ID AND p.SOURCE_QUEUE_OWNER = q.QUEUE_SCHEMA AND p.SOURCE_QUEUE_NAME = q.QUEUE_NAME AND p.DESTINATION_DBLINK = s.SUBSCRIBER_ADDRESS; 5.3 管理apply 进程 --apply 进程基本信息 COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A20 COLUMN APPLY_CAPTURED HEADING 'Type of Messages Applied' FORMAT A25 COLUMN APPLY_USER HEADING 'Apply User' FORMAT A30 SELECT APPLY_NAME, DECODE(APPLY_CAPTURED, 'YES', 'Captured', 'NO', 'User-Enqueued') APPLY_CAPTURED, APPLY_USER FROM DBA_APPLY; --apply 参数设置信息 COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A15 COLUMN PARAMETER HEADING 'Parameter' FORMAT A25 COLUMN VALUE HEADING 'Value' FORMAT A20 COLUMN SET_BY_USER HEADING 'Set by User?' FORMAT A15 SELECT APPLY_NAME, PARAMETER, VALUE, SET_BY_USER FROM DBA_APPLY_PARAMETERS; --reader server 信息 COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A15 COLUMN APPLY_CAPTURED HEADING 'Apply Type' FORMAT A22 COLUMN PROCESS_NAME HEADING 'Process|Name' FORMAT A7 COLUMN STATE HEADING 'State' FORMAT A17 COLUMN TOTAL_MESSAGES_DEQUEUED HEADING 'Total Messages|Dequeued' FORMAT 99999999 SELECT r.APPLY_NAME, DECODE(ap.APPLY_CAPTURED, 'YES','Captured LCRS', 'NO','User-enqueued messages','UNKNOWN') APPLY_CAPTURED, SUBSTR(s.PROGRAM,INSTR(s.PROGRAM,'(')+1,4) PROCESS_NAME, r.STATE, r.TOTAL_MESSAGES_DEQUEUED FROM V$STREAMS_APPLY_READER r, V$SESSION s, DBA_APPLY ap WHERE r.SID = s.SID AND r.SERIAL# = s.SERIAL# AND r.APPLY_NAME = ap.APPLY_NAME; --- 查看 apply 延时 COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A17 COLUMN LATENCY HEADING 'Latency|in|Seconds' FORMAT 9999 COLUMN CREATION HEADING 'Message Creation' FORMAT A17 COLUMN LAST_DEQUEUE HEADING 'Last Dequeue Time' FORMAT A20 COLUMN DEQUEUED_MESSAGE_NUMBER HEADING 'Dequeued|Message Number' FORMAT 999999 SELECT APPLY_NAME, (DEQUEUE_TIME-DEQUEUED_MESSAGE_CREATE_TIME)*86400 LATENCY, TO_CHAR(DEQUEUED_MESSAGE_CREATE_TIME,'HH24:MI:SS MM/DD/YY') CREATION, TO_CHAR(DEQUEUE_TIME,'HH24:MI:SS MM/DD/YY') LAST_DEQUEUE, DEQUEUED_MESSAGE_NUMBER FROM V$STREAMS_APPLY_READER; --查看 capture 的参数 SET LINESIZE 200 COLUMN CAPUTRE_NAME HEADING 'Apply Process|Name' FORMAT A15 COLUMN PARAMETER HEADING 'Parameter' FORMAT A25 COLUMN VALUE HEADING 'Value' FORMAT A20 COLUMN SET_BY_USER HEADING 'Set by User?' FORMAT A15 SELECT CAPTURE_NAME, PARAMETER, VALUE, SET_BY_USER FROM DBA_CAPTURE_PARAMETERS; 6 问题诊断 6.1 如何知道捕捉(Capture)进程是否运行正常? 以strmadmin 身份,登录主数据库,执行如下语句: SQL> SELECT CAPTURE_NAME, 2 QUEUE_NAME, 3 RULE_SET_NAME, 4 NEGATIVE_RULE_SET_NAME, 5 STATUS 6 FROM DBA_CAPTURE; 结果显示如下: CAPTURE_NAME QUEUE_NAME ------------------------------ ------------------------------ RULE_SET_NAME NEGATIVE_RULE_SET_NAME STATUS ------------------------------ ------------------------------ -------- CAPTURE_PROD PROD_QUEUE RULESET$_14 ENABLED ENABLED 如果 STATUS 状态是 ENABLED,表示 Capture 进程运行正常; 如果 STATUS 状态是 DISABLED,表示 Capture 进程处于停止状态,只需重新启动 即可; 如果 STATUS 状态是 ABORTED,表示 Capture 进程非正常停止,查询相应的 ERROR_NUMBER、ERROR_MESSAGE 列可以得到详细的信息;同时,Oracle 会在跟踪 文件中记录该信息。 6.2 如何知道 Captured LCR是否有传播 GAP? 以strmadmin 身份,登录主数据库,执行如下语句: SQL> SELECT CAPTURE_NAME, QUEUE_NAME, STATUS, CAPTURED_SCN, APPLIED_SCN 2 FROM DBA_CAPTURE; 结果显示如下: CAPTURE_NAME QUEUE_NAME STATUS ------------------------------ ------------------------------ -------- CAPTURED_SCN APPLIED_SCN ------------ ----------- CAPTURE_PROD PROD_QUEUE ENABLED 17023672 17023672 如果 APPLIED_SCN 小于 CAPTURED_SCN,则表示在主数据库一端,要么 LCR 没有 被dequeue,要么 Propagation 进程尚未传播到从数据库一端。 6.3 如何知道 Appy 进程是否运行正常? 以strmadmin 身份,登录从数据库,执行如下语句: SQL> SELECT apply_name, apply_captured, status FROM dba_apply; 结果显示如下: APPLY_NAME APPLY_ STATUS ---------------------- ------ ---------------- APPLY_H10G YES ENABLED 如果 STATUS 状态是 ENABLED,表示 Apply 进程运行正常; 如果 STATUS 状态是 DISABLED,表示 Apply 进程处于停止状态,只需重新启动即 可; 如果 STATUS 状态是 ABORTED,表示 Apply 进程非正常停止,查询相应的 ERROR_NUMBER、ERROR_MESSAGE 列可以得到详细的信息;同时,可以查询 DBA_APPLY_ERROR 视图,了解详细的 Apply 错误信息。 7 重启 重启可以解决一些数据不能同步的问题。 7.17.17.17.1 重启capture capture capture capture 进程 查询dba_capture Select * from dba_capture 关闭capture 进程 exec dbms_capture_adm.stop_capture (capture_name=>'captures_dest'); 启动capture 进程 exec dbms_capture_adm.start_capture (capture_name=>'captures_dest'); 7.27.27.27.2 重启applay applay applay applay 进程 查询dba_apply 来确认 apply 进程名 关闭apply 进程 exec dbms_apply_adm.stop_apply (apply_name=> 'applys_dest'); PL/SQL procedure successfully completed. 启动 apply 进程 exec dbms_apply_adm.start_apply (apply_name=> 'applys_dest'); PL/SQL procedure successfully completed. 7.3 重启propagation propagation propagation propagation 进程 查询 dba_propagation 来确认 propagation 进程 关闭 propagation 进程 exec dbms_propagation_adm.stop_propagation ('PROP_ORAFAHG_TO_PLATDB'); 启动 propagation 进程 exec dbms_propagation_adm.stop_propagation ('prop_src_to_dest ');
还剩33页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

dhjwzw

贡献于2013-12-11

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf