Oracle主从同步、双向同步的配置
(把主数据库obpm 和从数据库orcl 用实际的数据库名给替换掉)
(配置主从同步后,再配置双向同步,可能会有表数据重叠,建议在配置双向同完成后,再导入表数据!)
备注:主、从数据库都用淡蓝色标记了,方便查找替换。
1.环境介绍
主数据库SID : obpm
操作系统 : win 2003
IP地址 : 192.168.0.1
Global_name :
oracle version: 10.2.0.1
从数据库SID: orcl
操作系统 : win 2003
IP地址 : 192.168.0.2
Global_name :
oracle version: 10.2.0.1
2.在主/从数据库设置初始化参数(在主从数据库都执行以下操作)
(以as sysdba身份,可在sqlplus中执行)
1) 以dba身份登录
2) 设置参数
1 2 3 4 |
alter system set aq_tm_processes=2 scope=both; ---启用对队列消息的时间监视 alter system set global_names= true scope=both; ---设置全局名称为true alter system set undo_retention=3600 scope=both; --设置回滚段时间,默认是900 alter system set streams_pool_size=25M scope=spfile; --sga设置为自动调整情况下不需设置该参数 |
3)重启动两个数据库,重启方式:
1 2 3 4 |
1.shutdown immediate 2.startup 3.$lsnrctl start(一般都会提示监听已经启动) "color: #ff0000" >(windows服务中也可手动启动监听)
|
3.设置主数据库(obpm )为归档mode (以as sysdba身份,可在sqlplus中执行)
1) --查是否归档,如是归档,请忽略第3点
2) 归档设置
1 2 3 4 5 6 |
shutdown immediate; startup mount; alter database archivelog; alter system set LOG_ARCHIVE_DEST_1='LOCATION=C:\Ora\arc\'; ---设置归档目录 (执行此句后,在Windows系统文件夹中看看arc文件夹有没有创建成功,如果没有,则手动创建,在执行此语句) alter database open ; alter system switch logfile; --相应目录检查是否生成arc文件 (如果提示数据库没开启,则先执行alter database open;) |
4.主/从数据新建stream管理用户(在主从数据库都执行以下操作)
1 2 3 4 5 |
sqlplus / as sysdba; create tablespace tbs_stream datafile 'C:\Ora\tbs_stream01.dbf' size 2000m autoextend on maxsize unlimited segment space management auto; ---创建主环境的Stream专用表空间 execute dbms_logmnr_d.set_tablespace( 'tbs_stream' ); --将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间 create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp ; --创建用户 grant dba to strmadmin; --直接给dba权限. |
1 |
"color: #ff0000" >( Drop 旧的表空间方法: drop tablespace tbs_stream including contents;)
|
5.主数据库网络环境设置 (就是在主数据库中增加一个从数据库的连接服务)
1)主数据库中添加从数据库的配置。(通过oracle图形工具net configuration manager配置,服务名为从数据库名orcl,并测试与从数据库是否连通)
2)新建连接orcl的dblink
1 2 3 4 5 6 7 8 9 |
create public database link orcl connect to strmadmin IDENTIFIED BY strmadmin using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521)) ) (CONNECT_DATA = (SID= orcl) ) )' ; |
测试dblink:select sysdate from dual@orcl; --测试dblink是否有效
6.从数据库网络环境设置 (就是在从数据库中增加一个主数据库的连接服务)
1)从数据库中添加主数据库的配置。(通过oracle图形工具net configuration manager配置,服务名为主数据库名obpm,并测试与从数据库是否连通)
2)新建连接obpm的dblink
1 2 3 4 5 6 7 8 9 |
create public database link obpm connect to strmadmin IDENTIFIED BY strmadmin using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SID = obpm) ) )' ; |
测试dblink:select sysdate from dual@obpm; --测试dblink是否有效
7.主数据库流队列创建 (可在plsql中的SQL中执行,登录名应为strmadmin)
1 2 3 4 5 |
connect strmadmin/strmadmin --以strmadmin身份,登录主数据库。 begin dbms_streams_adm.set_up_queue(queue_table => 'obpm_queue_table' ,queue_name => 'obpm_queue' ); end ; / |
8.从数据库流队列创建
1 2 3 4 5 |
connect strmadmin/strmadmin --以strmadmin身份,登录从数据库。 begin dbms_streams_adm.set_up_queue(queue_table => 'orcl_queue_table' ,queue_name => 'orcl_queue' ); end ; / |
9.主数据库创建捕获进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
connect strmadmin/strmadmin begin dbms_streams_adm.add_schema_rules( schema_name => 'strmadmin' , streams_type => 'capture' , streams_name => 'capture_obpm' , queue_name => 'strmadmin.obpm_queue' , include_dml => true , include_ddl => true , include_tagged_lcr => false , source_database => null , inclusion_rule => true ); end ; / |
10.从数据库实例化strmadmin用户 (win在CMD命令界面中执行)(这两个路径须一致)
1 |
exp strmadmin/strmadmin@obpm file= 'C:\Ora\crm.dmp' object_consistent=y rows =y |
在从数据库新建strmadmin
1 |
imp strmadmin/strmadmin@orcl file= 'C:\Ora\crm.dmp' ignore =y commit =y streams_instantiation=y full =y |
11.主数据库创建传播进程
1 2 3 4 5 6 7 8 9 10 11 12 13 |
connect strmadmin/strmadmin --以strmadmin身份,登录主数据库。 begin dbms_streams_adm.add_schema_propagation_rules( schema_name => 'strmadmin' , streams_name => 'obpm_to_orcl' , source_queue_name => 'strmadmin.obpm_queue' , destination_queue_name => 'strmadmin.orcl_queue@orcl' , include_dml => true , include_ddl => true , include_tagged_lcr => false , source_database => 'obpm' , inclusion_rule => true ); end ;/ |
注意:此段语句执行可能会报错,如果报错,不用管,继续执行后面的。
修改propagation休眠时间为0,表示实时传播LCR,latency以秒为单位
1 2 3 4 5 6 |
begin dbms_aqadm.alter_propagation_schedule( queue_name => 'obpm_queue' , destination => 'orcl' , latency => 0); end ;/ |
12.从数据创建应用进程
1 2 3 4 5 6 7 8 9 10 11 12 13 |
connect strmadmin/strmadmin begin dbms_streams_adm.add_schema_rules( schema_name => 'strmadmin' , streams_type => 'apply' , streams_name => 'apply_orcl' , queue_name => 'strmadmin.orcl_queue' , include_dml => true , include_ddl => true , include_tagged_lcr => false , source_database => 'obpm' , inclusion_rule => true ); end ;/ |
13.启动Stream
1)从数据库启动应用进程
1 2 3 4 5 |
connect strmadmin/strmadmin begin dbms_apply_adm.start_apply( apply_name => 'apply_orcl' ); end ;/ |
2)主数据库启动捕获进程
1 2 3 4 5 |
connect strmadmin/strmadmin begin dbms_capture_adm.start_capture( capture_name => 'capture_obpm' ); end ;/ |
14.现在就可以进行测试了,在crm用户中作何一个测试表新增数据,删除数据,增加表,修改表结构,进行同步测试
备注:以上就是主从同步的所有配置,接下来配置双向同步。
(双向同步前请测试,主从单向同步是否成功!若成功,则下面进行双向同步,若不成功,则拉到下面的“问题检查解决方法处排查问题,主从同步成功后在进行双向同步!!!”)
双向同步配置:
1.设置从数据库(orcl )为归档mode (以as sysdba身份,可在sqlplus中执行)
1) 查是否归档,如是归档,请忽略第3点
2) 归档设置
1 2 3 4 5 6 |
shutdown immediate; startup mount; alter database archivelog; alter system set LOG_ARCHIVE_DEST_1='LOCATION=C:\Ora\arc\'; ---设置归档目录 (执行此句后,在Windows系统文件夹中看看arc文件夹有没有创建成功,如果没有,则手动创建,在执行此语句) alter database open ; alter system switch logfile; --相应目录检查是否生成arc文件 (如果提示数据库没开启,则先执行alter database open;) |
2.从数据库(orcl )创建捕获进程
1 2 3 4 5 6 7 8 9 10 11 12 13 |
connect strmadmin/strmadmin begin dbms_streams_adm.add_schema_rules( schema_name => 'strmadmin' , streams_type => 'capture' , streams_name => 'capture_orcl' , queue_name => 'strmadmin.orcl_queue' , include_dml => true , include_ddl => true , include_tagged_lcr => false , source_database => null , inclusion_rule => true ); end ;/ |
3.主数据库(obpm)实例化strmadmin用户 (win在CMD命令界面中执行)(这两个路径须一致)
1 |
exp strmadmin/strmadmin@orcl file= 'C:\Ora\crm.dmp' object_consistent=y rows =y |
在主数据库(obpm)新建strmadmin
1 |
imp strmadmin/strmadmin@obpm file= 'C:\Ora\crm.dmp' ignore =y commit =y streams_instantiation=y full =y |
4.从数据库(orcl)创建传播进程
1 2 3 4 5 6 7 8 9 10 11 12 13 |
connect strmadmin/strmadmin --以strmadmin身份,登录从数据库。 begin dbms_streams_adm.add_schema_propagation_rules( schema_name => 'strmadmin' , streams_name => 'orcl_to_obpm' , source_queue_name => 'strmadmin.orcl_queue' , destination_queue_name => 'strmadmin.obpm_queue@obpm' , include_dml => true , include_ddl => true , include_tagged_lcr => false , source_database => 'orcl' , inclusion_rule => true ); end ;/ |
修改propagation休眠时间为0,表示实时传播LCR,latency以秒为单位
1 2 3 4 5 6 7 |
begin dbms_aqadm.alter_propagation_schedule( queue_name => 'orcl_queue' , destination => 'obpm' , destination_queue => 'obpm_queue' , latency => 5); end ;/ |
5.主数据(obpm)创建应用进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
connect strmadmin/strmadmin begin dbms_streams_adm.add_schema_rules( schema_name => 'strmadmin' , streams_type => 'apply' , streams_name => 'apply_obpm' , queue_name => 'strmadmin.obpm_queue' , include_dml => true , include_ddl => true , include_tagged_lcr => false , source_database => 'orcl' , inclusion_rule => true ); end ; / |
6.启动Stream
1)主数据库(obpm)启动应用进程
1 2 3 4 5 6 |
connect strmadmin/strmadmin begin dbms_apply_adm.start_apply( apply_name => 'apply_obpm' ); end ; / |
2)从数据库(orcl)启动捕获进程
1 2 3 4 5 6 |
connect strmadmin/strmadmin begin dbms_capture_adm.start_capture( capture_name => 'capture_orcl' ); end ; / |
以上就是双向同步的配置,双向同步完成后,测试是否成功,若不成功,则用下面的“‘主从同步’问题检查解决方法把主从数据库名称调换检查”
‘主从同步’问题检查解决方法:
15.停止stream
1)主数据库停止Capture进程
1 2 3 4 5 6 |
connect strmadmin/strmadmin begin dbms_capture_adm.stop_capture( capture_name => 'capture_obpm' ); end ; / |
2)从数据库停止Apply进程
1 2 3 4 5 6 |
connect strmadmin/strmadmin begin dbms_apply_adm.stop_apply( apply_name => 'apply_orcl' ); end ; / |
16.清除所有配置信息
1)按上述方法停止capture,applya进程
2)分别在主从数据库执行以下语句
1 2 |
connect strmadmin/strmadmin exec DBMS_STREAMS_ADM.remove_streams_configuration(); |
17.如何知道捕捉(Capture)进程是否运行正常?
以strmadmin身份,登录主数据库,执行如下语句:
1 |
SELECT CAPTURE_NAME,QUEUE_NAME,RULE_SET_NAME,NEGATIVE_RULE_SET_NAME,STATUS FROM DBA_CAPTURE; |
如果STATUS状态是ENABLED,表示Capture进程运行正常;
如果STATUS状态是DISABLED,表示Capture进程处于停止状态,只需重新启动即可;
如果STATUS状态是ABORTED,表示Capture进程非正常停止,查询相应的ERROR_NUMBER、ERROR_MESSAGE列可以得到详细的信息;同时,Oracle会在跟踪文件中记录该信息。
18. 如何知道Captured LCR是否有传播?
以strmadmin身份,登录主数据库,执行如下语句:
1 |
SELECT CAPTURE_NAME, QUEUE_NAME, STATUS, CAPTURED_SCN, APPLIED_SCN FROM DBA_CAPTURE; |
如果APPLIED_SCN小于CAPTURED_SCN,则表示在主数据库一端,要么LCR没有被dequeue,要么Propagation进程尚未传播到从数据库一端。
如果出现此情况,主库进程重启下,看看 APPLIED_SCN和CAPTURED_SCN是否相等,若相等,再重启下从库进程即可。
19.如何知道Appy进程是否运行正常?
以strmadmin身份,登录从数据库,执行如下语句:
1 |
SELECT apply_name, apply_captured, status FROM dba_apply; |
如果STATUS状态是ENABLED,表示Apply进程运行正常;
如果STATUS状态是DISABLED,表示Apply进程处于停止状态,只需重新启动即可;
如果STATUS状态是ABORTED,表示Apply进程非正常停止,查询相应的ERROR_NUMBER、ERROR_MESSAGE列可以得到详细的信息;
同时,可以查询DBA_APPLY_ERROR视图,了解详细的Apply错误信息。
其它错误请跟踪alter.log
注意:
第一步:如果在重启操作系统,或者数据库后,出现主从数据库无法同步的情况时,请用17,18,,19步的方法查看;
第二步:在19步查询出现“ABORTED”时,请用SELECT apply_name, apply_captured, ERROR_NUMBER, ERROR_MESSAGE, status FROM dba_apply进行查询;
错误原因:
1 |
select error_message,error_creation_time from dba_apply_error order by error_creation_time desc ; |
1 |
select * from dba_apply_error order by error_creation_time desc ; |
会出现:
(用户没有实例化)
这时候需要重新在从数据库这边系统的cmd中执行实例化用户即可:
1 |
exp strmadmin/strmadmin@obpm file= 'C:\Ora\crm.dmp' object_consistent=y rows =y |
第三步:
从数据库停止Apply进程
1 2 3 4 5 6 |
connect strmadmin/strmadmin begin dbms_apply_adm.stop_apply( apply_name => 'apply_orcl' ); end ; / |
从数据库启动应用进程
1 2 3 4 5 6 |
connect strmadmin/strmadmin begin dbms_apply_adm.start_apply( apply_name => 'apply_orcl' ); end ; / |
这样就解决了出现的问题。出现问题的原因是在第10步的实例化用户没成功(查看windows文件夹下有没有创建“crm.dmp”文件,如果没有创建,则说明实例化用户不成功,重启后则会出现此错误)
以上就是Oracle主从同步和双向同步的配置,和常见问题的解决方法,一般来说只要按照上面步骤一步一步走,应该没有问题。
注意的是sql语句后面粘贴复制经常会出现空格,有空格会报错,这点经常会不小心遇到。遇到问题不用担心,按照上面的方法进行排查即可,如果真的配错了,执行清除命令重新配置即可。
转自:
http://www.cnblogs.com/hooly/p/8178570.html