分享
 
 
 

Oracle 数据库集中复制方法逐步精细

王朝oracle·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

日益增长的分布式应用需求要求实现更好分布式的软件环境,不断推动着分布式技术的进步。Oracle数据复制是实现分布式数据环境的一种技术,通过在不同的物理站点拷贝数据来建立分布式数据环境。它与分布式数据库不同,在分布式数据库中,虽然每个数据对象也对所有的站点可用,但是特定的数据对象只存在于一个特定的站点中。而数据复制实现所有的站点都有相同数据对象的可用拷贝。

在一个典型的分布式商业应用中经常需要把个地区的数据备份到总部的数据库中,一方面可以作为一种备份方式,另一方面也方便总部应用中的综合统计。这是Oracle数据复制中的简单应用,本文将以这样一个例子,讲述如何实现Oracle数据复制。

实际情况是,A公司总部在北京,有三个营业部分别位于上海(Orace.ShangeHai.com)、杭州(Oracle.HangZhou.com)和武汉(Oracle.Wuhan.com)。三个营业部的软件系统相同,数据库结构也相同。现在需要把三个营业部的数据全部备份到总部的数据库中。

预备工作

在进行复制之前需要预备的东西很多,当然最基础就是网络必须畅通,之后需要收集一些复制环境的基本信息:

1. 需要复制的数据库站点的数量。

2. 每个站点的Oracle版本号。

3. 每个需要复制的数据库的大小。

4. 每个数据库所使用的字符集。

5. 每个需要复制的数据所用的方案名。

收集完环境信息,可以开始建立总部的集中数据库,集中数据库要求版本高于所有主战点的版本,最好所有的数据库都是用相同的字符集。建好库后为每个主站点的备份数据分别建一个表空间,表空间大于需要复制的数据量,至于预留以后的发展空间视实际情况而定。

为每个主站点的对应复制数据建立方案,假如各个主站点所使用的方案名不同,在集中数据库站点分别建立名称相同的对应方案。否则为各主站点的复制数据分别建立相应的方案名。实际情况是后者,各营业部的数据库都是用Oracle的方案名,这里我们建立三个对应方案:SHORACL、HZORACL 和WHORACL。所有数据库的版本都是9i。

基本概念

复制之前先解释一下复制中的几个概念:

1.主站点(Mater Site):在复制过程中提供数据源的站点。如上图中的上海数据库站点。

2.实体化视图站点(Materialized View Site):实体化视图复制中的目标站点。

3.多主体站点复制(Multimaster Replication):复制环境中的站点都是主站点,对复制的数据库对象有相同的治理权限。

4.实体化视图复制(Materialized View Replication):一个主体站点提供源复制对象,一个实体化视图站点拷贝主站点数据。

5.实体化视图(Materialized View):在实体化视图站点为每个复制表或者视图建立一个对应的表保存相应的数据,该表只能通过Oracle的复制机制进行增删改数据的操作。

6. 快速刷新、完全刷新和强制刷新:复制过程中的三种刷新方式。快速刷新只复制源数据对象的改变部分;完全刷新每次都拷贝一遍源数据对象;强制刷新是数据库的一个折衷方案,假如快速刷新失败则使用完全刷新。

7. 主体组(Master Group):主体站点中被复制的源数据对象的集合。

8. 实体化视图组(Materialized View Site):实体化视图站点中复制对象的集合。

9. 实体化视图日志(Materialized View Log):实体化视图复制中使用快速刷新时记录主体源数据对象操作日志的表。

进行复制

配置好本地服务名分别为:上海站点:SH,杭州站点:HZ,武汉站点:WH,北京站点:BJ,进入没有登录的sqlplus,让我们开始复制。

一.设置主站点:

这里以上海主站点设置为例。

1.连接主站点,创建复制治理员并授予相应的权限,复制治理员是治理整个复制环境并创建复制对象的用户。只有数据治理员可以建立主体组和实体化视图组。

connect system/passwd@SH

create user repadmin identified by repadmin;

begin

dbms_repcat_admin.grant_admin_any_schema(

username=>’repadmin’);

end;

/

grant comment any table to REPADMIN;

grant lock any table to REPADMIN;

后面的两个grant语句使复制治理员可以为任何表建立实体化视图日志。假如想改用户可以使用视图治理器,还需要下面的命令:

grant select any dictionary to REPADMIN;

2.注册传播方,传播方会将主体站点的延迟事务队列推入其他主体站点或者实体化视图站点。

begin

dbms_defer_sys.register_purpagator(username=>’repadmin’);

end;

3.调度清除作业,该作业会定时清除延迟事务队列并用传播方将延迟事务推入其他主体站点或者实体化视图站点。先更换用户:

disconnect;

connect repadmin/repadmin@SH;

begin

dbms_defer_sys.schedule_purge(

next_date=>sysdate,interval=>’sysdate + 1’,delay_seconds=>0);

end;

next_date:下一次执行日期,sysdate表示立即。

interval:间隔时段,sysdate + 1表示间隔一天,sysdate+ 1/24表示间隔一小时

delay_seconds:当延迟队列没有延迟事件时停止被次清除操作的延迟时间。

4.为实体化视图站点建立复制代理。创建复制代理用户并授予视图接受方权限。复制代理是复制接收方连接主体站点的用户

disconnect;

connect system/passwd@SH;

create user proxy_bjoracle identified by proxy_bjoracle;

begin

dbms_repcat_admin.register_user_repgroup(

user_name=>’proxy_bjoracle,

privilege_type => ’proxy_snapadmin’,list_of_gnames => NULL);

end;

/

grant select_catalog_role to proxy_bjoracle;

5. 创建主体组:

disconnect;

connect repadmin/repadmin@SH;

begin

dbms_repcat.create_master_repgroup(gname=>’sh_rep’);

end;

/

6. 向主体组中添加复制对象:

a) 添加表:

begin

dbms_repcat.create_master_repobject(

gname=>’sh_rep’,

type=>’TABLE’,

oname=>’ CREDIT_CARD’

sname=>’SHORACL’

use_existing_object=>TRUE,

copy_rows=>TRUE);

end;

b) 添加索引:

begin

dbms_repcat.create_master_repobject(

gname=>’sh_rep’,

type=>’INDEX’,

oname=>’ INDEX_CREDIT_CARD’

sname=>’SHORACL’

use_existing_object=>TRUE,

copy_rows=>FALSE);

end;

/

7. 假如添加的表没有主键需要设置可以代替主键的列或者列的集合:

begin

dbms_repcat.set_columns(

sname => ’SHORACL’,

oname => ’ CREDIT_CARD ’,

column_list => ’ CREDIT_CARD_ID’);

end;

/

8. 在主体组中的数据对象可以被复制之前,必须为他们生成复制支持。该方法为复制创建必要的触发器、包或者存储过程:

begin

dbms_repcat.generate_replication_support(

sname=>’SHORACL’,

oname=>’ CREDIT_CARD’,

type=>’TABLE’,

min_communication=>TRUE);

end;

/

9. 为快速刷新创建实体化视图日志:

create materialized view log on SHORACL. CREDIT_CARD;

假如是没有主键的表示用一下语句:

create materialized view log on SHORACL. CREDIT_CARD with

rowid excluding new values;

10.启动复制:

begin

dbms_repcat.resume_master_activity(

name=>’sh_rep’);

end;

/

二.设置实体化视图站点:

1.创建复制治理员并授予相应的权限:

disconnect;

connect system/passwd@BJ;

create user mvadmin identified by

mvadmin;

begin

dbms_repcat_admin.

grant_admin_any_schema(username=> ’mvadmin’);

end;

/

grant comment any table to mvadmin;

grant lock any table to mvadmin;

grant select any dictionary to mvadmin;

2.注册传播方:

begin

dbms_defer_sys.register_propagator(

username => ’mvadmin’);

end;

/

3.公共数据库连接。需要每个复制需要创建三个数据库连接。公共数据库连接指定数据库的全局名称:

create public database link ORACLSH using ’oracle.shanghai.

com’;

Using子句后跟的是全局数据库名或者是连接字符串。

create public database link ORACLSH using ’(description=

(address=(protocol=tcp)(host=127.0.0.1)(port=1521))

(connect_data=(service_name=oracl)))’

4.建立清除延迟事务队列调度作业:

disconnect;

connect mvadmin/mvadmin@BJ;

begin

dbms_defer_sys.schedule_purge(

next_date => sysdate,

interval => ’/*1:hr*/ sysdate + 1’,

delay_seconds => 0,

rollback_segment => ’’);

end;

5.建立复制治理员mvadmin的数据库连接:

create database link ORACLSH connect to proxy_bjoracle

identified by proxy_bjoralce

Connect to ... Identified by ...子句指明用什么用户连接远程数据库

6.建立复制调度数据库连接作业:

begin

dbms_defer_sys.schedule_push(

destination => ’ora92zjk’,interval => ’/*1:hr*/ sysdate + 1’,

next_date => sysdate,stop_on_error => false,

delay_seconds => 0,parallelism => 0);

end;

/

7.授予SHORACL用户(对应SHORACL方案)相应的权限建立实体化视图:

disconnect;

connect system/passwd@BJ;

grant alter session to crm;

grant create cluster to crm;

grant create database link to crm;

grant create sequence to crm;

grant create session to crm;

grant create synonym to crm;

grant create table to crm;

grant create view to crm;

grant create procedure to crm;

grant create trigger to crm;

grant unlimited tablespace to crm;

grant create type to crm;

grant create any snapshot to crm;

grant alter any snapshot to crm;

8.建立复制方案的数据库连接:

disconnect;

connect SHORACL/SHORACL@BJ;

create database link ORACLSH connect to ORACL identified

by ORACL;

复制方案的数据库连接和复制治理员的数据库连接要和system用户间里的对应公共数据库连接使用相同的名字,在调度连接时将使用公共数据库连接中指定的数据库全局名或者连接字符串。

9.建立实体化视图:

disconnect;

connect mvadmin/mvadmin@BJ;

create materialized view SHORACL.CREDIT_CARD refresh fast

wit h pr imar y key as sele ct * from ORA CL.

CREDIT_CARD@ORACLSH;

@后面是数据库连接名。假如该表没有主键则使用rowid来刷新。

create materialized view SHORACL. CREDIT_CARD refresh

fast with rowid as select * from ORACL. CREDIT_CARD@ORACLSH;

10.为多个视图建立刷新组:

begin

dbms_refresh.make (

name => ’mvadmin.sh_refresh’,list => ’’,

next_date => sysdate,interval => ’sysdate + 1’,

implicit_destroy => false,rollback_seg => ’’,

push_deferred_rpc => true,refresh_after_errors => false);

end;

11.向刷新组中添加复制对象:

begin

dbms_refresh.add (name => ’mvadmin.sh_refresh’,

list => ’SHORACL.CREDIT_CARD ’,lax => true);

end;

/

三.检查复制进程:

1.查看sys.dba_jobs视图是否生成了足够的作业。

经过以上的步骤应该有三个作业分别是清除作业、调度作业和刷新作业,查看视图的what字段是否有下面的内容:

a) declare rc binary_integer; begin rc := sys.dbms_defer_sys.

purge( delay_seconds=>0); end;

b) declare rc binary_integer; begin rc := sys.dbms_defer_sys.

push(destination=>’ORACLSH’, stop_on_error=>FALSE,

delay_seconds=>0, parallelism=>0); end;

c) dbms_refresh.refresh(’"MVADMIN"."SH_REFRESH"’);

假如排除其它系统作业本例中杭州和武汉的数据库复制建立之后将会有7个作业(假如为每个复制分别建立刷新组的话),清除作业始终只有一个。每个复制对应一个调度作业,每个刷新组对应一个刷新作业。

2.查看job_queue_processes参数,确保该参数不为零(数据库的默认值是零),假如该参数为零,除非每次手工执行刷新,否则系统不会自动刷新复制数据。

3.确保复制执行之后,观察sys.dba_jobs视图的failures字段。假如复制在刷新过程中除错,Oracle会自动在1分钟之后再次尝试刷新,失败之后再在2分钟、4分钟、8分钟..之后尝试刷新,直到失败次数达到16次或者间隔时间超过作业设置的间隔时间,该作业将被标记为中断,Oracle不再执行该作业。要重新执行改作业使用dbms_job包的run过程:

begin

dbms_job.run(job_no);

end;

/

job_no 是sys.dba_jobs 的Job字段的值,作业号。在重新执行因出错而中断的作业前,需要手工找到出错点,并更正。

总结

本文只是使用了Oracle高级复制中最简单的功能,Oracle的高级复制还提供可更新视图和复杂的只读实体化视图复制,当然并不是我们都要去用高级复杂强大的功能,在具体应用的时候,还要根据系统功能和性能需求,选择适当的复制技术。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有