二.设置实体化视图站点。
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的高级复制还提供可更新视图和复杂的只读实体化视图复制,当然并不是我们都要去用高级复杂强大的功能,在具体应用的时候,还要根据系统功能和性能需求,选择适当的复制技术。