现在的位置: 首页 > 综合 > 正文

Oracle Stream Replication技术

2012年04月19日 ⁄ 综合 ⁄ 共 6967字 ⁄ 字号 评论关闭

 

Stream Oracle 的消息队列(也叫Oracle Advanced Queue)技术的一种扩展应用。 Oracle 的消息队列是通过发布/订阅的方式来解决事件管理。流复制(Stream replication)只是基于它的一个数据共享技术,也可以被用作一个可灵活定制的高可用性方案。 它可以实现两个数据库之间数据库级,schema级,Table级的数据同步,并且这种同步可以是双向的。 Oracle Stream也是通过数据冗余来提高可用性,这一点和Data Guard 类型。

Oracle 高级复制(Oracle advanced Replication) 流复制(Stream Replication) 是从名称和功能上都相似的两种技术。 但前者是基于触发器的,后者是基于日志挖掘(Logminer)技术

 

 

 

1. Stream 的工作原理

 

Stream Oracle Advanced Queue技术的一种扩展应用, 这种技术最基本的原理就是收集事件,把时间保存在队列中,然后把这些事件发布给不同的订阅者。 从DBA的角度来说, 就是把捕获Oracle数据库产生的Redo日志,然后把这些日志通过网络传播到多个数据库,其他数据库通过应用这些日志,达到复制变化的作用。 

Stream 环境下, 复制的起点数据库叫作Source Database, 复制的终点数据库叫作Target Database。 在这两个数据库上都要创建一个队列,其中的Source Database上的是发送队列,而Target Database上的是接收队列。

数据库的所有操作都会被记录在日志中。 配好Stream环境后, 在Source Database上会有一个捕获进程(Capture Process), 该进程利用Logminer技术从日志中提取DDL,DML语句,这些语句用一种特殊的格式表达,叫作逻辑变更记录(Logical Change Record, LCR). 一个LCR对应一个原子的行变更,因此源数据库上的一个DML语句,可能对应若干个LCR记录。 这些LCR会保存到Sourece Database的本地发送队列中。然后传播进程(Propagation Process)把这些记录通过网络发送到Target Database的接收队列。 在Target Database上会有一个应用进程(Apply Process), 这个进程从本地的接收队列中取出LCR记录,然后在本地应用,实现数据同步

 

 

2.  Data Guard Stream 区别

Date Guard有两种类型:physical standby 和 logical standby。 这两中standby 都有3个功能模块: 日志传送;日志接收,日志恢复。两种standby在前两个模块中是一样的,都是通过LGWR或者ARCn进程发送日志,通过RFS进程接受日志。 区别在第三个模块:

Physical Standby 使用的是Media Recovery技术直接在数据块级别进行恢复, 因此Physical Standby 能够做到两个数据库的完全同步, 没有数据类型限制。 

Logical Standby实际是通过Logminer技术,把日志中的记录还原成SQL语句,然后通过Apply Engine 执行这些语句实现数据同步, 因此Logical Standby不能保证数据的完全一致。 比如Logical Standby 不支持某些数据类型,这一点在选择Logical Standby时必须要考虑Logical Standby 不支持的数据类型可以从DBA_LOGSTDBY_UNSUPPORTED是不里查看.

    SQL>SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;

 

 

Stream 使用的是Logical Standby 第三个模块,也就是在Source Database一端,Capture 进程利用Logminer 技术把日志内容还原成LCR, 然后发送到Target Database, 而在Target database 一端, 也是通过Apply Engine 执行这些LCR。 因此Stream在使用上也有些限制条件。这些可以从视图ALL/DBA_STREAMS_NEWLY_SUPPORTED,  ALL/DBA_STREAMS_UNSUPPORTED 查看stream复制不支持的数据类型。

 

 SQL>SELECT table_name, reason FROM ALL_STREAMS_NEWLY_SUPPORTED;

 SQL>SELECT table_name, reason FROM DBA_STREAMS_NEWLY_SUPPORTED;

  

 SQL>SELECT table_name, reason FROM DBA_STREAMS_UNSUPPORTED;

 SQL>SELECT table_name, reason FROM ALL_STREAMS_UNSUPPORTED;

 

下面以图表的形式列举他们的区别:

Streams

Data Guard

主要目的是数据共享

主要目的是灾难恢复和高可用性

可以多方向同步

只能是单向,从Primary--> Standby

数据粒度可以是数据库,SchemaTable三个级别

只有数据库级别

支持异种平台的同步(Heterogeneous Platforms)

必须同种平台 (Homogeneous Platforms)

参与复制的每个数据库可以读写

只有Primary可以读写,Standby 只读

支持Oracle 和非Oracle 数据库间的同步

只能是Oracle数据库间

 

 

 

3. 前期规划的几点:

   1). 确定复制集:如是数据库级还是表级

   2). 决定复制站点

   3). 决定LCR是本地捕获还是下游捕获

        本地捕获: 在源数据库进行,从联机日志和归档日志获得LCR

        下游捕获:在目标数据库进行,从归档日志获得LCR. 

      本地捕获可以保护更多的数据,但是会占用源数据库的资源。

   4). 决定复制拓扑结构:这时要决定复制数据库的用途,是只用于预防灾难,还是平时保持空闲,或允许用户使用。

 

 

 

 

 

 

4. Streams Replication 实例

 

4.1 准备工作:

DBA是源数据库, DBA2是目标数据库

 

4.1.1 源数据库和目标数据库必须是归档的

 

SQL> startup mount;

SQL> alter database archivelog;

SQL> alter database open;

SQL> archive log list

 

归档与非归档的切换请参考:

http://blog.csdn.net/tianlesoftware/archive/2009/10/18/4693470.aspx

或者

http://user.qzone.qq.com/251097186/blog/1236924069

 

4.1.2. 数据库和目的数据库均需要设置的参数:

 

alter system set global_names=true scope = both;

默认为false Database Link 使用的是数据库的global_name。 

alter system set aq_tm_processes=2 scope=both;

以下参数都是10G的默认值, 检查下就可以了. 无需设置

如:Show parameter job_queue_processes 

alter system set job_queue_processes = 10 scope=both;

alter system set sga_target = 300m scope=spfile;

alter system set open_links=4 scope=spfile;

alter system set statistics_level='TYPICAL' scope=both;

10g 默认为Typical, 性能统计模式

alter system set logmnr_max_persistent_sessions=1 scope=spfile;

10g 默认为1,持久的日志挖掘会话数。

alter system set "_job_queue_interval"=1 scope=spfile;
alter system set aq_tm_processes=1;
alter system set streams_pool_size=200m scope=both;
注意streams_pool_size一定要够大,因为如果启用了SGA_TARGETORACLE可能分配很少内存给stream导致大量信息被spill到磁盘导致查询DBA_APPLY,DBA_CAPTURE,DBA_PROPGATION全部状态ENABLED但就是没有数据被同步。
同时设置_job_queue_interval也是为了提高队列检查时间,防止apply出问题。

注意:与复制有关的2个参数:

如果等了足够长的时间发现数据没有复制过来,仔细检查了capture/propagation/apply各进程的状态都是正常的, 并检查参数.

alter system set "_job_queue_interval"=1 scope=spfile;

并且将aq_tm_processes参数改为1(我原来这是为10

alter system set aq_tm_processes=1;

改完后重启,发现数据就可以去了。这个隐含参数只是控制对job队列的检查频率,默认5

 

4.1.3 . 在源数据库上启用追加日志 

可以基于Database级别或Table级别,启用追加日志(Supplemental Log)。在建立根据Schema粒度进行复制的Oracle Stream环境中,如果确认Schema下所有Table都有合理的主键(Primary Key),则不再需要启用追加日志。 

#启用Database 追加日志 

alter database add supplemental log data; 

 

#启用Table追加日志 

alter table add supplement log group log_group_name(table_column_name) always; 

 

4.1.4 . 数据库和目的数据库创建相同表空间和用户并赋权

 

创建表空间:

CREATE TABLESPACE streams_tbs DATAFILE 'D:/ORACLE/ORADATA/DBA/streams_tbs.dbf' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

CREATE TABLESPACE streams_tbs DATAFILE 'D:/ORACLE/ORADATA/DBA2/streams_tbs.dbf' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

创建用户:

CREATE USER strmadmin IDENTIFIED BY strmadmin DEFAULT TABLESPACE streams_tbs

QUOTA UNLIMITED ON streams_tbs;

赋权:

GRANT DBA to strmadmin;   /* 10g要求dba角色以简化配置 */

exec DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('strmadmin'); /* 赋予流管理特权 */

 

4.1.5 配置listener.ora和tnsnames.Ora

DBA2 =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.10.80)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = DBA2.anqingren.org)

    )

  )

 

4.1.6 创建DBLink

 

先用strmadmin登陆,在创建dblink

 

4.1.6.1在源端建到目库的db link 

SQL> conn strmadmin/strmadmin;

已连接。

SQL> create database link DBA2 connect to strmadmin identified by strmadmin using 'dba2';

数据库链接已创建。

 

测试:

SQL> select * from global_name@dba2;

GLOBAL_NAME

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

DBA2.ANQINGREN.ORG

 

4.1.6.2 在目端建到源库的db link

SQL> conn strmadmin/strmadmin;

已连接。

SQL> create database link dba connect to strmadmin identified by strmadmin using 'dba';

数据库链接已创建。

 

 

4.2  用户级的复制(不支持sys和system用户)

 

4.2.1 最初的用户复制

 

分别在源库和目标数据库上创建测试用户

SQL>create user dave identified by dave;

SQL>grant dba to dave;

 

4.2.1 在源数据库上创建Source 队列

connect  strmadmin/strmadmin@dba;

BEGIN                                                                                                                          

 DBMS_STREAMS_ADM.SET_UP_QUEUE(                                                                                            

         queue_table => 'SOURCE_QUEUE_TABLE',             --队列表                                                                  

         queue_name  => 'SOURCE_QUEUE',                --队列                                                                     

         queue_user  => 'strmadmin');                  --队列用户                                                                   

END;                                   

/     

或者:

SQL> EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE();

PL/SQL procedure successfully completed.

 

命令会创建一个队列缺省名:streams_queue,队列表缺省是:STREAMS_QUEUE_TABLE

队列存储的object类型是anaydata

 

移除队列:

exec dbms_streams_adm.remove_queue(

queue_name => 'streams_queue',

cascade => true,

drop_unused_queue_table => true);. 

 

 

可以用查询dba_queues,dba_queue_tables来检查:

SQL>  select owner,queue_table,name from dba_queues where owner='STRMADMIN';

OWNER               QUEUE_TABLE              NAME

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

STRMADMIN          SOURCES_QUEUE_TABLE        SOURCES_QUEUE

抱歉!评论已关闭.