通过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;