Oracle 10g高级复制实例(多主体复制)
现在主流的数据库产品都实现了数据库中数据的复制,有的产品还做到了数据库对象的复制(例如视图和索引)。今天主要是与大家分享在Oracle平台下的数据复制功能。
多主体复制,MultiMaster Replication。可以简单理解为多个数据库间相互复制。
1.环境介绍:
主体定义站点:MASTER.CHRIS.COM.CN
主体站点:REPSITE.CHRIS.COM.CN
操作系统: linux As 4.0
数据库版本: ORACLE 10G -10.2.0.0
注:主体定义站点指配置复制工作的站点
2.环境准备:首先创建在系统中建立了两个数据库
SID: Master GLOBAL_NAME:MASTER.CHRIS.COM.CN
SID: REPSITE GLOBAL_NAME:REPSITE.CHRIS.COM.CN
在实施前先要察看一些参数的设置情况
SQL> select * from v$option where parameter ='Advanced replication';
PARAMETER VALUE
----------------------------------- ------------------------------
Advanced replication TRUE
如果该参数为Flase,则需要重新安装Oracle的Advanced Replication组件。
SQL> select * from global_name;
GLOBAL_NAME
----------------------------------
MASTER.CHRIS.COM.CN
CHRIS.COM.CN表示该数据库实例的域名,即Domain Name。被复制的数据库实例必须具有相同的域名(show parameter db_domain)。如果域名不同,则需要使用命令修改数据库实例的域名。(alter database rename global_name to . )
SQL> show parameter job_queue_processes;
NAME TYPE VALUE
------------------------------------ ---------------------- -------------------
job_queue_processes integer 10
job_queue_processes参数的值必须大于0,因为数据复制需要使用Oracle的作业系统。
SQL> show parameter open_links
NAME TYPE VALUE
------------------------------------ ---------------------- -----------
open_links integer 4
数据复制进程需要使用很多links,如果复制系统较多,建议尽量将该参数设置大些。
在开始实施复制之前,还要在复制站点上先创建好必要的数据环境。分别在两个数据库实例上创建好用户和对应的数据表。这里我省略了创建的过程。下面是关于数据表的部分信息。
SQL> select count(*) from SCOTT.DEPT;
COUNT(*)
----------
7
SQL> DESC SCOTT.DEPT
名称 是否为空? 类型
----------------------------------------- -------- ---------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
主键:DEPTNO
--必须为主键或者联合主键。
3.复制实施准备一:在所有复制站点建立复制用户。
---为了方便期间均使用REPADMIN用户,且用户名和密码相同。
SQL>create user repadmin identified by repadmin default tablespace users temporary tablespace temp;
User created.
SQL>execute dbms_defer_sys.register_propagator('repadmin');
PL/SQL procedure successfully completed.
SQL>grant execute any procedure to repadmin;
Grant succeeded.
SQL>execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
PL/SQL procedure successfully completed.
SQL>execute dbms_repcat_admin.grant_admin_any_schema(username => 'repadmin');
PL/SQL procedure successfully completed.
SQL>grant comment any table to repadmin;
Grant succeeded.
SQL>grant lock any table to repadmin;
Grant succeeded.
SQL>grant select any dictionary to repadmin;
Grant succeeded.
4.复制实施准备二:创建数据库连接。
在复制用户创建并授权成功后,分别在数据库实例上创建指向对方实例的数据库连接。
在MASTER.CHRIS.COM.CN实例上:
CREATE DATABASE LINK "REPSITE.CHRIS.COM.CN" CONNECT TO
"REPADMIN"
IDENTIFIED BY "repadmin"
USING 'REPSITE.CHRIS.COM.CN'
在REPSITE.CHRIS.COM.CN实例上:
CREATE DATABASE LINK "MASTER.CHRIS.COM.CN" CONNECT TO
"REPADMIN"
IDENTIFIED BY "repadmin"
USING 'MASTER.CHRIS.COM.CN'
5.复制实施进程:
现在开始真正的数据复制工作。一般在实施复制的时候,数据源已经存在一定量的数据,因此考虑到数据复制实施的简单性和操作性,事先已经在双方站点上部署好了相应的数据表。
主体定义站点:MASTER.CHRIS.COM.CN
主体站点:REPSITE.CHRIS.COM.CN
复制对象:scott.dept
以下在MASTER.CHRIS.COM.CN机器上操作
使用复制管理用户REPADMIN登录主定义站点:
SQL> conn conn repadmin/repadmin
Connected.
SQL> select * from global_name;
GLOBAL_NAME
----------------------------------------
MASTER.CHRIS.COM.CN
创建复制主体组:REP_MYTEST
SQL> execute dbms_repcat.create_master_repgroup('REP_MYTEST');
PL/SQL procedure successfully completed.
察看复制主体组相关信息:
SQL> select gname,master,status from dba_repgroup where gname='REP_MYTEST';
GNAME MASTER STATUS
--------------------------- ---------------------------- ------------------------
REP_MYTEST Y QUIESCED
为主体组添加复制对象:
SQL> execute dbms_repcat.create_master_repobject -
> (sname=>'SCOTT',oname=>'DEPT', type=>'TABLE', -
> use_existing_object=>true,gname=>'REP_MYTEST',copy_rows=>false);
PL/SQL procedure successfully completed.
察看复制主体组中复制对象的相关信息:
SQL> select sname,oname,status,gname from dba_repobject where gname='REP_MYTEST';
SNAME ONAME STATUS GNAME
----------------------------- ------------------------------ ------------- ------------------------------
SCOTT DEPT VALID REP_MYTEST
为复制对象生成复制支持:
SQL> execute dbms_repcat.generate_replication_support('SCOTT','DEPT','TABLE');
PL/SQL procedure successfully completed.
再次察看复制主体组和对应的复制对象的相关信息:
SQL> select gname,master,status from dba_repgroup where gname='REP_MYTEST';
GNAME MASTER STATUS
--------------------------- ---------------------------- ------------------------
REP_MYTEST Y QUIESCED
SQL> select sname,oname,status,gname from dba_repobject where gname='REP_MYTEST';
SNAME ONAME STATUS GNAME
----------------------------- ------------------------------ ------------- ------------------------------
SCOTT DEPT VALID REP_MYTEST
SCOTT DEPT$RP VALID REP_MYTEST
SCOTT DEPT$RP VALID REP_MYTEST
为复制主体组添加数据库主站点:
SQL> execute dbms_repcat.add_master_database -
> (gname=>'REP_MYTEST',master=>'REPSITE.CHRIS.COM.CN', -
> use_existing_objects=>true,copy_rows=>false, -
> propagation_mode => 'synchronous');
PL/SQL procedure successfully completed.
以下在REPSITE.CHRIS.COM.CN机器上操作
察看复制站点信息:
SQL> select gname,dblink,masterdef,master from dba_repsites where gname='REP_MYTEST';
GNAME DBLINK MASTERDEF MASTER
------------ -------------------------------- ------------------ --------------
REP_MYTEST ORCL9I.TAIKANG.COM Y Y
REP_MYTEST REPSITE.CHRIS.COM.CN N Y
以下在REPSITE.CHRIS.COM.CN机器上操作
启动复制进程:
SQL> execute dbms_repcat.resume_master_activity('REP_MYTEST',true);
PL/SQL procedure successfully completed.
再次察看复制主体组相关信息:
SQL> select gname,master,status from dba_repgroup where gname='REP_MYTEST';
GNAME MASTER STATUS
--------------------------- ---------------------------- ------------------------
REP_MYTEST Y NORMAL
注意:复制主体组的状态由QUIESCED变为NORMAL。
至此,这个复制过程实施完毕。可以进行相关的数据操作进行测试。
6. 测试
本文操作参考了eygle的文章《Oracle高级复制的创建配置步骤-Step by Step》原文链接:http://www.eygle.com/archives/2005/06/oraclessoeaeaeo.html