通过Oracle的流复制实现数据库之间的同步

通过Oracle的流复制实现数据库之间的同步 

    Oracle Stream功能是为提高数据库的高可用性而设计的,在Oracle 9i及之前的版本这个功能被称为Advance Replication。
   
    Oracle Stream利用高级队列技术,通过解析归档日志,将归档日志解析成DDL及DML语句,从而实现数据库之间的同步。
   
    这种技术可以将整个数据库、数据库中的对象复制到另一数据库中,通过使用Stream的技术,对归档日志的挖掘,
   
    可以在对主系统没有任何压力的情况下,实现对数据库对象级甚至整个数据库的同步。

 

一、步骤

 

-以下均为源和目标数据库的sys用户执行的操作:

 

1、将源和目标数据库设置为归档模式

2、启动源和目标全局数据库名,并设置全局数据库名

3、创建源和目标的stream管理员表空间、用户、并授权

4、创建logmnr表空间,并将logminer的数据字典转移到新建的表空间

5、创建测试用户

 

以下为stream管理员在源数据库上的操作:

6、stream管理员创建数据库链接

7、创建Master流队伍

8、创建捕获进程

10、创建传播进程

11、修改propagation休眠时间为0,表示实时传播LCR

 

以下为stream管理员在目标数据库上的操作:

9、实例化复制数据库   应当在目标库上完成

12、创建backup流队列

13、创建应用进程

14、启动应用进程

15、启动捕获进程。

 

二、详细步骤

 

以下以system as sysdba身份登录

 

--查看是否归档模式的SQL语句

select log_mode from v$database;

 

--初始化数据库参数

alter system set global_names=true scope=both;

alter system set undo_retention=3600 scope=both;

alter system set job_queue_processes=4 scope=both;

alter system set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' scope=spfile;

alter system set Open_links=4 scope=spfile;

alter system set Aq_tm_processes =4;

 

--创建流管理用户的表空间,数据文件,用户授权

create tablespace stream_admin datafile 'C:\app\Administrator\oradata\source\stream_admin01.dbf' size 512M;

create user stream_admin identified by stream_admin default tablespace stream_admin;

grant dba to stream_admin;

grant create session to stream_admin;

grant aq_administrator_role to stream_admin;

grant unlimited tablespace to stream_admin;*/

 

--流管理用户的授权

BEGIN

       DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(

       grantee=>'stream_admin',

       grant_privileges=>true);

END;

 

--创建流用户的表空间,数据文件,用户授权

create tablespace stream datafile 'C:\app\Administrator\oradata\source\stream01.dbf' size 1G;

create user stream identified by stream default tablespace stream;

grant resource to stream;

grant create session to stream;

grant unlimited tablespace to stream;*/

 

 

--以下是以流管理用户身份登录源数据库

 

--创建流队列

begin

dbms_streams_adm.set_up_queue(

queue_table => 'stream_admin.stream_source_queue_table',

queue_name => 'stream_admin.stream_source_queue');

end;

 

--创建dblink

create database link target.net connect to stream_admin identified by stream_admin using 'target';

--查看dblink

select sysdate from v$database@target.net;

 


--创建捕获进程

begin

dbms_streams_adm.add_schema_rules(

schema_name => 'stream',

streams_type => 'capture',

streams_name => 'stream_source_capture',

queue_name => 'stream_admin.stream_source_queue',

include_dml => true,

include_ddl => true,

include_tagged_lcr => false,

source_database => 'source.net',

inclusion_rule => true);

end;

 

--创建传播作业

begin

DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES(

schema_name => 'stream',

streams_name => 'stream_source_propagation',

source_queue_name => 'stream_admin.stream_source_queue',

destination_queue_name => 'stream_admin.stream_target_queue@target.net',  ----目标数据上的队列名称

include_dml => true,

include_ddl => true,

include_tagged_lcr => false,

source_database => 'source.net',

inclusion_rule => true);

END;

 

--实例化SCN

CREATE OR REPLACE PROCEDURE INIT_SCN

IS

  v_scn number(30);

BEGIN

  v_scn:=dbms_flashback.get_system_change_number();

  dbms_apply_adm.set_schema_instantiation_scn@target(

                                         source_schema_name =>'stream',

                                         source_database_name =>'source',

                                         instantiation_scn =>v_scn,

                                         recursive=>true );

END INIT_SCN;

 

 

--启动 Capture捕获进程

begin

dbms_capture_adm.start_capture(

capture_name => 'stream_source_capture');

end;

 

 


--以下是以流管理用户身份登录目标数据库

 

--创建dblink

create database link source.net connect to stream_admin identified by stream_admin using 'source';

--查看dblink

select sysdate from v$database@source.net;

 

--创建流队列

begin

dbms_streams_adm.set_up_queue(

queue_table => 'streamadmin.stream_target_queue_table',

queue_name => 'streamadmin.stream_target_queue');

end;

 

--创建应用作业

begin

dbms_streams_adm.add_schema_rules(

schema_name => 'stream',

streams_type => 'apply',

streams_name => 'stream_ target _apply',

queue_name => 'stream_admin.stream_target_queue',

include_dml => true,

include_ddl => true,

include_tagged_lcr => false,

source_database => 'target.net',

inclusion_rule => true);

end;

 

--启动 Apply应用进程

begin

dbms_apply_adm.start_apply(

apply_name => 'stream_ target _apply');

end;

 

 

三、常用SQL

查询用户

select * from dba_users;

select * from user$ where name='STREAMADMIN';

 

删除用户

drop user stream_admin;

select username from dba_users;

 

查询表空间

select * from dba_tablespaces;

删除表空间

drop tablespace stream_admin;

 

查询队列

select * from dba_queues;

查询属于某个用户下的队列

select * from dba_queues where wner='STREAMADMIN';

 

查询应用进程

select * from dba_apply;

察看Appy进程是否运行正常

SELECT apply_name, apply_captured, status FROM dba_apply;

select * from dba_apply_object_dependencies;

 

查询

select * from link$ where name='TARGET.NET';

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13165828/viewspace-604858/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13165828/viewspace-604858/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
复制,顾名思义就是将数据库中的数据拷贝到不同物理地点的数据库中。 在很多生产环境中,经常遇到一些大量得数据,这些数据只用作查询统计功能。例如:历史告警,历史性能指标,历史事件,等等。这种数据的特点是:只读不写,数据量相当大,一旦查询大结果集的数据时,对数据库的IO,内存缓存占用相当大,会严重影响同一个数据库的其他会话的操作,表现为整个数据库反应迟缓,业务功能不可用。采用复制技术后,将这些大型数据复制到另外一个数据库中,对这些大数据的查询统计操作放在另外的一台数据库服务器上进行,即使受影响,也只是影响局部的查询统计功能,其他正常的业务处理不受影响。 但是,使用复制技术的话,意味着一个系统中,至少存在两个数据库(集群的数据库也当成一个数据库),对应的应用程序也需要建立多个数据库连接,能够根据业务需要,访问不同的数据库ORACLE数据库自身提供有复制功能,只需要进行配置即可实现ORACLE提供有三种复制技术: 高级复制(Advanced Replication) 复制(Streams Replication) 备库(Dataguard) 备库的方式,就是数据库数据库的备份方式,主要是解决容灾的,不讨论此话题。 复制主要是利用ORACLE的归档日志,进行增量备份来实现的,不仅可以配置只复制某些表,还可以配置仅复制某些表上的ddl或dml。可以复制到表,用户数据库级别。 高级复制主要是基于触发器的原理来触发数据同步的,因此,高级复制无法实现用户数据库级别的对象复制,只能做些表、索引和存储过程的复制。 如果出于容灾整个数据库的考虑,高级复制相当复杂,而且并不一定能做好,复制的配置相对简单。复制是后来产生的复制技术,是基于日志挖掘技术实现的,对数据库的影响较低。但在稳定性方面较差,实时性没有高级复制强(因为高级复制是基于触发器的)。如果系统意外的话,复制的恢复将会需要较长时,特别是意外时越长,恢复时成倍增长。 下面使用相同的环境,分别对两种复制功能进行配置介绍,并进行性能压力测试比较。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值