在学习ORACLE的高级复制知识时,自己进行了配置,基于10.2.0.1版本进行的配置
1.高级复制配置方式-主对主的单向配置,基于触发器的单向高级复制配置方法如下:
1.1 准备工作
1)检查主库的job_queue_processes参数值是否大于0(默认应该是大于0的,由于高级复制需要使用job来传输数据)
SQL> show parameter job
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 10
如果为0,则执行如下命令更改该参数:
alter system set job_queue_processes=10 scope=both;
2)检查主库的global_names参数值是否为true:
SQL> show parameter global_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean TRUE
如是不为true,则执行如下命令进行修改:
alter system set global_names=true;
3)检查主数据库的global_name:
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
DSOURCE.REGRESS.RDBMS.DEV.US.ORACLE.COM
如果没有类似.com的域名,则需要执行如下命令更改,因为高级复制中需要全局数据库名中带域名来创建db link:
alter database rename global_name to DSOURCE.REGRESS.RDBMS.DEV.US.ORACLE.COM;
4)检查目标数据库的global_name:
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
DTARGET.REGRESS.RDBMS.DEV.US.ORACLE.COM
如果没有类似.com的域名,则需要执行如下命令更改,因为高级复制中需要全局数据库名中带域名来创建db link:
alter database rename global_name to DTARGET.REGRESS.RDBMS.DEV.US.ORACLE.COM;
5)两个数据库都创建一个用于高级复制管理的用户,用于管理高级复制,用户名为apadmin,并授予dba角色(其实只授予connect,resource这两个就可以,这里为了方便):
create user apadmin identified by apadmin;
grant dba to apadmin;
6)授予apadmin用户其它相关权限:
exec dbms_repcat_admin.grant_admin_any_schema('APADMIN');
exec dbms_defer_sys.register_propagator('APADMIN');
如下系统权限如果授予DBA角色后,该用户已经具有,不必不授予:
grant comment any table to apadmin;
grant lock any table to apadmin;
grant execute any procedure to apadmin;
7)两个数据库都再创建一个业务测试用户,用户名为ap,用于数据复制
create user ap identified by ap;
grant dba to ap;
8)两个数据库都使用业务测试用户ap登录,创建一个测试表t,带有主键:
conn ap/ap
create table t(x int primary key);
9)在主库上使用apadmin管理复制用户连接数据库,创建到目标数据库的dblink:
conn apadmin/apadmin
create database link DTARGET.REGRESS.RDBMS.DEV.US.ORACLE.COM connect to apadmin identified by apadmin using 'DTARGET';
测试db link是否创建成功,已经可以显示目标数据库名:
SQL> select name from v$database@DTARGET.REGRESS.RDBMS.DEV.US.ORACLE.COM;
NAME
---------
DTARGET
SQL> select name from v$database;
NAME
---------
DSOURCE
10)在目标库上使用apadmin管理复制用户连接数据库,创建到主数据库的dblink:
conn apadmin/apadmin
create database link DSOURCE.REGRESS.RDBMS.DEV.US.ORACLE.COM connect to apadmin identified by apadmin using 'DSOURCE';
测试db link是否创建成功,已经可以显示主数据库名:
SQL> select name from v$database@DSOURCE.REGRESS.RDBMS.DEV.US.ORACLE.COM;
NAME
---------
DSOURCE
SQL> select name from v$database;
NAME
---------
DTARGET
1.2 开始配置,如下操作都是在主库上操作,并且使用apadmin复制管理用户
1)创建复制组,名称为rep,复制组就是把相关的复制节点拉到该组中,整个这些节点构成了一个复制关系:
conn apadmin/apadmin
exec dbms_repcat.create_master_repgroup('repp');
查看复制组的相关信息,查询dba_repgroup视图:
select gname,master,status from dba_repgroup where gname='REPP';
2)向复制组中加入复制对象,即要对哪些对象进行复制等信息:
exec dbms_repcat.create_master_repobject(sname=>'ap',oname=>'t',type=>'table',use_existing_object=>true,gname=>'repp',copy_rows=>false);
查看复制对象的相关信息:
select sname,oname,status,gname from dba_repobject where gname='REPP';
3)对复制对象启动复制支持,它会产生所需的基表、存储过程和触发器:
exec dbms_repcat.generate_replication_support('ap','t','table');
再次查看复制对象的相关信息,会发现多了一些对象(一般会多两个存储过程):
select sname,oname,status,gname from dba_repobject where gname='REPP';
4)添加远程的目标复制节点,把远程目标节点也拉到rep复制组中,此时目标端也会产生相关信息:
exec dbms_repcat.add_master_database(gname=>'repp',master=>'DTARGET.REGRESS.RDBMS.DEV.US.ORACLE.COM',use_existing_objects=>true,copy_rows=>false,propagation_mode=>'synchronous');
说明:master这个参数可以理解为刚才创建的对远程数据库的数据库链路,也可以理解为就是远程数据库的global name
propagation_mode(传输模式)设置的同步synchronous,也可以设置为异步
查看添加的远程目标节点信息:
col masterdef format a10
col master format a10
col dblink format a25
col gname format a12
select gname,dblink,masterdef,master from sys.dba_repsites where gname='REPP';
5)启动复制,启动完毕后,高级复制开始工作:
exec dbms_repcat.resume_master_activity('repp',true);
1.3 进行测试,如下操作使用ap业务用户
1)在源端对t表插入数据:
conn ap/ap
insert into t values(1);
commit;
2)去目标端查看t表,如果有数据表明配置成功:
conn ap/ap
select * from t;
注:还可以插入多个数据进行测试,注意DDL语句是不能复制的,例如truncate table t后,目标端是还有数据。
1.4 附加的一些知识
如果创建时失败,可以用如下方法进行清理:
1)清理用户:
drop user apadmin cascade;
startup restrict
drop user apadmin cascade;
2)删除复制对象:
exec dbms_repcat.drop_master_repobject(sname=>'ap',oname=>'t',type=>'table');
3)删除复制组:
exec dbms_repcat.drop_master_repgroup(gname=>'repp',all_sites=>true);
4)检查错误的管理请求:
select * from dba_repcatlog where status='ERROR';