`
guanchenglong0220
  • 浏览: 17304 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle高级复制数据调研报告

阅读更多





   Oracle同步复制数据调研报告










                关成龙
                时间:2010-2-9


使用场景描述:
已有一台数据库服务器在运行,为了不影响现有数据库的使用,需要新启一台数据库服务器,把原有数据库的数据以及后期可能产生的新数据做完整的数据同步。

调研结果:
Oracle与Oracle数据库之间的整体数据库复制可以实现。主要分为两大类:一类为Asynchronous Replication(异步复制);另一类为Synchronous Replication(同步复制)。我个人认为使用异步复制中的“物化视图复制站点”较好,并且成功的实现了物化视图复制站点的操作。
三、 整体数据库复制概述
1. Replication 使用分布式数据库技术在多个站点之间共享数据。
2. Replicated Database 和Distributed Database 并不一样,在分布式数据库系统中数据在
多个站点同时有效,但是一个表只会存在于一个站点中,而对于Replication 来说相同
的数据将同时存在于多个站点中。
3. 使用 replication 的原因:
1) Availability:也就是提供了优秀的failover 保护
2) Performance:由于有多个server,所以可以将用户业务分布在不同的server 上
3) Disconnected computing:实体化视图允许用户在和master 断开后使用数据库
的子集,在重新连接上master 之后再进行两者的同步。
4) Network load reduction:由于有多个server,所以可以减少master 的网络请

5) Mass deployment:通过变量产生自定义的实体化视图以满足多种需求
4. 在不同的 Oracle 发行版本之间以及不同操作系统的Oracle 之间都可以使用Advanced
Replication。
5. Replication 中的几个概念:
1) replication object:复制对象,指需要作复制的对象(object),包括表,索引,
存储过程等等。复制对象的更新遵循事务一致性规则(transactionally consistent
manner)。
2) replication groups:复制组,是复制对象(replication object)的集合称为group,
oracle 以replication group 的形式来管理复制。一个组可以包含多个模式的object,
一个模式也可以有多个组中的object,但是每个replication object 都只能属于一个
replication group。
3) replication sites:复制站点,包含两种类型,主体站点(master sites)和实
体化视图站点(materialized view sites)。一个site 可以担任一个replication
group 中的mater site 同时又担任另外一个replication group 中的materialized
view site,注意必须是另外一个组,而不能是同一个replication group。
4) scheduled links:一个数据库链接(database link),包含一个由用户定义的计划,
来将需要更新的事务推到其它的master sites,当创建scheduled link 的时候,oracle
将在本地任务队列中创建一个任务。
5) master definition site:主体定义站点,大部分的高级复制配置都需要在一个站
点上作,这个站点就是maserdef site。
6. Replication 环境的几种类型
1) Multimaster Replication
2) Materialized View Replication(也可以称为是Single Master Replication)
3) Multimaster and Materialized View Hybrid Configurations
Multimaster Replication 和Materialized View Replication 的区别在于:
前者必须是全表复制而后者可以是 master 表的一部分
前者允许在每一个 transaction 之后都进行复制,而后者是属于批处理复制
两者都使用 scheduled links 进行数据同步操作。
Materialized View Replication 中的materialized view 可能有以下几种类型:
1) Read-Only Materialized Views:只读的实体化视图
2) Updatable Materialized Views:允许更新,同时允许将更新复制到master site
3) Writeable Materialized Views:允许更新,但是每次refresh 的时候,更新都会丢

7. 介绍 Multimaster Replication 中的复制方式
1) Asynchronous replication
在一个master 上发生的变化将在推后的时间内更新到其他的master 上
2) Synchronous replication
在一个master 上发生的变化将立刻更新到其他的master 上
3) Procedural replication
必须给每个site 上的包都生成一个wrapper,所有的数据变化应该通过包中的存储
过程完成,当某个master 上的procedure 被调用,wapper 将保证其他site 中的存
储过程也被调用(同步或者不同步)。将大量的数据操作放到一个procedure 中,
然后对于procedure 的调用将被同步,用处在于在于有大数据量操作的时候可以减
少网络负载。
四、 MR 的概念和构架
MR 是Master Replication,也就是主体站点复制的概念,是高级复制区别于普通复制的一个
重要的功能。本章节对于MR 中出现的种种概念作详细解释。
MR 分为single master 和multi master 两种。single master 指一个master site 支持多个
materialized view site,而multi master 则包含多个master site。
Multimaster Replication 也被称为peer-to-peer 或者n-way replication,任何一个master
上发生的变化都将被送到其它的master 上。
1. 为什么使用 Multimaster Replication。
Failover:当主数据库发生问题的时候,可以通过配置Oracle Net 来实现automatic
connect-time failover,需要将客户端的tnsnames.ora 中的FAILOVER_MODE 参数设置
为ON。同时在主数据库正常的时候,其它的master site 仍然可以作为一个具有完全功
能的数据库来支持其它业务,比如报表等。
Load Balancing::提供读动态平衡以及更本地化的数据存取。
2. 比较 RAC(Oracle Real Application Clusters)和Advanced Replication
Load Balancing::高级复制提供读动态平衡,而RAC 则提供读写动态平衡。因为每一
次写操作都会在所有的replication site 上体现,所以高级复制不能提供写动态平衡。
Survivability::高级复制提供更加强有力的灾难恢复功能,因为高级复制环境中的各
个site 可以位于物理上的不同地点,而RAC 因为使用的是磁盘阵列或其他类型的并行系统,
所以通常在同一个物理地点。
Interoperability:高级复制可以在不同平台和操作系统的Oracle 之间实现,而RAC
环境则必须运行在相同的平台上。
3. Multimaster Replication Process
Asynchronous Replication:
说明:使用非同步复制能够减少网络资源和硬件资源的消耗,但是不同的master sites 之间
会有一段时间不同步,并且可能会造成数据冲突。
以下描述非同步复制的过程:
1) 用户执行 DML 操作或者执行replicated procedure 的wrapper,当一个table 被设
定为需要复制,那么对于此表的任何DML 操作都会被捕获并且复制到其他的
master site。对于每一行被插入,更新或者删除的数据都将由一个内部触发器来创
建一个deferred remote procedure call (RPC)并且放在deferred transaction queue
中,如果一个存储过程被设置为需要复制并且它的wrapper 被执行,则这个
procedure call 被放置在transaction queue 中。由于内部触发器是由Oracle 本身
内部维护的,所以可以以最小的系统资源消耗来很快地获取需要复制的对象的变
化。
2) deferred transaction queue 中保存着所有的deferred RPCs。每个site 都有一个事
务队列,这个队列可以被多个replication group 共用。
3) 在指定的间隔之后或者被手工调用,事务将被传递到其他的site,每个site 都可能
有不同的间隔。
4) 事务在这些 site 上被应用,如果出错该事务将被放置到一个错误队列中,以备DBA
检查处理,如果出现数据冲突,冲突解决方法将被调用,如果冲突无法解决那么将
被记录在错误队列中
5) 当事务在所有的 remote master sites 上被成功执行之后,并不会从源site 的事务
队列中立刻删除,删除工作将由另外的purge job 来执行,此job 的执行间隔可以
由用户来定义。
Synchronous Replication:
说明:同步复制始终在同一个 transaction 中完成,如果整个环境中的任何一个site 没有成
功执行事务,那么整个transaction 将被回滚,包括源site。这就保证了数据一致性。
以下描述同步复制的过程:
1) 用户执行 DML 操作或者执行replicated procedure 的wrapper,操作被内部触发器
立刻捕获。
2) 事务被传递到其他 site 并且立刻执行,任何一个site 出错,就回滚整个事务。
4. 冲突解决方案的概念
冲突的类型:更新冲突,唯一性冲突,删除冲突。
当发生冲突的时候,冲突解决方法将被调用以解决冲突,如果无法解决,则被记录到目
标站点的错误队列中。记录到错误队列中的冲突只能由数据库管理员手动解决。
为了实现冲突解决方案,可能会需要修改表结构,比如如果使用最新时间戳的解决方案,
那么就应该在表中添加一个timestamp 列。
5. 配置高级复制的工具
1) 图形界面:Oracle Enterprise Manager 提供了一个友好的GUI 界面用以配置高级复
制。
2) 命令行方式:Oracle 提供了一套replication management application programming
interface (API)来支持用户编写自定义的脚本用以配置高级复制,这些API 是一系
列的PL/SQL packages。实际上GUI 界面的高级配置工具也是调用这些API 来完成
配置的。
注意点:
在高级复制环境中的对于需要复制的对象作任何 DDL 操作,都应该使用高级复制配置
工具来作,比如利用DBMS_REPCAT 包中的相应存储过程。在有些场合下也可以用导出
导入(EXP/IMP)来创建复制对象。在SQL*PLUS 中直接执行的任何DDL 操作都不会被
复制到其它的site 上。
6. 高级复制中的几个角色
Replication Administrator:默认名称是repadmin,也可以修改。
Propagator:一个高级复制环境中可能有多个RA 来管理不同的schema,但是只能有
一个propagator 将延迟处理事务队列中的事务传递到目标站点。
Receiver :负责接收和处理从propagator 处传来的延迟处理事务。可以通过
DBMS_REPCAT_ADMIN 包中REGISTER_USER_REPGROUP 存储过程来注册一个receiver。
7. Database Links
数据库链接在高级复制环境中提供了数据传送的通道,在一个MMR 环境中,如果有N
个Master Site,就会有N-1 个数据库链接。在MVR 环境中,则只需要从实体化视图站
点上到主站点的数据库链接。如果使用设置向导来创建dblink,则会在USING 后面使用
连接描述字串,而不是连接服务名,这样在对方数据库发生变化的时候,就必须删除重
建现有的dblink,所以我们应该手动设定dnlink,从而在USING 后面使用连接服务名。
这样即使对方数据库改变,我们也只需要修改tnsnames.ora 中的配置即可,而不需要
重建dblink。
8. 可以进行复制的对象
• Tables
当一个对象被复制到目标站点上时,复制支持不会自动生成。利用这个特点可以快速地
发布一个标准的数据库环境到另外的站点上。
• Indexes
作为约束的索引,当表在主站点上被创建的时候,会自动在复制站点上创建,但是对于
提高性能的索引则不会被自动创建而必须手动指定。对于索引被复制到目标站点之后,
等同于本地的索引,不需要再添加复制支持。
• Packages and Package Bodies
存储过程中的所有参数必须是IN 的,OUT 和INOUT 不被支持。存储过程和函数也必须
定义在包中,单独的存储过程和函数无法进行复制。
• Procedures and Functions
虽然单独的存储过程和函数无法进行复制,但是仍然可以在高级复制环境中利用复制来
将单独的存储过程和函数发布到远程的站点上,就像在远程站点本地创建的一样。
• User-Defined Types and Type Bodies
所有的用户定义类型在所有的复制站点上都必须存在而且必须完全相同。
• Triggers
一个比较重要的应用就是在DML 操作的时候在表的timestmap 列中插入当前的系统时
间。为了防止触发器被重复调用,必须要使用API 来判断DML 操作是在本地发起的还
是通过高级复制传递过来的。如下例:
CREATE OR REPLACE TRIGGER hr.insert_time
BEFORE
INSERT OR UPDATE ON hr.employees FOR EACH ROW
BEGIN
IF DBMS_REPUTIL.FROM_REMOTE = FALSE THEN
:NEW.TIMESTAMP := SYSDATE;
END IF;
END;
• Views, Object Views, and Synonyms
只是简单地复制到其它站点,不会产生任何内部触发器或者包来监控这些被复制的对象
的改变。由于是复制对象,所以仍然可以使用高级复制工具或者API 来进行修改和删除。
• Indextypes
必须手工指定复制。可以用高级复制工具或者CREATE_MASTER_REPOBJECT 存储过程。
• User-Defined Operators
复制情况跟视图,同义词等相同,只是简单的复制而已。
注意:高级复制不支持 sequence。如果想实现高级复制环境中的序列唯一性,可以有
以下几种方法:
1. 使用 SELECT SYS_GUID() OID FROM DUAL;这样将会产生全球唯一的GUID
2. 在序列前面添加站点名称,比如唯一的 GLOBAL_NAME
3. 在各个复制站点规划不会重复的序列,比如站点 A 的序列从1 开始,以10 递增,
站点B 的序列从3 开始,以10 递增。
9. 高级复制环境中的队列
Oracle 利用Internal Triggers 来捕获对象变化,并且生成RPCs(remote procedure calls),
RPCs 中包含目标站点上的internal procedure 的执行命令以及需要复制的数据,RPCs
存储在deferred transaction queue 中,当一个RPC 到达目标站点,该站点上相应的
internal procedure 将被运行以应用RPC 来完成复制操作。
高级复制环境中的队列包含 Deferred Transaction Queue,Error Queue 和Job Queue。
Job Queue 中包含的作业有三种:将延迟事务推到远程主站点的作业,将已经应用过的
事务从延迟事务处理队列中删除的作业,刷新实体化视图更新组的作业。
10. 管理请求(Administrative Request)- 管理机制
什么是管理请求?
在 DBA_REPCATLOG 视图中查看Administrative Requests 的状态。当管理请求在所有的
主站点上成功执行以后,管理请求将从所有的主站点包括主体定义站点中的管理请求队
列中,也就是DBA_REPCATLOG 视图中删除。
DBA_REPCATLOG 视图中管理请求的几种状态:
1) READY:表示请求准备被执行。如果长时间处于该状态,可以手动执行
DBMS_REPCAT.DO_DEFERRED_REPCAT_ADMIN 存储过程来执行请求。
2) AWAIT_CALLBACK:这种状态只会出现在主体定义站点上,表示正在等待
其它的主站点执行请求并且返回结果。
3) ERROR:表示请求执行错误
4) DO_CALLBACK:这种状态只会出现在非主体定义站点上,表示要通知主体
定义站点请求执行的结果。
11. 主体组(Master Group)- 组织机制
在高级复制环境中,Oracle 用复制组来管理复制对象。而在多主体复制(multimaster
replication)环境中复制组就被称为主体组(Master Group)。在不同的复制站点上的相
应主体组中必须包含相同的复制对象。
12. Column Groups - 组织机制
Column Group 是在冲突解决方案中扮演角色的多个字段的集合。如果组中的某个字段
引发了冲突,那么其余的字段可以用来作解决这个冲突。打个比方,如果一个表的column
group 中包含price 和timestamp 字段,那么当启用时间戳冲突解决方案(timestamp
conflict resolution routine)时,timestamp 字段就可以用来解决price 字段中发生的冲突。
可能刚开始的时候会想把表中的所有字段都放入一个Column Group 中,这样确实使配
置和管理都更简单了些,但是却会降低复制的性能并且可能会引发潜在的数据冲突。在
后面的性能机制部分,大家将会看到如果一个column group 中发生了冲突,那么oracle
的最小化通信功能(minimum communication feature)将不会从其它的column group
中传递来数据。所以将所有的字段全部放入一个column group 将减弱最小化通信功能
带来的好处, 除非使用了DBMS_REPCAT 包中的SEND_OLD_VALUES 和
COMPARE_OLD_VALUES 存储过程。在后面的冲突解决方案的概念和体系结构章节中将
会有更详细的描述。
13. 传播类型 - 传播机制
异步数据复制通常也被称为:store-and-forward data replication
同步数据复制通常也被称为:real-time data replication
由于同步复制采取的锁机制,所以当同时更新同一行数据时,会产生死锁的现象。当同
步更新一个复制表时,Oracle 首先锁住本地行,然后使用一个AFTER ROW 触发器来锁
住远端的行。当事务在所有的站点都提交之后,Oracle 才会解锁。同步数据复制极为依
赖系统和网络的可用性,因为只要当复制环境中的所有站点都可用时,事务才能正常进
行。
混合模式的数据复制:
1) 假设创建了 A 是masterdef site,然后添加了B 为同步数据复制,再添加C 为
非同步复制,那么此时AB 之间是同步,AC 和BC 之间都是非同步。
2) 假设创建了 A 是masterdef site,然后添加了C 为非同步数据复制,再添加B
为同步复制,那么此时AB 和BC 之间是同步,AC 之间是非同步。
14. Initiating 方法- 展开机制
当使用同步复制的时候,DML 传播被立刻处理并且被自动展开。
如果是使用异步复制,那么可以用下面的方法传播延迟事务:
计划作业:大部分场合,都是利用计划作业在指定的时间间隔后自动传播延迟事务。
手动传播:如果不想等待计划作业的自动传播,也可以利用存储过程或者复制管理工具
来手动传播改动。
15. 并行传播(Parallel Propagation) - 性能机制
16. 最小化通信(Minimum Communication) - 性能机制
17. 延迟秒数(Delay Seconds) - 性能机制
上面三个参数(15,16,17 值得好好研究并且进行调整,以后会补齐这部分内容)
18. 复制保护机制:
在多主体复制环境中,Oracle 将保证就算发生错误的时候,事务传播也不会丢失,同样
同一个事务也不可能传播两次。
正确的传播并不以为着延迟事务在远程站点就正确执行了,可能因为无法解决的冲突或
者说远程站点磁盘空间不足等原因延迟事务执行失败,那么这样的错误将会记录在远程
站点的错误队列中。
19. 数据传播的依赖性维护
非并行传播中,Oracle 按照本地站点的事务commit 顺序来在远程站点应用事务。而并
行传播中,Oracle 则会记录最新事务产生的SCN,如果存在事务之间的依赖性,那么
Oracle 将先在远程站点应用比这个SCN 小或者等于这个SCN 的事务,然后再应用这个
最新的事务,这是一个非并行的应用,只有当不存在事务依赖性的时候,才会真正利用
并行来应用延迟事务。
记录 SCN 有两种方式,一种是数据块级别的,一种是行级别的。
当创建表的时候,如果使用了:
NOROWDEPENDENCIES,这是默认属性,那么Oracle 将会以数据块级别方式来记录
SCN。这样存储在同一个数据块中的多行记录都只会有一个最新的SCN,旧的会被新生
成的覆盖。
ROWDEPENDENCIES,那么将对表中的每一行都记录SCN。在同一个数据块中的多
行记录将分别保留自己的SCN,这样每一行记录都需要额外的6 个字节的存储空间。但
是这将提高并行传播时应用延迟事务的效率。(使用这个特性,要求数据库的初始化参
数中COMPATIBLE=9.0.1 或者更高)。可以使用以下SQL 来检查那些表启用了这个特性:
SQL> SELECT OWNER, TABLE_NAME FROM DBA_TABLES
WHERE DEPENDENCIES = 'ENABLED';
如果没有使用ROWDEPENDENCIES,那么我们可以设法让事务依赖性最小,这样来达
到提高复制环境应用效率的目的。比如我们可以创建多个freelist,这样可以在大量insert
的时候将不同事务更新的数据放置到不同的数据块中。
另外在程序设计的时候,我们也应该尽量避免大量的事务同时更新同一张小表的现象出
现,比如说有些应用会设计一张小表来模拟序列(Sequence),用以生成唯一的主键。
这样就会迫使多个事务同时更新同一个数据块。对于这种情况,我们应该改为使用
Sequence 并且缓存Sequence 的生成。
20. 冲突解决机制
为了正确地侦测复制冲突,Oracle 必须能够找到在不同的站点之间对于相关行的唯一标示。
这就要求在复制环境中,每个表都必须有主键,如果没有主键,那么也必须指定多个字段的
组合来作为唯一标示。
Oracle 自己提供了以下几种冲突解决方案:
1) Latest and Earliest Timestamp
2) Overwrite and Discard
3) Maximum and Minimum
4) Additive and Average
5) Timestamp
6) Priority Group
7) Site Priority
如果上述Oracle 提供的解决方案无法满足应用的需求,那么也可以利用PL/SQL 来编写自定
义的冲突解决方案。
五、问题与难点总结:
1,将快照加入快照组
EXECUTE DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT(gname => '复制组名', sname => '远程用户', oname => '远程表名', type => 'SNAPSHOT',min_communication => FALSE);
sname 实现数据库复制的用户名称
oname 实现数据库复制的数据库对象名称
(表名长度在27个字节内,程序包名长度在24个字节内)
type 实现数据库复制的数据库对象类别
(支持的类别:表,索引,同义词,触发器,视图,过程,函数,程序包,程序包体)
use_existing_object true表示用主复制节点已经存在的数据库对象
gname 主复制组名
2,文件位置说明:
D:\oracle\product\10.2.0\db_1\srvm\admin\init.ora ------job_queueprocesses = 10  open_links=8
exec dbms_repcat.drop_master_repgroup(gname=>'rep_test',all_sites=>true);
select gname,master,status from dba_repgroup;
select sname,oname,status,gname from dba_repobject;
3,问题解决方案:
SQL> exec DBMS_REPCAT.CREATE_MVIEW_REPGROUP (gname => 'rep_test',master => 'master.com',propagation_mode => 'ASYNCHRONOUS');
begin DBMS_REPCAT.CREATE_MVIEW_REPGROUP (gname => 'rep_test',master => 'master.com',propagation_mode => 'ASYNCHRONOUS'); end;
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须声明标识符 'DBMS_REPCAT'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
解决方案:grant execute on dbms_repcat to mvadmin;
注释:mvadmin:为要得到权限的用户名称。
具体总结:
在System用户下:执行grant execute on 包名 to 用户名;
说明:
   包名:要使用的包名;如:dbms_repcat。
   用户名:要使用此包的用户。如:mvadmiv。
举例:grant execute on dbms_repcat to mvadmiv;
4,有些步骤需要一下权限:
grant select any table to mvadmin;
grant execute any procedure to mvadmin;
grant comment any table to repadmin;
5,定义时间网站:http://database.ctocio.com.cn/132/9282132.shtml
6,问题解决方案:
ORA-02085: 数据库链接 DBLINK_ANSON.COM 连接到 SNAP.COM
解决方案:当global_name参数设置为true,则dblink必须命名为和在目标数据库如下查询出的结果一致:
select * from global_name,例如:
在目标数据库执行查询:
SQL>  select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
Mydb

SQL>
则修改dblink:
create database link mydb  connect to myuser identified by pass  using 'mydb2';
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhpsam109/archive/2006/05/13/727314.aspx
7,文章中的专业词汇翻译
scheduled links:预计连接
replication:复制
site:位置
wapper:打包
MR 是Master Replication:主复制
peer-to-peer:对等网络
Failover:失效备援
replicated proc:复制程序
deferred:延期
deferred remote procedure call (RPC):延迟远程过程调用
remote:远程的
purge:清除
8, Replication 环境的几种类型
1) Multimaster Replication
2) Materialized View Replication(也可以称为是Single Master Replication)
3) Multimaster and Materialized View Hybrid Configurations
Multimaster Replication 和Materialized View Replication 的区别在于:
前者必须是全表复制而后者可以是 master 表的一部分
前者允许在每一个 transaction 之后都进行复制,而后者是属于批处理复制
两者都使用 scheduled links 进行数据同步操作。
9,Oracle RAC
     是Oracle Real Application Cluster的简写,官方中文文档一般翻译为“真正应用集群”,它一般有两台或者两台以上同构计算机及共享存储设备构成,可提供强大的数据库处理能力,现在是Oracle 10g Grid应用的重要组成部分。
10,timestamp(时间戳)DATE数据类型的主要问题:
     是它粒度不能足够区别出两个事件哪个先发生。ORACLE已经在DATE数据类型上扩展出来了TIMESTAMP数据类型,它包括了所有DATE数据类型的年月日时分秒的信息,而且包括了小数秒的信息。如果你想把DATE类型转换成TIMESTAMP类型,就使用CAST函数。
SQL> SELECT CAST(date1 AS TIMESTAMP) "Date" FROM t;



个人总结:
经过了断断续续的九天时间,实验失败了5次,最后终于成功了。
在这个过程中使我对Oracle数据库有了更近一步的了解。1,Oracle数据库在权限方面力度很细;2,Oracle厂商提供了大量的存储过程与函数共开发人员使用,功能很强大,但是也加大了开发人员熟练掌握的难度;3,Oracle在复制方面其内部使用了大量的触发器;4,Oracle本身所具有的图形化界面没有SQL Server的直观、易用;5,Oracle的存储结构上与其他数据库相比更加的透明,为后期的其它新功能提供了强大的架构支持与扩展性。
解决问题的能力有所提高。1,我个人认为大多数的,经过公开的最佳实践。如果在你尝试使用时所出现了问题,大多数在网上都能找到对应的解决方案。尤其是国外的网站解决方案更多。2,人际交流方面。有时在遇到问题时,经过自己的思考,在网上查找资料都找不到答案的话,我就请教身边的同事,一般情况下他们都能帮助我解决。总之,现代的软件工程是一个在各个领域都比较稳定、成熟,同时又充满新的需求与限制的时代。所以在每个领域内部都有其最佳实践。因为我们每个人所掌握的程度都不一样,所以说技术分享就成了软件制作中的关键所在。但是前提是我们每个人都要善于分享与交流。只有这样我们每一个人才会更快更好的发展。
以上的解决方案可能不是最好的,但是我会在得到项目的具体需求后,在选择一种更好的解决方案。
                                            关成龙
                                        2010年02月09日
2010-03-16日新增加的总结:其实网络上的一些操作可能只要是自己操作出来过的基本上都可以运行成功。但是有是你就是运行不出来,其实原因就是作者们省略了其中他/她认为很不重要的地方,而就是这些地方导致了您操作的失败。就这样,就这样 我失败过好多次。
因此,现将我将个人整理好的Oracle物化视图的脚本整理出来,以供大家日后少犯这样的错误。
                                            关成龙
                                         2010年03月16日


==================================================================================
注释:此过程为本人一步一步操作的过程及运行后的结果。如果你要是想按照本文的操作做一下,那么就麻烦您先将本文的“一、要求说明”中的条件及配置全部搞定,然后再只要执行“附录1”中我个人整理好的Oracle脚本即可。
==================================================================

==================================================================

一、要求说明:
Oralce版本:Oracle 10g
主站点:rep2.yangtingkun
物化视图站点:yangtk2.yangtingkun
主站点名称:yangtingkun    IP地址为:192.168.1.29     密码:infcn
物化视图站点名称:yangtk   IP地址为:192.168.1.191    密码:infcn
复制用户:yangtk
1. 检查初始化参数
复制对数据库的初始化参数限制不多,主要注意两点。
global_names 为TRUE 以及job_queue_process 大等0。
文件位置说明:
D:\oracle\product\10.2.0\db_1\srvm\admin\init.ora ------job_queueprocesses = 10  open_links=8
分别在主站点和物化视图站点执行下面两条 sqlplus 命令,检查数据库初始化参数是否符合
要求。
show parameter global_names
show parameter job
如果初始化参数设置的不满足要求,可以通过下列语句动态修改。
alter system set global_names = true;
alter system set job_queue_processes = 20;

修改主体站点的tnsnames.ora 文件,主站点和物化视图站点的参数文件中都添加下列内容:
REP2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yangtingkun)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rep2)
)
)
YANGTK2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.191)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = yangtk2)
)
)

修改物化视图站点的tnsnames.ora 文件,主站点和物化视图站点的参数文件中都添加下列内容:
REP2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.29)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rep2)
)
)
YANGTK2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yangtk)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = yangtk2)
)
================================================================
二、PL/SQL中的操作(只需要在主复制站点中操作就OK了):

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS

SQL> conn conn system/infcn@rep2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS

SQL> alter database rename global_name to yangtk2.yangtingkun;

Database altered

SQL> CONN system/infcn@rep2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system

SQL>
SQL> --建立复制管理用户repadmin 并授权
SQL> CREATE USER repadmin IDENTIFIED BY repadmin;

User created

SQL> BEGIN
  2  DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (username => 'repadmin');
  3  END;
  4  /

PL/SQL procedure successfully completed

SQL>
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

SQL> --注册传播用户并授权,这里使用了管理用户repadmin,也可以分别建立用户
SQL> BEGIN
  2  DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'repadmin');
  3  END;
  4  /

PL/SQL procedure successfully completed

SQL> --注册接收用户,这里使用了管理用户repadmin
SQL> BEGIN
  2  DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
  3  username => 'repadmin',
  4  privilege_type => 'receiver',
  5  list_of_gnames => NULL);
  6  END;
  7  /

PL/SQL procedure successfully completed

SQL> --建立
SQL> --建立物化视图站点复制管理员的代理用户,出于简单考虑,这里也使用repadmin 用户
SQL>
SQL> BEGIN
  2  DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
  3  username => 'repadmin',
  4  privilege_type => 'proxy_snapadmin',
  5  list_of_gnames => NULL);
  6  END;
  7  /

PL/SQL procedure successfully completed

SQL>
SQL> --设置代理刷新用户,并授权,这里仍然使用repadmin 用户
SQL> --对于repadmin 而言,不需要create session 权限
SQL> --但是这里如果新建用户的话,create session 权限则是必须的
SQL> GRANT CREATE SESSION TO repadmin;

Grant succeeded

SQL> GRANT SELECT ANY TABLE TO repadmin;

Grant succeeded

SQL>
SQL> --设置清除延迟序列的job
SQL> --以复制管理员身份登陆到主站点
SQL> CONNECT repadmin/repadmin@rep2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as repadmin

SQL> BEGIN
  2  DBMS_DEFER_SYS.SCHEDULE_PURGE (
  3  next_date => SYSDATE,
  4  interval => 'SYSDATE + 1/1440',
  5  delay_seconds => 0);
  6  END;
  7  /

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

SQL> --多主站点的设置还需要多个站点间建立数据库链并建立调度机制
SQL> --但是对于物化视图复制的主体站点,则这些设置是不需要的
SQL>
SQL> --以system 用户连接到物化视图站点
SQL> CONN system/infcn@yangtk2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system

SQL>
SQL> --建立物化视图管理员,并授权
SQL> CREATE USER mvadmin IDENTIFIED BY mvadmin;

User created

SQL> BEGIN
  2  DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (
  3  username => 'mvadmin');
  4  END;
  5  /

PL/SQL procedure successfully completed

SQL>
SQL> GRANT COMMENT ANY TABLE TO mvadmin;

Grant succeeded

SQL> GRANT LOCK ANY TABLE TO mvadmin;

Grant succeeded

SQL> GRANT SELECT ANY DICTIONARY TO mvadmin;

Grant succeeded

SQL>
SQL> --建立传播者,并授权,这里使用mvadmin 用户,也可以建立单独的用户
SQL> BEGIN
  2  DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'mvadmin');
  3  END;
  4  /

PL/SQL procedure successfully completed

SQL>
SQL> --建立刷新者,并授权,这里使用mvadmin 用户刷新物化视图
SQL> --对于mvadmin 而言,不需要create session 权限
SQL> --但是这里如果新建用户的话,create session 权限则是必须的
SQL> GRANT CREATE SESSION TO mvadmin;

Grant succeeded

SQL> GRANT ALTER ANY MATERIALIZED VIEW TO mvadmin;

Grant succeeded

SQL>
SQL> --注册接受者
SQL> BEGIN
  2  DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
  3  username => 'mvadmin',
  4  privilege_type => 'receiver',
  5  list_of_gnames => NULL);
  6  END;
  7  /

PL/SQL procedure successfully completed

SQL> --建立PUBLIC 数据库链
SQL> CREATE PUBLIC DATABASE LINK rep2.yangtingkun USING 'rep2';

Database link created

SQL>
SQL> --建立到主站点上代理物化视图管理员的数据库链
SQL> --以物化视图管理员身份连接到物化视图站点
SQL> CONNECT mvadmin/mvadmin@yangtk2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as mvadmin

SQL> CREATE DATABASE LINK rep2.yangtingkun CONNECT TO repadmin IDENTIFIED BY repadmin;

Database link created

SQL> commit;

Commit complete

SQL> --以复制管理员身份登陆复制站点
SQL> CONNECT repadmin/repadmin@rep2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as repadmin

SQL>
SQL> BEGIN
  2  DBMS_REPCAT.CREATE_MASTER_REPGROUP (
  3  gname => 'rep_test');
  4  END;
  5  /

PL/SQL procedure successfully completed

SQL> CONNECT system/infcn@yangtk2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system

SQL>  CONNECT system/incn@rep2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system

SQL> CREATE USER yangtk IDENTIFIED BY yangtk;

User created

SQL> ALTER USER yangtk DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;

User altered

SQL> ALTER USER yangtk TEMPORARY TABLESPACE temp;

User altered

SQL>  GRANT
  2  CREATE SESSION,
  3  CREATE TABLE,
  4  CREATE PROCEDURE,
  5  CREATE SEQUENCE,
  6  CREATE TRIGGER,
  7  CREATE VIEW,
  8  CREATE SYNONYM,
  9  ALTER SESSION,
10  CREATE MATERIALIZED VIEW,
11  ALTER ANY MATERIALIZED VIEW,
12  CREATE DATABASE LINK
13  TO yangtk;

Grant succeeded

SQL> conn yangtk/yangtk@rep2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as yangtk

SQL> create table test_rep (id number not null, name varchar2(100));

Table created

SQL> alter table test_rep add constraint pk_test_rep primary key (id);

Table altered

SQL> create index ind_test_rep_name on test_rep (name);

Index created

SQL> insert into test_rep values (1, 'ytk');

1 row inserted

SQL>  insert into test_rep values (2, 'zhly');

1 row inserted

SQL> commit;

Commit complete

SQL>
SQL> conn repadmin/repadmin@rep2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as repadmin

SQL>
SQL> --将复制对象增加到复制组中
SQL> --主键所用的索引自动复制,其他索引需要明确添加到复制组中
SQL> BEGIN
  2  DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
  3  gname => 'rep_test',
  4  type => 'TABLE',
  5  oname => 'test_rep',
  6  sname => 'yangtk',
  7  use_existing_object => TRUE,
  8  copy_rows => FALSE);
  9  END;
10  /

PL/SQL procedure successfully completed

SQL>
SQL> BEGIN
  2  DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
  3  gname => 'rep_test',
  4  type => 'INDEX',
  5  oname => 'ind_test_rep_name',
  6  sname => 'yangtk',
  7  use_existing_object => TRUE,
  8  copy_rows => FALSE);
  9  END;
10  /

PL/SQL procedure successfully completed

SQL>
SQL> --生成复制支持
SQL> BEGIN
  2  DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
  3  sname => 'yangtk',
  4  oname => 'test_rep',
  5  type => 'TABLE',
  6  min_communication => TRUE);
  7  END;
  8  /

PL/SQL procedure successfully completed

SQL>
SQL> --开始复制
SQL> BEGIN
  2  DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
  3  gname => 'rep_test');
  4  END;
  5  /

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

SQL> CONNECT yangtk@rep2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as yangtk

SQL>
SQL> --建立物化视图日志表,FAST 刷新方式必须要求建立物化视图日志,COMPLETE 则不需要
SQL> CREATE MATERIALIZED VIEW LOG ON yangtk.test_rep;

Materialized view log created

SQL> CONNECT system/infcn@yangtk2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system

SQL> CREATE USER yangtk IDENTIFIED BY yangtk;

User created

SQL> ALTER USER yangtk DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;

User altered

SQL> ALTER USER yangtk TEMPORARY TABLESPACE temp;

User altered

SQL>
SQL> GRANT
  2  CREATE SESSION,
  3  CREATE TABLE,
  4  CREATE PROCEDURE,
  5  CREATE SEQUENCE,
  6  CREATE TRIGGER,
  7  CREATE VIEW,
  8  CREATE SYNONYM,
  9  ALTER SESSION,
10  CREATE MATERIALIZED VIEW,
11  ALTER ANY MATERIALIZED VIEW,
12  CREATE DATABASE LINK
13  TO yangtk;

Grant succeeded

SQL> CONNECT yangtk/yangtk@yangtk2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as yangtk

SQL> CREATE DATABASE LINK rep2.yangtingkun CONNECT TO repadmin IDENTIFIED BY repadmin;

Database link created

SQL>
SQL> --建立物化视图组
SQL> --以物化视图管理员身份登陆物化视图站点
SQL> CONNECT mvadmin/mvadmin@yangtk2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as mvadmin

SQL>
SQL> --物化视图组必须和复制站点上的复制组名称相同
SQL> BEGIN
  2  DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
  3  gname => 'rep_test',
  4  master => 'rep2.yangtingkun',
  5  propagation_mode => 'ASYNCHRONOUS');
  6  END;
  7  /

PL/SQL procedure successfully completed

SQL> --创建物化视图
SQL>
SQL> CREATE MATERIALIZED VIEW yangtk.test_rep
  2  REFRESH FAST WITH PRIMARY KEY
  3  AS SELECT * FROM yangtk.test_rep@rep2.yangtingkun;

Materialized view created

SQL> --创建刷新组
SQL>
SQL> BEGIN
  2  DBMS_REFRESH.MAKE (
  3  name => 'mvadmin.rep_refresh',
  4  list => '',
  5  next_date => SYSDATE,
  6  interval => 'SYSDATE + 1/1440',
  7  implicit_destroy => FALSE,
  8  rollback_seg => '',
  9  push_deferred_rpc => TRUE,
10  refresh_after_errors => FALSE);
11  END;
12  /

PL/SQL procedure successfully completed

SQL> --将物化视图添加到刷新组
SQL>
SQL> BEGIN
  2  DBMS_REFRESH.ADD (
  3  name => 'mvadmin.rep_refresh',
  4  list => 'yangtk.test_rep',
  5  lax => TRUE);
  6  END;
  7  /

PL/SQL procedure successfully completed
SQL>conn system/infcn@rep2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system

SQL> select * from yangtk.test_rep;
        ID NAME
---------- --------------------------------------------------------------------------------
         1 ytk
         2 zhly
SQL> insert into yangtk.test_rep(id,name) values(3,'关成龙');

1 row inserted
SQL> commit;

Commit complete
SQL> update yangtk.test_rep set name='第一次更改测试成功!' where id=1;

1 row updated

SQL> commit;

Commit complete
SQL> delete from yangtk.test_rep where id=2;

1 row deleted

SQL> commit;

Commit complete

SQL>--注释:可能您要等一回才能在yangtk2中的yangtk用户的test_rep表中看到你想要的结果。
SQL>conn system/infcn@yangtk2
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system
SQL> select * from yangtk.test_rep;

        ID NAME
---------- --------------------------------------------------------------------------------
         1 第一次更改测试成功!
         3 关成龙

2 rows selected



=============到此,Oracle只读物化视图的简单配置过程就此结束。================
====================================================================

--只需要将此文件全部拷贝到PL/SQL中就OK了(注意:两边的数据库密码都为:infcn):

conn system/infcn@rep2
alter database rename global_name to rep2.yangtingkun;
conn system/infcn@yangtk2
alter database rename global_name to yangtk2.yangtingkun;

CONN system/infcn@rep2
--建立复制管理用户repadmin 并授权
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 SELECT ANY DICTIONARY TO repadmin;
--注册传播用户并授权,这里使用了管理用户repadmin,也可以分别建立用户
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'repadmin');
END;
/
--注册接收用户,这里使用了管理用户repadmin
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'repadmin',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
--建立物化视图站点复制管理员的代理用户,出于简单考虑,这里也使用repadmin 用户
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'repadmin',
privilege_type => 'proxy_snapadmin',
list_of_gnames => NULL);
END;
/
--设置代理刷新用户,并授权,这里仍然使用repadmin 用户
--对于repadmin 而言,不需要create session 权限
--但是这里如果新建用户的话,create session 权限则是必须的
GRANT CREATE SESSION TO repadmin;
GRANT SELECT ANY TABLE TO repadmin;
--设置清除延迟序列的job
--以复制管理员身份登陆到主站点
CONNECT repadmin/repadmin@rep2
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/1440',
delay_seconds => 0);
END;
/
commit;
--多主站点的设置还需要多个站点间建立数据库链并建立调度机制
--但是对于物化视图复制的主体站点,则这些设置是不需要的
--以system 用户连接到物化视图站点
CONN system/infcn@yangtk2
--建立物化视图管理员,并授权
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;
--建立传播者,并授权,这里使用mvadmin 用户,也可以建立单独的用户
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'mvadmin');
END;
/
--建立刷新者,并授权,这里使用mvadmin 用户刷新物化视图
--对于mvadmin 而言,不需要create session 权限
--但是这里如果新建用户的话,create session 权限则是必须的
GRANT CREATE SESSION TO mvadmin;
GRANT ALTER ANY MATERIALIZED VIEW TO mvadmin;
--注册接受者
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'mvadmin',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
--建立PUBLIC 数据库链
CREATE PUBLIC DATABASE LINK rep2.yangtingkun USING 'rep2';
--建立到主站点上代理物化视图管理员的数据库链
--以物化视图管理员身份连接到物化视图站点
CONNECT mvadmin/mvadmin@yangtk2
CREATE DATABASE LINK rep2.yangtingkun CONNECT TO repadmin IDENTIFIED BY repadmin;
commit;
--以复制管理员身份登陆复制站点
CONNECT repadmin/repadmin@rep2
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname => 'rep_test');
END;
/
CONNECT system/incn@rep2
CREATE USER yangtk IDENTIFIED BY yangtk;
ALTER USER yangtk DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
ALTER USER yangtk TEMPORARY TABLESPACE temp;
GRANT CREATE SESSION,
CREATE TABLE,
CREATE PROCEDURE,
CREATE SEQUENCE,
CREATE TRIGGER,
CREATE VIEW,
CREATE SYNONYM,
ALTER SESSION,
CREATE MATERIALIZED VIEW,
ALTER ANY MATERIALIZED VIEW,
CREATE DATABASE LINK
TO yangtk;
conn yangtk/yangtk@rep2
create table test_rep (id number not null, name varchar2(100));
alter table test_rep add constraint pk_test_rep primary key (id);
create index ind_test_rep_name on test_rep (name);
insert into test_rep values (1, 'ytk');
insert into test_rep values (2, 'zhly');
commit;
conn repadmin/repadmin@rep2
--将复制对象增加到复制组中
--主键所用的索引自动复制,其他索引需要明确添加到复制组中
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'rep_test',
type => 'TABLE',
oname => 'test_rep',
sname => 'yangtk',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'rep_test',
type => 'INDEX',
oname => 'ind_test_rep_name',
sname => 'yangtk',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
--生成复制支持
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => 'yangtk',
oname => 'test_rep',
type => 'TABLE',
min_communication => TRUE);
END;
/
--开始复制
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => 'rep_test');
END;
/
commit;
CONNECT yangtk/yangtk@rep2
--建立物化视图日志表,FAST 刷新方式必须要求建立物化视图日志,COMPLETE 则不需要
CREATE MATERIALIZED VIEW LOG ON yangtk.test_rep;
CONNECT system/infcn@yangtk2
CREATE USER yangtk IDENTIFIED BY yangtk;
ALTER USER yangtk DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
ALTER USER yangtk TEMPORARY TABLESPACE temp;
GRANT
CREATE SESSION,
CREATE TABLE,
CREATE PROCEDURE,
CREATE SEQUENCE,
CREATE TRIGGER,
CREATE VIEW,
CREATE SYNONYM,
ALTER SESSION,
CREATE MATERIALIZED VIEW,
ALTER ANY MATERIALIZED VIEW,
CREATE DATABASE LINK
TO yangtk;
CONNECT yangtk/yangtk@yangtk2
CREATE DATABASE LINK rep2.yangtingkun CONNECT TO repadmin IDENTIFIED BY repadmin;
--建立物化视图组
--以物化视图管理员身份登陆物化视图站点
CONNECT mvadmin/mvadmin@yangtk2
--物化视图组必须和复制站点上的复制组名称相同
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
gname => 'rep_test',
master => 'rep2.yangtingkun',
propagation_mode => 'ASYNCHRONOUS');
END;
/
--创建物化视图
CREATE MATERIALIZED VIEW yangtk.test_rep
REFRESH FAST WITH PRIMARY KEY
AS SELECT * FROM yangtk.test_rep@rep2.yangtingkun;
--创建刷新组
BEGIN
DBMS_REFRESH.MAKE (
name => 'mvadmin.rep_refresh',
list => '',
next_date => SYSDATE,
interval => 'SYSDATE + 1/1440',
implicit_destroy => FALSE,
rollback_seg => '',
push_deferred_rpc => TRUE,
refresh_after_errors => FALSE);
END;
/
--将物化视图添加到刷新组
BEGIN
DBMS_REFRESH.ADD (
name => 'mvadmin.rep_refresh',
list => 'yangtk.test_rep',
lax => TRUE);
END;
/
conn system/infcn@rep2
select * from yangtk.test_rep;
insert into yangtk.test_rep(id,name) values(3,'关成龙');
update yangtk.test_rep set name='第一次更改测试成功!' where id=1;
delete from yangtk.test_rep where id=2;
commit;
--注释:可能您要等一回才能在yangtk2中的yangtk用户的test_rep表中看到你想要的结果。
conn system/infcn@yangtk2
select * from yangtk.test_rep;
--==========到此,Oracle只读物化视图的简单配置过程就此结束。================


如果要下载,就下载附件就OK了。

                 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics