流复制实验之:Streams_single_to_RAC_schames

环境介绍:

这个例子是如何配置单实例到RAC的单向复制.

由于条件限制,单实例数据库同样建在了inode2机器上。

如下表:

 

Source (single instance)

Target (RAC)

IP

172.28.7.244

172.28.7.70

172.28.7.244

OS

Oracle 10.2.0.1 for AIX5.3

Oracle 10.2.0.1 for AIX5.3

DB_NAME

orcl

orcl

Host name

Inode2

Inode1/inode2

global_name

infradb.test.lcz.com.cn

orcl.test.lcz.com.cn

service_names

infradb.test.lcz.com.cn

orcl.test.lcz.com.cn

 

 

配置步骤:

(1).配置tnsnames.ora

初始single\rac(orcl1,orcl2)两个数据库的tnsnames.ora内容相同。

 

orcl2.test.lcz.com.cn =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = inode2-vip)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl.test.lcz.com.cn)

      (INSTANCE_NAME = orcl2)

    )

  )

 

orcl1.test.lcz.com.cn =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = inode1-vip)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl.test.lcz.com.cn)

      (INSTANCE_NAME = orcl1)

    )

  )

 

orcl.test.lcz.com.cn =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = inode1-vip)(PORT = 1521))

    (ADDRESS = (PROTOCOL = TCP)(HOST = inode2-vip)(PORT = 1521))

    (LOAD_BALANCE = yes)

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl.test.lcz.com.cn)

    )

  )

 

infradb.test.lcz.com.cn =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.28.7.244)(PORT = 1522))

    )

    (LOAD_BALANCE = YES)

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = infradb.test.lcz.com.cn)

      (INSTANCE_NAME = orcl)

    )

  )

 

(2).修改global_name.

修改源infradb库的globle_name如下

 

SQL> select * from global_name;

 

GLOBAL_NAME

---------------------------------------------------------

INFRADB.CN.LGCNS.COM

 

SQL> alter database rename global_name to infradb.test.lcz.com.cn;

 

Database altered

 

SQL> select * from global_name;

 

GLOBAL_NAME

--------------------------------------------------------

INFRADB.TEST.LCZ.COM.CN

 

修改目标RAC(orcl)库的globle_name如下

 

SQL> select * from global_name;

 

GLOBAL_NAME

--------------------------------------------------------------------------------

ORCL

 

SQL> alter database rename global_name to orcl.test.lcz.com.cn;

 

Database altered

 

SQL> select * from global_name;

 

GLOBAL_NAME

--------------------------------------------------------------------------------

ORCL.TEST.LCZ.COM.CN

 

(3).修改其它参数

修改源库部分参数:

alter system set global_names=true;

alter system set aq_tm_processes=2;

alter system set aq_tm_processes=10;

alter system set logmnr_max_persistent_sessions=1 scope=spfile;

alter system set open_links=4 scope=spfile sid='*';

alter system set db_domain='test.lcz.com.cn' scope=spfile;

alter system set service_names='infradb.test.lcz.com.cn';

 

修改目标库部分参数:

alter system set global_names=true sid='*';

alter system set aq_tm_processes=2 sid='*';

alter system set aq_tm_processes=10 sid='*';

alter system set logmnr_max_persistent_sessions=1 scope=spfile sid='*';

alter system set open_links=4 scope=spfile sid='*';

alter system set db_domain='test.lcz.com.cn' scope=spfile sid='*';

alter system set service_names='orcl.test.lcz.com.cn' sid='*';

 

注:有些参数需要重启数据库生效

 

(4).在源数据库创建到RAC的数据库的连接

 

SQL> Create User stmdba Identified By oracle;

 

User created

 

SQL> Grant Connect,resource,Dba To stmdba;

 

Grant succeeded

 

SQL> conn stmdba/oracle@infra_db

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0

Connected as stmdba

 

SQL> create database link orcl.test.lcz.com.cn connect to stmdba identified by oracle using 'orcl1.test.lcz.com.cn';

 

Database link created

 

注意:

dblink名字使用的global_name,不是service_name

using连接的是RAC的一个实例,而不是RAC

 

(5).在源数据库建source队列

 

SQL> conn stmdba/oracle@infra_db

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as stmdba

 

Begin

  dbms_streams_adm.set_up_queue(

   queue_table => 'source_queue_table',

   queue_name => 'source_queue');

End;

/

 

(6).在源数据库上创建capture进程

 

Begin

  dbms_streams_adm.add_schema_rules(

    schema_name => 'bjcnsdba',

    streams_type => 'capture',

    streams_name => 'source_capture_stream',

    queue_name => 'source_queue',

    include_dml => True,

    include_ddl => True,

    include_tagged_lcr => False,

    source_database => Null,

    inclusion_rule => True);

End;

/

 

(7).在源数据库上创建传播进程

 

Begin

  dbms_streams_adm.add_schema_propagation_rules(

    schema_name => 'bjcnsdba',

    streams_name => 'propagation_bjcnsdba',

    source_queue_name => 'stmdba.source_queue',

    destination_queue_name => 'stmdba.target_queue@orcl.test.lcz.com.cn',

    include_dml => True,

    include_ddl => True,

    include_tagged_lcr => False,

    source_database => 'infradb.test.lcz.com.cn',

    inclusion_rule => True);

End;

/

 

(8).在目标库的orcl上创建接收队列。

SQL> Create User stmdba Identified By oracle;

User created

 

SQL> Grant Connect,resource,Dba To stmdba;

Grant succeeded

 

SQL> conn stmdba/oracle@orcl1.test.lcz.com.cn

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as stmdba

 

Begin

  dbms_streams_adm.set_up_queue(

   queue_table => 'target_queue_table',

   queue_name => 'target_queue');

End;

/

 

确认接收队列的owner instanceorcl1

 

Select q.Owner, q.Name, t.Queue_Table, t.Owner_Instance

         From Dba_Queues q, Dba_Queue_Tables t

 Where t.Object_Type = 'SYS.ANYDATA'

          And q.Queue_Table = t.Queue_Table

          And q.Owner = t.Owner

 Order By q.Owner;

 

OWNER         NAME                        QUEUE_TABLE          OWNER_INSTANCE

------------- --------------------------- -------------------- --------------

STMDBA        TARGET_QUEUE                TARGET_QUEUE_TABLE                1

STMDBA        AQ$_TARGET_QUEUE_TABLE_E    TARGET_QUEUE_TABLE                1

SYS           SCHEDULER$_JOBQ             SCHEDULER$_JOBQTAB                2

SYS           AQ$_SCHEDULER$_JOBQTAB_E    SCHEDULER$_JOBQTAB                2

 

(9).在目标库orcl1上建apply进程。

 

SQL> conn stmdba/oracle@orcl1.test.lcz.com.cn

 

Begin

  dbms_streams_adm.add_schema_rules(

    schema_name => 'bjcnsdba',

    streams_type => 'apply',

    streams_name => 'target_apply_stream',

    queue_name => 'target_queue',

    include_dml => True,

    include_ddl => True,

    include_tagged_lcr => False,

    source_database => 'infradb.test.lcz.com.cn',

    inclusion_rule => True);

End;

/

 

(10).在目标库上启动apply进程

Begin

  dbms_apply_adm.start_apply(apply_name => 'target_apply_stream');

End;

/

 

(11).从源库上导出数据

 

exp stmdba/oracle@orcl_single owner=bjcnsdba object_consistent=y file=bjcnsdba.dmp grants=y rows=y indexes=y statistics=none

 

(12).在目标库导入数据

 

imp stmdba/oracle fromuser=bjcnsdba touser=bjcnsdba file=/home/orastd/bjcnsdba.dump constraints=y ignore=y grants=y streams_instantiation=y

 

(13).在源库上启动capture:

Begin

  dbms_capture_adm.start_capture(capture_name => 'source_capture_stream');

End;

/

 

(14).验证复制

 

在源上的bjcnsdba用户下执行DDLDML操作,在目标库上检查是否同步。

 

Create Table test3 (Id Int,Name varchar(20));

Insert Into test3

Select 1,'aa' From dual;

Commit;

 

参考文章:《大话oracle RAC》

 

遇到的问题:

 

1.streams全文索引不能同步。

经过测试,如果在一个表建全文索引,此表会停止同步,但不会影响其它表的同步。这可能跟全文索引的特性有关。

这一点跟逻辑DG的特点是相同的

 

2.不同oracle版本同步问题

在第一次的实验中,我源和目标的数据库和系统版本为:

source:oracle 10.2.0.4 for windows2003

target:oracle 10.2.0.1 for AIX5.3

 

在这种配置情况下,在源库建好dblink后,测试不能连接到目标库,如下:

source:

SQL>conn stmadb/oracle

SQL> create database link orcl.test.lcz.com.cn connect to stmdba identified by oracle using 'orcl1.test.lcz.com.cn';

Database link created

SQL>Select * From stmdba.lcz@orcl.test.lcz.com.cn;

ora-00600:internal error code,argument: 2252,12506,3222929989

 

target库的alter日志出现上面的错误

 

Oracle DBMS_STREAMS_ADM 用法例子

2008-12-16 17:54

General Information

Source

{ORACLE_HOME}/rdbms/admin/dbmsstr.sql

First Available

9.2


Constants

Name

Data Type

Value

Instantiation Constants

instantiation_none

BINARY_INTEGER

0

instantiation_table

BINARY_INTEGER

1

instantiation_table_network

BINARY_INTEGER

2

instantiation_schema

BINARY_INTEGER

3

instantiation_schema_network

BINARY_INTEGER

4

instantiation_full

BINARY_INTEGER

5

instantiation_full_network

BINARY_INTEGER

6

instantiation_tts

BINARY_INTEGER

7

instantiation_tts_network

BINARY_INTEGER

8

Prepare_Upgrade API Constants

exclude_flags_full

BINARY_INTEGER

1

exclude_flags_unsupported

BINARY_INTEGER

2

exclude_flags_dml

BINARY_INTEGER

4

exclude_flags_ddl

BINARY_INTEGER

8

Message Tracing Constants

action_trace

BINARY_INTEGER

1

action_memory

BINARY_INTEGER

2


Definitions

Keyword

Definition

destination _queue_name

 

tagged_lcr

Every redo log entry has an associated tag. The datatype of the tag is RAW. By default, when a user or application generates redo entries, the value of the tag is NULL.

You can configure how tag values are interpreted. A tag can be used to determine whether an LCR contains a change that originated in the local database or at a different database, so that to avoid change cycling (sending an LCR back to the database where it originated). Tags can be used for other LCR tracking purposes as well. For example to specify the set of destination databases for each LCR.

Create tags with DBMS_STREAMS.SET_TAG.


Dependencies

SELECT name
FROM dba_dependencies
WHERE referenced_name = 'DBMS_STREAMS_ADM'
UNION
SELECT referenced_name
FROM dba_dependencies
WHERE name = 'DBMS_STREAMS_ADM';


Exceptions

Error Code

Reason

ORA-26664

Can not create process

ORA-26665

Process exists

ORA-26667

Invalid parameter

ORA-26698

Client Rule Set does not exist

ORA-26699

Dequeue exists

ORA-26701

Process does not exist

ORA-26723

Role required

ORA-26724

Set user to SYS

ORA-26754

Mult trans specified

Security Model

Execute is granted to the EXECUTE_CATALOG_ROLE role

 

 

 

ORA-26665 When Creating A Capture Process

 

 

ORA-26665 When Creating A Capture Process [ID 279666.1]

 

 

 

The information in this article applies to:

Oracle Streams for Oracle Database 10g.

 

 

Symptoms

==========

When attempting to add rules to the rule set for an existing capture process using

DBMS_STREAMS_ADM.ADD_TABLE_RULES (or similar procedure) you get ORA-26665: STREAMS

process CAPTURE01 already exists. Both the capture process and the queue exist.

 

SELECT capture_name FROM dba_capture;

 

CAPTURE_NAME

------------------------------

STRM01_CAPTURE

 

SELECT name FROM user_queues;

 

NAME

------------------------------

AQ$_ORDERS_QUEUETABLE_E

ORDERS_QUEUE

AQ$_STREAMS_QUEUE_TABLE_E

STREAMS_QUEUE

 

 

BEGIN

  DBMS_STREAMS_ADM.ADD_TABLE_RULES(

    table_name         => 'oe.order_items',

    streams_type       => 'capture',

    streams_name       => 'capture01',

    queue_name         => 'IX.streams_queue',

    include_dml        => TRUE,

    include_ddl        => TRUE,

    include_tagged_lcr => FALSE,

    inclusion_rule     => TRUE);

END;

/

 

BEGIN

*

ERROR at line 1:

ORA-26665: STREAMS process CAPTURE01 already exists

ORA-06512: at "SYS.DBMS_STREAMS_ADM", line 369

ORA-06512: at "SYS.DBMS_STREAMS_ADM", line 309

ORA-06512: at line 2

 

Begin

  dbms_streams_adm.add_schema_rules(

    schema_name => 'lcz',

    streams_type => 'capture',

    streams_name => 'source_capture_stream',

    queue_name => 'source_queue',

    include_dml => True,

    include_ddl => True,

    include_tagged_lcr => False,

    source_database => Null,

    inclusion_rule => True);

End;

/

 

ORA-26665: STREAMS process SOURCE_CAPTURE_STREAM already exists

ORA-06512: at "SYS.DBMS_STREAMS_ADM_UTL_INVOK", line 289

ORA-06512: at "SYS.DBMS_STREAMS_ADM", line 439

ORA-06512: at "SYS.DBMS_STREAMS_ADM", line 397

ORA-06512: at line 2

 

Cause

======

This error is signalled if the queue name specified in the ADD_TABLE_RULE procedure

does not match the queue name specified for the existing capture process.

 

 

Fix

======

Determine the name and owner of the queue currently associated with the capture process:

 

SELECT capture_name, queue_owner, queue_name

FROM dba_capture;

 

CAPTURE_NAME                   QUEUE_OWNER

------------------------------ ------------------------------

QUEUE_NAME

------------------------------

STRM01_CAPTURE                 STRMADMIN

STREAMS_QUEUE

 

 

SELECT owner, name FROM dba_queues

WHERE name = 'STREAMS_QUEUE';

 

OWNER                          NAME

------------------------------ ------------------------------

IX                             STREAMS_QUEUE

STRMADMIN                      STREAMS_QUEUE

 

Use the fully qualified name of the queue for the existing capture process

when adding rules to the rule sets of the capture process. To associated rules

with a capture process for a different queue, change the name of the capture

process to create a new capture process for the other queue.

 

Reference

==========

PL/SQL Packages and Types Reference, DBMS_CAPTURE_ADM.CREATE_CAPTURE

Oracle Streams Concepts and Administration, Chapter 2 "Streams Capture Process"

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值