摘自:
现在主流的数据库产品都实现了数据库中数据的复制,有的产品还做到了数据库对象的复制(例如视图和索引)。鄙人曾经实施过SQL Server的Replication和IBM DB2的复制中心,在IBM iSeries平台上叫DB2 Propagator,也使用过MIMIX这样的数据高可用性数据保护软件。今天主要是与大家分享在Oracle平台下的数据复制功能。
多主体复制,MultiMaster Replication。可以简单理解为多个数据库间相互复制。
1.环境介绍:
[url=mailto:root@v210]root@v210[/url] # uname -a
SunOS v210 5.9 Generic_117171-07 sun4u sparc SUNW,Sun-Fire-V210
[url=mailto:root@v210]root@v210[/url] # su - orcl9i
$ sqlplus 'as sysdba';
SQL*Plus: Release 9.2.0.6.0 - Production on 星期五 11月 18 18:00:42 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production
SQL> select * from v$version;
BANNER
----------------------------------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
PL/SQL Release 9.2.0.6.0 - Production
CORE 9.2.0.6.0 Production
TNS for Solaris: Version 9.2.0.6.0 - Production
NLSRTL Version 9.2.0.6.0 - Production
2.环境准备:首先创建在系统中建立了两个数据库
SID:ORCL9I GLOBAL_NAME:ORCL9I.TAIKANG.COM
SID:ALPHA9I GLOBAL_NAME:ALPHA9I.TAIKANG.COM
在实施前先要察看一些参数的设置情况
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
----------------------------------
ORCL9I.TAIKANG.COM
TAIKANG.COM表示该数据库实例的域名,即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
数据复制进程需要使用很多links,如果复制系统较多,建议尽量将该参数设置大些。
在开始实施复制之前,还要在复制站点上先创建好必要的数据环境。分别在两个数据库实例上创建好用户和对应的数据表。这里我省略了创建的过程。下面是关于数据表的部分信息。
SQL> select count(*) from fujie.zmdtpf;
COUNT(*)
----------
31657
SQL> desc zmdtpf;
Name Null? Type
----------------------------------------- -------- ----------------------------
CHDRCOY NOT NULL CHAR(1)
BRANCH NOT NULL CHAR(2)
CHDRNUM NOT NULL CHAR(8)
TRANNO NOT NULL NUMBER(5)
REASONCD NOT NULL CHAR(4)
USER_PROFILE NOT NULL CHAR(10)
JOB_NAME NOT NULL CHAR(10)
DATIME NOT NULL DATE
LIFE NOT NULL CHAR(2)
联合主键:chdrcoy,branch,chdrnum,tranno,reasoncd,datime,life
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.
在复制用户创建并授权成功后,分别在数据库实例上创建指向对方实例的数据库连接。
在ORCL9I.TAIKANG.COM实例上:
CREATE DATABASE LINK "ALPHA9I.TAIKANG.COM" CONNECT TO
"REPADMIN"
IDENTIFIED BY "repadmin"
USING 'ALPHA9I.TAIKANG.COM';
在ALPHA9I.TAIKANG.COM实例上:
CREATE DATABASE LINK "ORCL9I.TAIKANG.COM" CONNECT TO
"REPADMIN"
IDENTIFIED BY "repadmin"
USING 'ORCL9I.TAIKANG.COM';
此外再创建一对公共的数据库连接指向对方数据库实例。
CREATE PUBLIC DATABASE LINK "ALPHA9I.TAIKANG.COM" CONNECT TO
"FUJIE"
IDENTIFIED BY "FUJIE"
USING 'ALPHA9I.TAIKANG.COM';
CREATE PUBLIC DATABASE LINK "ORCL9I.TAIKANG.COM" CONNECT TO
"FUJIE"
IDENTIFIED BY "FUJIE"
USING 'ORCL9I.TAIKANG.COM';
下面开始真正的数据复制工作。一般在实施复制的时候,数据源已经存在一定量的数据,因此考虑到数据复制实施的简单性和操作性,事先已经在双方站点上部署好了相应的数据表。
主定义站点:ORCL9I.TAIKANG.COM
主站点:ALPHA9I.TAIKANG.COM
复制对象:FUJIE.ZMDTPF
使用复制管理用户REPADMIN登录主定义站点:
SQL> conn repadmin/repadmin
Connected.
SQL> select * from global_name;
GLOBAL_NAME
----------------------------------------
ORCL9I.TAIKANG.COM
创建复制主体组:
SQL> execute dbms_repcat.create_master_repgroup('CSCGRP');
PL/SQL procedure successfully completed.
察看复制主体组相关信息:
SQL> select gname,master,status from dba_repgroup where gname='CSCGRP';
GNAME MASTER STATUS
--------------------------- ---------------------------- ------------------------
CSCGRP Y QUIESCED
为主体组添加复制对象:
SQL> execute dbms_repcat.create_master_repobject(sname=>'FUJIE',oname=>'ZMDTPF', type=>'TABLE', use_existing_object=>true,gname=>'CSCGRP',copy_rows=>false);
PL/SQL procedure successfully completed.
察看复制主体组中复制对象的相关信息:
SQL> select sname,oname,status,gname from dba_repobject where gname='CSCGRP';
SNAME ONAME STATUS GNAME
----------------------------- ------------------------------ ------------- ------------------------------
FUJIE ZMDTPF VALID CSCGRP
为复制对象生成复制支持:
SQL> execute dbms_repcat.generate_replication_support('FUJIE','ZMDTPF','TABLE');
PL/SQL procedure successfully completed.
再次察看复制主体组和对应的复制对象的相关信息:
SQL> select gname,master,status from dba_repgroup where gname='CSCGRP';
GNAME MASTER STATUS
--------------------------- ---------------------------- ------------------------
CSCGRP Y QUIESCED
SQL> select sname,oname,status,gname from dba_repobject where gname='CSCGRP';
SNAME ONAME STATUS GNAME
----------------------------- ------------------------------ ------------- ------------------------------
FUJIE ZMDTPF VALID CSCGRP
FUJIE ZMDTPF$RP VALID CSCGRP
FUJIE ZMDTPF$RP VALID CSCGRP
为复制主体组添加数据库主站点:
SQL> execute dbms_repcat.add_master_database -
> (gname=>'CSCGRP',master=>'ALPHA9I.TAIKANG.COM', -
> use_existing_objects=>true,copy_rows=>false, -
> propagation_mode => 'synchronous');
PL/SQL procedure successfully completed.
察看复制站点信息:
SQL> select gname,dblink,masterdef,master from dba_repsites where gname='CSCGRP';
GNAME DBLINK MASTERDEF MASTER
------------ -------------------------------- ------------------ --------------
CSCGRP ORCL9I.TAIKANG.COM Y Y
CSCGRP ALPHA9I.TAIKANG.COM N Y
启动复制进程:
SQL> execute dbms_repcat.resume_master_activity('CSCGRP',true);
PL/SQL procedure successfully completed.
再次察看复制主体组相关信息:
SQL> select gname,master,status from dba_repgroup where gname='CSCGRP';
GNAME MASTER STATUS
--------------------------- ---------------------------- ------------------------
CSCGRP Y NORMAL
注意:复制主体组的状态由QUIESCED变为NORMAL。
至此,这个复制过程实施完毕。可以进行相关的数据操作进行测试。
阅读(951) | 评论(0) | 转发(0) |