通过Oracle Stream实现数据库之间的同步

史阳晖
2023-12-01
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 owner='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';


512M;
 类似资料: