Skip Headers
Oracle® Streams Replication Administrator's Guide
10g Release 2 (10.2)

Part Number B14228-02
Go to Documentation Home
Home
Go to Book List
Book List
Go to Table of Contents
Contents
Go to Index
Index
Go to Master Index
Master Index
Go to Feedback page
Contact Us

Go to previous page
Previous
Go to next page
Next
View PDF

18 Simple Single-Source Replication Example

This chapter illustrates an example of a simple single-source replication environment that can be constructed using Streams.

This chapter contains these topics:

Overview of the Simple Single-Source Replication Example

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 18-1 provides an overview of the environment.

Figure 18-1 Simple Example that Shares Data from a Single-Source Database

Description of Figure 18-1 follows
Description of "Figure 18-1 Simple Example that Shares Data from a Single-Source Database"

Prerequisites

The following prerequisites must be completed before you begin the example in this chapter.

Set Up Users and Create Queues and Database Links

Complete the following steps to set up users and create queues and database links for a Streams replication environment that includes two Oracle databases.

  1. Show Output and Spool Results

  2. Set Up Users at str1.net

  3. Create the ANYDATA Queue at str1.net

  4. Create the Database Link at str1.net

  5. Set Up Users at str2.net

  6. Set Up the ANYDATA Queue at str2.net

  7. Check the Spool Results

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:

  • For security purposes, use a password other than strmadminpw for the Streams administrator.

  • The ACCEPT command must appear on a single line in the script.

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:

*/

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:

  • For security purposes, use a password other than strmadminpw for the Streams administrator.

  • The ACCEPT command must appear on a single line in the script.

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:

*/

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 ******************************/

Configure Capture, Propagation, and Apply for Changes to One Table

Complete the following steps to specify the capture, propagation, and apply definitions for the hr.jobs table using the DBMS_STEAMS_ADM package.

  1. Show Output and Spool Results

  2. Configure Propagation at str1.net

  3. Configure the Capture Process at str1.net

  4. Set the Instantiation SCN for the hr.jobs Table at str2.net

  5. Configure the Apply Process at str2.net

  6. Start the Apply Process at str2.net

  7. Start the Capture Process at str1.net

  8. Check the Spool Results

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 the hr.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 ******************************/

Make Changes to the hr.jobs Table and View Results

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.