<< Oracle高可用>>部分书面作业 - 第十三课 Oracle高级复制

本文深入探讨了 Oracle 中高级复制和流复制的机制与应用场景,通过具体步骤展示了如何利用这些技术实现数据同步。同时,介绍了如何使用物化视图进行数据刷新,确保数据实时一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.说明高级复制和流复制的在机制和应用场景上的异同点。

不同点: 高级复制基于内部触发器, 流复制基于日志挖掘

相同点: 都只能用于Oracle对Oracle的复制


2.演示针对某个表使用高级复制进行数据同步

复制方向:strm1 -> strm2

两端准备环境
conn / as sysdba
alter system set global_names=true;
alter database rename global_name to strm1.com;

alter system set global_names=true;
alter database rename global_name to strm2.com;

创建复制用户 (BOTH)
conn / as sysdba;
create user repadmin identified by repadmin;
alter user repadmin default tablespace users;
alter user repadmin temporary tablespace temp;
grant connect ,resource to repadmin;
execute dbms_repcat_admin.grant_admin_any_schema('REPADMIN');
grant comment any table to repadmin;
execute dbms_defer_sys.register_propagator('REPADMIN');
grant execute any procedure to REPADMIN;

create user gp identified by gp;
grant dba to gp;

conn gp/gp@strm1
create table t(x int primary key);
conn gp/gp@strm2
create table t(x int primary key);

2:连接复制用户

创建到目标端的dblink
conn repadmin/repadmin@strm1;
create database link strm2.com connect to repadmin identified by repadmin using 'strm2';
select name from v$database@strm2.com;

conn repadmin/repadmin@strm2;
create database link strm1.com connect to repadmin identified by repadmin using 'strm1';
select name from v$database@strm1.com;

3:创建复制组
conn repadmin/repadmin@strm1;
execute dbms_repcat.create_master_repgroup('rep');
select gname ,master ,status from dba_repgroup where gname = 'REP';

execute dbms_repcat.drop_master_repgroup('rep');

conn repadmin/repadmin@strm2;
--execute dbms_repcat.create_master_repgroup('rep');
select gname ,master ,status from dba_repgroup where gname = 'REP';

4:加入复制对象
conn repadmin/repadmin@strm1;
execute dbms_repcat.create_master_repobject(sname=>'gp' ,oname=>'t' ,type=>'table' ,use_existing_object=>true ,gname=>'rep' ,copy_rows=>false);

select sname,oname,status,gname from DBA_REPOBJECT;

conn repadmin/repadmin@strm2;
--execute dbms_repcat.create_master_repobject(sname=>'gp' ,oname=>'t' ,type=>'table' ,use_existing_object=>true ,gname=>'rep' ,copy_rows=>false);

5:对复制对象启动复制支持
conn repadmin/repadmin@strm1;
execute dbms_repcat.generate_replication_support('gp' ,'t' ,'table');
select sname,status,gname from dba_repgroup where gname = 'REP';

conn repadmin/repadmin@strm2;
--execute dbms_repcat.generate_replication_support('gp' ,'t' ,'table');
select sname,status,gname from dba_repgroup where gname = 'REP';

6:添加复制节点
conn repadmin/repadmin@strm1;
execute dbms_repcat.add_master_database(gname=>'rep' ,master=>'strm2.com' ,use_existing_objects=>true ,copy_rows=>false ,propagation_mode=>'synchronous');

select gname,dblink,masterdef,master from dba_repsites where gname= 'REP';

在两端查询
column masterdef format a10
column master    format a10
column dblink    format a25
column gname    format a12

select gname ,dblink ,masterdef ,master from dba_repsites where gname='REP';

7:启动复制
conn repadmin/repadmin@strm1;
execute dbms_repcat.resume_master_activity('rep' ,true);

execute dbms_repcat.suspend_master_activity('rep');

8.验证
conn gp/gp@strm1;
insert into t values(1);
commit;

conn gp/gp@strm2;
select * from t;


参考资料:
http://www.eygle.com/archives/2005/06/oraclessoeaeaeo.html


--EOF--


3.演示使用物化视图的方式进行数据同步

刷新方向:strm1 -> strm2

建立源表:
conn repadmin/repadmin@strm1@strm1
CREATE TABLE repadmin.t(id int primary key);

建日志:
conn repadmin/repadmin@strm1
CREATE MATERIALIZED VIEW LOG ON repadmin.T WITH PRIMARY KEY;

建物化视图:
conn repadmin/repadmin@strm2
CREATE MATERIALIZED VIEW repadmin.mw_t as select * from repadmin.t@strm1;

建立物化视图组,因为刷新只能刷新组:
conn repadmin/repadmin@strm2
BEGIN
   DBMS_REFRESH.MAKE (
      name => 'repadmin.mv_grp',
      list => '',
      next_date => SYSDATE,
      interval => 'SYSDATE + 1/24',
      implicit_destroy => FALSE,
      rollback_seg => '',
      push_deferred_rpc => TRUE,
      refresh_after_errors => FALSE);
END;

把物化视图加入组:
conn repadmin/repadmin@strm2
BEGIN
   DBMS_REFRESH.ADD (
      name => 'repadmin.mv_grp',
      list => 'repadmin.mw_t',
      lax => TRUE);
END;

测试:
conn repadmin/repadmin@strm1
insert into t values(1);
commit;

conn repadmin/repadmin@strm2
SELECT * FROM repadmin.mw_t;
execute dbms_refresh.refresh('repadmin.mv_grp');
SELECT * FROM repadmin.mw_t;

参考资料:
http://docs.oracle.com/cd/B19306_01/server.102/b14227/rarmviewgroup.htm#CHDCICJC


--EOF--

### 关于 Maven 依赖信息 在使用 Maven 构建项目时,`com.oracle.database.jdbc:ojdbc8` 是 Oracle 提供的 JDBC 驱动程序的官方 Maven 坐标。以下是 `ojdbc8` 版本 `19.8.0.0` 的 Maven 依赖配置信息[^1]: ```xml <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.8.0.0</version> </dependency> ``` 此依赖项需要确保与项目的 Java 版本和 Oracle 数据库版本兼容。例如,`ojdbc8` 支持 JDK 8 及更高版本,并且适用于 Oracle Database 12.2 和 18c[^1]。 如果在 Maven 中央仓库中找不到该依赖项,则可能需要从 Oracle 官方网站下载 JDBC 驱动程序并手动安装到本地 Maven 仓库,或者配置 Oracle 的 Maven 存储库以访问它[^1]。 ### 手动安装 JDBC 驱动程序 如果无法通过 Maven 自动解析依赖项,可以按照以下步骤手动安装驱动程序: 1. 下载 `ojdbc8.jar` 文件(版本 `19.8.0.0`)。 2. 使用以下命令将其安装到本地 Maven 仓库中: ```bash mvn install:install-file -Dfile=/path/to/ojdbc8.jar \ -DgroupId=com.oracle.database.jdbc \ -DartifactId=ojdbc8 \ -Dversion=19.8.0.0 \ -Dpackaging=jar ``` ### 配置 Oracle Maven 存储库 为了直接通过 Maven 获取 Oracle JDBC 驱动程序,可以配置 Oracle 的 Maven 存储库。请确保已注册 Oracle 并获取了相应的存储库凭据。在 `pom.xml` 中添加以下内容: ```xml <repositories> <repository> <id>maven.oracle.com</id> <url>https://maven.oracle.com</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <dependencies> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.8.0.0</version> </dependency> </dependencies> <distributionManagement> <repository> <id>maven.oracle.com</id> <url>https://maven.oracle.com</url> </repository> </distributionManagement> ``` 此外,还需要在 `settings.xml` 文件中配置 Oracle 存储库的认证信息。 ### 注意事项 确保下载的 JDBC 驱动程序版本与 Java 版本和 Oracle 数据库版本兼容。不兼容可能导致运行时错误或功能限制[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值