Oracle® Streams Replication Administrator's Guide 10g Release 2 (10.2) Part Number B14228-01 |
|
|
View PDF |
This chapter illustrates an example of a simple single-source replication environment that can be constructed using Streams.
This chapter contains these topics:
Configure Capture, Propagation, and Apply for Changes to One Table
Make Changes to the hr.jobs Table and View Results
Note: The extended example is not included in the PDF version of this chapter, but it is included in the HTML version of the chapter. |
The example in this chapter illustrates using Streams to replicate data in one table between two databases. A capture process captures data manipulation language (DML) and data definition language (DDL) changes made to the jobs
table in the hr
schema at the str1.net
Oracle database, and a propagation propagates these changes to the str2.net
Oracle database. Next, an apply process applies these changes at the str2.net
database. This example assumes that the hr.jobs
table is read-only at the str2.net
database.
Figure 14-1 provides an overview of the environment.
Figure 14-1 Simple Example that Shares Data from a Single-Source Database
The following prerequisites must be completed before you begin the example in this chapter.
Set the following initialization parameters to the values indicated:
GLOBAL_NAMES
: This parameter must be set to true
at each database that is participating in your Streams environment.
JOB_QUEUE_PROCESSES
: This parameter must be set to at least 2
at each database that is propagating messages in your Streams environment. It should be set to the same value as the maximum number of jobs that can run simultaneously plus one. In this example, str1.net
propagates messages. So, JOB_QUEUE_PROCESSES
must be set to at least 2
at str1.net
.
COMPATIBLE
: This parameter must be set to 10.2.0
or higher at each database that is participating in your Streams environment.
STREAMS_POOL_SIZE
: Optionally set this parameter to an appropriate value for each database in the environment. This parameter specifies the size of the Streams pool. The Streams pool stores messages in a buffered queue and is used for internal communications during parallel capture and apply. When the SGA_TARGET
initialization parameter is set to a nonzero value, the Streams pool size is managed by Automatic Shared Memory Management.
See Also: Oracle Streams Concepts and Administration for information about other initialization parameters that are important in a Streams environment |
Any database producing changes that will be captured must be running in ARCHIVELOG
mode. In this example, changes are produced at str1.net
, and so str1.net
must be running in ARCHIVELOG
mode.
See Also: Oracle Database Administrator's Guide for information about running a database inARCHIVELOG mode |
Configure your network and Oracle Net so that the str1.net
database can communicate with the str2.net
database.
This example creates a new user to function as the Streams administrator (strmadmin
) at each database and prompts you for the tablespace you want to use for this user's data. Before you start this example, either create a new tablespace or identify an existing tablespace for the Streams administrator to use at each database. The Streams administrator should not use the SYSTEM
tablespace.
Complete the following steps to set up users and create queues and database links for a Streams replication environment that includes two Oracle databases.
Note: If you are viewing this document online, then you can copy the text from the "BEGINNING OF SCRIPT" line after this note to the next "END OF SCRIPT" line into a text editor and then edit the text to create a script for your environment. Run the script with SQL*Plus on a computer that can connect to all of the databases in the environment. |
/************************* BEGINNING OF SCRIPT ******************************
Step 1 Show Output and Spool Results
Run SET
ECHO
ON
and specify the spool file for the script. Check the spool file for errors after you run this script.
*/ SET ECHO ON SPOOL streams_setup_simple.out /*
Step 2 Set Up Users at str1.net
Connect to str1.net
as SYSTEM
user.
*/ CONNECT SYSTEM/MANAGER@str1.net /*
Create the Streams administrator named strmadmin
and grant this user the necessary privileges. These privileges enable the user to manage queues, execute subprograms in packages related to Streams, create rule sets, create rules, and monitor the Streams environment by querying data dictionary views and queue tables. You can choose a different name for this user.
Note:
|
See Also: Oracle Streams Concepts and Administration for more information about configuring a Streams administrator |
*/ GRANT DBA TO strmadmin IDENTIFIED BY strmadminpw; ACCEPT streams_tbs PROMPT 'Enter Streams administrator tablespace on str1.net: ' ALTER USER strmadmin DEFAULT TABLESPACE &streams_tbs QUOTA UNLIMITED ON &streams_tbs;
/*
Step 3 Create the ANYDATA Queue at str1.net
Connect as the Streams administrator at the database where you want to capture changes. In this example, that database is str1.net
.
*/ CONNECT strmadmin/strmadminpw@str1.net /*
Run the SET_UP_QUEUE
procedure to create a queue named streams_queue
at str1.net
. This queue will function as the ANYDATA
queue by holding the captured changes that will be propagated to other databases.
Running the SET_UP_QUEUE
procedure performs the following actions:
Creates a queue table named streams_queue_table
. This queue table is owned by the Streams administrator (strmadmin
) and uses the default storage of this user.
Creates a queue named streams_queue
owned by the Streams administrator (strmadmin
).
Starts the queue.
*/ EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE(); /*
Step 4 Create the Database Link at str1.net
Create the database link from the database where changes are captured to the database where changes are propagated. In this example, the database where changes are captured is str1.net
, and these changes are propagated to str2.net
.
*/ CREATE DATABASE LINK str2.net CONNECT TO strmadmin IDENTIFIED BY strmadminpw USING 'str2.net'; /*
Step 5 Set Up Users at str2.net
Connect to str2.net
as SYSTEM
user.
*/ CONNECT SYSTEM/MANAGER@str2.net /*
Create the Streams administrator named strmadmin
and grant this user the necessary privileges. These privileges enable the user to manage queues, execute subprograms in packages related to Streams, create rule sets, create rules, and monitor the Streams environment by querying data dictionary views and queue tables. In this example, the Streams administrator will be the apply user for the apply process and must be able to apply changes to the hr.jobs
table at str2.net
. Therefore, the Streams administrator is granted ALL
privileges on this table. You can choose a different name for the Streams administrator.
Note:
|
See Also: Oracle Streams Concepts and Administration for more information about configuring a Streams administrator |
*/ GRANT DBA TO strmadmin IDENTIFIED BY strmadminpw; ACCEPT streams_tbs PROMPT 'Enter Streams administrator tablespace on str2.net: ' ALTER USER strmadmin DEFAULT TABLESPACE &streams_tbs QUOTA UNLIMITED ON &streams_tbs; GRANT ALL ON hr.jobs TO strmadmin;
/*
Step 6 Set Up the ANYDATA Queue at str2.net
Connect as the Streams administrator at str2.net
.
*/ CONNECT strmadmin/strmadminpw@str2.net /*
Run the SET_UP_QUEUE
procedure to create a queue named streams_queue
at str2.net
. This queue will function as the ANYDATA
queue by holding the changes that will be applied at this database.
Running the SET_UP_QUEUE
procedure performs the following actions:
Creates a queue table named streams_queue_table
. This queue table is owned by the Streams administrator (strmadmin
) and uses the default storage of this user.
Creates a queue named streams_queue
owned by the Streams administrator (strmadmin
).
Starts the queue.
*/ EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE(); /*
Step 7 Check the Spool Results
Check the streams_setup_simple.out
spool file to ensure that all actions finished successfully after this script is completed.
*/ SET ECHO OFF SPOOL OFF /*************************** END OF SCRIPT ******************************/
Complete the following steps to specify the capture, propagation, and apply definitions for the hr.jobs
table using the DBMS_STEAMS_ADM
package.
Note: If you are viewing this document online, then you can copy the text from the "BEGINNING OF SCRIPT" line after this note to the next "END OF SCRIPT" line into a text editor and then edit the text to create a script for your environment. Run the script with SQL*Plus on a computer that can connect to all of the databases in the environment. |
/************************* BEGINNING OF SCRIPT ******************************
Step 1 Show Output and Spool Results
Run SET
ECHO
ON
and specify the spool file for the script. Check the spool file for errors after you run this script.
*/ SET ECHO ON SPOOL streams_share_jobs.out /*
Step 2 Configure Propagation at str1.net
Connect to str1.net
as the strmadmin
user.
*/ CONNECT strmadmin/strmadminpw@str1.net /*
Configure and schedule propagation of DML and DDL changes to the hr.jobs
table from the queue at str1.net
to the queue at str2.net
.
*/ BEGIN DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES( table_name => 'hr.jobs', streams_name => 'str1_to_str2', source_queue_name => 'strmadmin.streams_queue', destination_queue_name => 'strmadmin.streams_queue@str2.net', include_dml => true, include_ddl => true, source_database => 'str1.net', inclusion_rule => true, queue_to_queue => true); END; / /*
Step 3 Configure the Capture Process at str1.net
Configure the capture process to capture changes to the hr.jobs
table at str1.net
. This step specifies that changes to this table are captured by the capture process and enqueued into the specified queue.
This step also prepares the hr.jobs
table for instantiation and enables supplemental logging for any primary key, unique key, bitmap index, and foreign key columns in this table. Supplemental logging places additional information in the redo log for changes made to tables. The apply process needs this extra information to perform certain operations, such as unique row identification and conflict resolution. Because str1.net
is the only database where changes are captured in this environment, it is the only database where supplemental logging must be enabled for the hr.jobs
table.
*/ BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'hr.jobs', streams_type => 'capture', streams_name => 'capture_simp', queue_name => 'strmadmin.streams_queue', include_dml => true, include_ddl => true, inclusion_rule => true); END; / /*
Step 4 Set the Instantiation SCN for the hr.jobs Table at str2.net
This example assumes that the hr.jobs
table exists at both the str1.net
database and the str2.net
database, and that this table is synchronized at these databases. Because the hr.jobs
table already exists at str2.net
, this example uses the GET_SYSTEM_CHANGE_NUMBER
function in the DBMS_FLASHBACK
package at str1.net
to obtain the current SCN for the source database. This SCN is used at str2.net
to run the SET_TABLE_INSTANTIATION_SCN
procedure in the DBMS_APPLY_ADM
package. Running this procedure sets the instantiation SCN for the hr.jobs
table at str2.net
.
The SET_TABLE_INSTANTIATION_SCN
procedure controls which LCRs for a table are ignored by an apply process and which LCRs for a table are applied by an apply process. If the commit SCN of an LCR for a table from a source database is less than or equal to the instantiation SCN for that table at a destination database, then the apply process at the destination database discards the LCR. Otherwise, the apply process applies the LCR.
In this example, both of the apply process at str2.net
will apply transactions to the hr.jobs
table with SCNs that were committed after SCN obtained in this step.
Note: This example assumes that the contents of thehr.jobs table at str1.net and str2.net are consistent when you complete this step. Make sure there is no activity on this table while the instantiation SCN is being set. You might want to lock the table at each database while you complete this step to ensure consistency. If the table does not exist at the destination database, then you can use export/import for instantiation. |
*/ DECLARE iscn NUMBER; -- Variable to hold instantiation SCN value BEGIN iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER(); DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@STR2.NET( source_object_name => 'hr.jobs', source_database_name => 'str1.net', instantiation_scn => iscn); END; / /*
Step 5 Configure the Apply Process at str2.net
Connect to str2.net
as the strmadmin
user.
*/ CONNECT strmadmin/strmadminpw@str2.net /*
Configure str2.net
to apply changes to the hr.jobs
table.
*/ BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'hr.jobs', streams_type => 'apply', streams_name => 'apply_simp', queue_name => 'strmadmin.streams_queue', include_dml => true, include_ddl => true, source_database => 'str1.net', inclusion_rule => true); END; / /*
Step 6 Start the Apply Process at str2.net
Set the disable_on_error
parameter to n
so that the apply process will not be disabled if it encounters an error, and start the apply process at str2.net
.
*/ BEGIN DBMS_APPLY_ADM.SET_PARAMETER( apply_name => 'apply_simp', parameter => 'disable_on_error', value => 'n'); END; / BEGIN DBMS_APPLY_ADM.START_APPLY( apply_name => 'apply_simp'); END; / /*
Step 7 Start the Capture Process at str1.net
Connect to str1.net
as the strmadmin
user.
*/ CONNECT strmadmin/strmadminpw@str1.net /*
Start the capture process at str1.net
.
*/ BEGIN DBMS_CAPTURE_ADM.START_CAPTURE( capture_name => 'capture_simp'); END; / /*
Step 8 Check the Spool Results
Check the streams_share_jobs.out
spool file to ensure that all actions finished successfully after this script is completed.
*/ SET ECHO OFF SPOOL OFF /*************************** END OF SCRIPT ******************************/
Complete the following steps to make DML and DDL changes to the hr.jobs
table at str1.net
and then confirm that the changes were captured at str1.net
, propagated from str1.net
to str2.net
, and applied to the hr.jobs
table at str2.net
.
Step 1 Make Changes to hr.jobs at str1.net
Make the following changes to the hr.jobs
table.
CONNECT hr/hr@str1.net UPDATE hr.jobs SET max_salary=9545 WHERE job_id='PR_REP'; COMMIT; ALTER TABLE hr.jobs ADD(duties VARCHAR2(4000));
Step 2 Query and Describe the hr.jobs Table at str2.net
After some time passes to allow for capture, propagation, and apply of the changes performed in the previous step, run the following query to confirm that the UPDATE
change was propagated and applied at str2.net
:
CONNECT hr/hr@str2.net SELECT * FROM hr.jobs WHERE job_id='PR_REP';
The value in the max_salary
column should be 9545
.
Next, describe the hr.jobs
table to confirm that the ALTER
TABLE
change was propagated and applied at str2.net
:
DESC hr.jobs
The duties
column should be the last column.