Setting up Bidirectional Streams SCHEMA Replication
Details below are for configuring a schema level replication using API DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS.
1. Verify Source & Target System for Streams Configuration
CONNECT system/manager@ {STREAMS/STRMREPL}
SET SQLPROMPT "STREAMS> "
set pages 0;
set linesize 2000;
SELECT * FROM global_name;
SHOW PARAMETER service_names
SHOW PARAMETER global_names
-- Verify database parameters
col name HEADING 'Parameter|Name' format a30
col value HEADING 'Parameter|Value' format a15
col description HEADING 'Description' format a60 word
select name,value,description from v$parameter where name in
('aq_tm_processes', 'archive_lag_target', 'job_queue_processes','_job_queue_interval',
'shared_pool_size', 'sga_max_size', 'sga_target','streams_pool_size',
'global_names', 'compatible','log_parallelism', 'logmnr_max_persistent_sessions',
'parallel_max_servers', 'processes', 'sessions'
);
-- Verify ARCHIVELOG mode and archive log settings
ARCHIVE LOG LIST
SHOW PARAMETER log_archive_format
SHOW PARAMETER log_archive_dest_1
SHOW PARAMETER log_archive_dest_state_1
-- Verify Streams administrator
SELECT username, account_status, default_tablespace
FROM DBA_USERS
WHERE username = 'STRMADMIN';
SELECT *
FROM DBA_STREAMS_ADMINISTRATOR;
-- Verify database link as Streams administrator
CONNECT strmadmin/strmadmin@STREAMS
SELECT db_link
FROM DBA_DB_LINKS;
-- Verify directory objects
SELECT directory_name, directory_path
FROM dba_directories;
2. Setting Up SCOTT Schema Replication
STREAMS>>conn scott/tiger Connected. STREAMS>>select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- DEPT TABLE EMP TABLE BONUS TABLE SALGRADE TABLE SALES TABLE COSTS TABLE TIMES TABLE CHANNELS TABLE PROMOTIONS TABLE COUNTRIES TABLE PRODUCTS TABLE CATEGORIES_TAB TABLE PRODUCT_REF_LIST_NESTEDTAB TABLE SUBCATEGORY_REF_LIST_NESTEDTAB TABLE CUSTOMERS TABLE EMP_REPL TABLE 16 rows selected. STRMREPL>>conn scott/tiger Connected. STRMREPL>>select * from tab; no rows selected There are no tables existing at destination schema : SCOTT@STRMREPL set serveroutput on; set term on; set lines 200; BEGIN DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS( schema_names => 'SCOTT', source_directory_object => 'STREAMS_DIR', destination_directory_object => 'STRMREPL_DIR', source_database => 'STREAMS', destination_database => 'STRMREPL', perform_actions => TRUE, dump_file_name => 'scott_exp.dmp', capture_name => 'SCOTT_CAP', capture_queue_table => 'SCOTT_SCHEMA_CAPTURE_QT', capture_queue_name => 'SCOTT_SCHEMA_CAPTURE_Q', propagation_name => 'SCOTT_SCHEMA_PROPAGATION', apply_name => 'SCOTT_SCHEMA_APPLY', apply_queue_table => 'strmadmin.SCOTT_SCHEMA_APPLY_QT', apply_queue_name => 'strmadmin.SCOTT_SCHEMA_APPLY_Q', bi_directional=> TRUE, include_ddl => FALSE, instantiation=>DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA); END; / job finished PL/SQL procedure successfully completed. This can take a long time depending on schema to be replciated. To monitor progress have alook at filesizes of expdp operation "scott_exp.dmp" at STREAMS_DIR & STRMREPL_DIR select from dba_recoverable_script_errors to see there were no errors STREAMS>> select error_message,block_num from dba_recoverable_script_errors STRMREPL>>conn scott/tiger Connected. STRMREPL>>select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- DEPT TABLE EMP TABLE BONUS TABLE SALGRADE TABLE SALES TABLE COSTS TABLE TIMES TABLE CHANNELS TABLE PROMOTIONS TABLE COUNTRIES TABLE PRODUCTS TABLE CATEGORIES_TAB TABLE PRODUCT_REF_LIST_NESTEDTAB TABLE SUBCATEGORY_REF_LIST_NESTEDTAB TABLE CUSTOMERS TABLE EMP_REPL TABLE 16 rows selected.
3) Let’s verify DML changes executed in STREAMS are propagated to STRMREPL database
STREAMS>>delete from scott.promotions;
2 rows deleted.
STREAMS>>commit;
Commit complete.
STREAMS>>select count(*) from scott.promotions;
COUNT(*)
----------
0
At replicated Site
STRMREPL>>select count(*) from scott.promotions;
COUNT(*)
----------
0
Note the DDL changes are not replicated as I set "include_ddl => FALSE" at "MAINTAIN_SCHEMAS"
STREAMS>>drop table scott.emp;
Table dropped.
STREAMS>>desc scott.emp;
ERROR:
ORA-04043: object scott.emp does not exist
STRMREPL>>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)
Issues Noticed
STREAMS>>select error_message,block_num from dba_recoverable_script_errors; ERROR_MESSAGE -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BLOCK_NUM ---------- ORA-24035: AQ agent is not a subscriber for queue STRMADMIN.SCOTT_SCHEMA_CAPTURE_Q I fixed it by deleting rows from following 2 tables. SQL> conn / as sysdba Connected. STREAMS>> delete from dba_recoverable_script_errors; STREAMS>> delete from dba_recoverable_script; STREAMS>> commit;
If needed you can delete all streams config details except db_links and parameters using API below
A) Disable propagation schedule
STREAMS>> exec dbms_aqadm.disable_propagation_schedule(queue_name => 'SCOTT_SCHEMA_CAPTURE_Q',destination => 'STRMREPL',destination_queue => 'strmadmin.SCOTT_SCHEMA_APPLY_Q');
B) Drop propagation
STREAMS>> exec dbms_propagation_adm.drop_propagation(propagation_name => 'SCOTT_SCHEMA_PROPAGATION',drop_unused_rule_sets => true);
PL/SQL procedure successfully completed.
C) Remove Streams
STREAMS>> exec dbms_streams_adm.remove_streams_configuration;
PL/SQL procedure successfully completed.
D) Drop Queues for capture and apply
– drop capture queue
STREAMS>>exec DBMS_STREAMS_ADM.REMOVE_QUEUE('SCOTT_SCHEMA_CAPTURE_Q',TRUE);
PL/SQL procedure successfully completed.
– drop apply queue
STREAMS>>Exec DBMS_STREAMS_ADM.REMOVE_QUEUE('strmadmin.SCOTT_SCHEMA_APPLY_Q',TRUE);
PL/SQL procedure successfully completed.
Finally delete any STREAMs errors reported
STREAMS>> delete from dba_recoverable_script_errors;
STREAMS>> delete from dba_recoverable_script;
STREAMS>> commit;


Leave a Reply
You must be logged in to post a comment.