Chinaunix首页 | 论坛 | 博客
  • 博客访问: 468500
  • 博文数量: 178
  • 博客积分: 2547
  • 博客等级: 少校
  • 技术积分: 1764
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-22 08:27
文章分类

全部博文(178)

文章存档

2014年(2)

2013年(2)

2012年(2)

2010年(19)

2009年(26)

2008年(69)

2007年(20)

2006年(38)

我的朋友

分类: Oracle

2008-11-27 22:05:03

摘自:
 
现在主流的数据库产品都实现了数据库中数据的复制,有的产品还做到了数据库对象的复制(例如视图和索引)。鄙人曾经实施过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。
至此,这个复制过程实施完毕。可以进行相关的数据操作进行测试。
阅读(912) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~