Oracle 高级数据复制(Advanced Replication)

一、试验环境:

A机:IP:10.1.8.201

     OS:WindowsServer 2003 Standard Edition SP1;

     DB:Oracle 10g Enterprise Edition Release 10.1.0.2.0;

     数据库字符集:NLS_CHARACTERSET ZHS16GBK

B机:IP:10.1.9.49

     OS:WindowsServer 2003 Standard Edition SP1;

     DB:Oracle 10g Enterprise Edition Release 10.1.0.2.0;

     数据库字符集:NLS_CHARACTERSET ZHS16GBK

二、试验步骤:

1. 初始化参数设置

A机:db_domain=mytest1.com

     global_names=true

     job_queue_processes=10 # 缺省值

     open_links=4 # 缺省值

B机:db_domain=mytest2.com

     global_names=true

     job_queue_processes=10 # 缺省值

     open_links=4 # 缺省值

2. 配置数据库连接

数据库名: A、B:orcl

数据库域名: A、B:mytest.com

数据库sid号: A、B:orcl

Listener端口号: A、B:1521 

确认两个数据库之间可以互相访问,在tnsnames.ora里设置数据库连接字符串。

A机:

ORCL_49 =

    (DESCRIPTION =

        (ADDRESS_LIST =

            (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.9.49)(PORT = 1521))

        )

        (CONNECT_DATA =

            (SERVICE_NAME = orcl.mytest2.com)

        )

    )

tnsping orcle_49 测试连通

B机:

ORCL_201 =

    (DESCRIPTION =

        (ADDRESS_LIST =

            (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.8.201)(PORT = 1521))

        )

        (CONNECT_DATA =

            (SERVICE_NAME = orcl.mytest1.com)

        )

    )

tnsping orcle_201 测试连通

3. 用 system 用户连接数据库,改数据库全局名称,建公共的数据库链接。

A机:alter database rename global_name to orcl.mytest1.com;

B机:alter database rename global_name to orcl.mytest2.com;

A机:create public database link orcl.mytest2.com using 'orcl_49';

     select * from global_name@orcl.mytest2.com; -- 验证数据库连接

B机:create public database link orcl.mytest1.com using 'orcl_201';

     select * from global_name@orcl.mytest1.com; -- 验证数据库连接

4. 用 system 用户连接数据库,建立管理数据库复制的用户repadmin,并赋权

A、B机:create user repadmin identified by repadmin default tablespace users temporary tablespace temp; 

      execute dbms_defer_sys.register_propagator('repadmin');

        grant execute any procedure to repadmin;

        execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');

        execute dbms_repcat_admin.grant_admin_any_schema(username => '"REPADMIN"');

        grant comment any table to repadmin;

        grant lock any table to repadmin;

        grant select any dictionary to repadmin;

5. 用 repadmin 用户连接数据库,下创建私有的数据库链接

A机:create database link orcl.mytest2.com connect to repadmin identified by repadmin;

     select * from global_name@orcl.mytest2.com; -- 验证数据库连接

B机:create database link orcl.mytest1.com connect to repadmin identified by repadmin;

     select * from global_name@orcl.mytest1.com; -- 验证数据库连接

6. 创建实现数据库复制的用户和对象,给用户赋权,表必须有主关键字。

A机:-- 用 sys 连接数据库,创建用户并授权

     create user testuser identified by testuser default tablespace users temporary tablespace temp; 

   grant connect, resource to testuser; 

   grant execute on sys.dbms_defer to testuser;

     -- 用 testuser 连接数据库,创建表测试表 dept 

     create table dept 

   (deptno number(2) primary key, 

   dname varchar2(14), 

   loc varchar2(13) ); 

     -- 创建主关键字的序列号,范围避免和 B机 的冲突

     create sequence dept_no increment by 1 start with 1 maxvalue 44 cycle nocache;

     -- 插入初始化数据

     insert into dept values (dept_no.nextval,'accounting','new york'); 

   insert into dept values (dept_no.nextval,'research','dallas'); 

     commit;

B机:-- 用 sys 连接数据库,创建用户并授权

     create user testuser identified by testuser default tablespace users temporary tablespace temp; 

   grant connect, resource to testuser; 

   grant execute on sys.dbms_defer to testuser;

     -- 用 testuser 连接数据库,创建表测试表 dept 

     create table dept 

   (deptno number(2) primary key, 

   dname varchar2(14), 

   loc varchar2(13) ); 

     -- 创建主关键字的序列号,范围避免和 B机 的冲突

     create sequence dept_no increment by 1 start with 45 maxvalue 99 cycle nocache;

     -- 插入初始化数据

     insert into dept values (dept_no.nextval,'sales','chicago'); 

   insert into dept values (dept_no.nextval,'operations','boston'); 

     commit;

7. 创建要复制的组 testuser_mg,加入数据库对象,产生对象的复制支持

A机:-- 用 repadmin 身份登录 orcl 数据库,创建主复制组 testuser_mg: 

   execute dbms_repcat.create_master_repgroup('testuser_mg'); 

   -- 在复制组 testuser_mg 里加入数据库对象: 

   execute dbms_repcat.create_master_repobject(sname=>'testuser',oname=>'dept', type=>'table',use_existing_object=>true,gname=>'testuser_mg'); 

  参数说明: 

  sname 实现数据库复制的用户名称; 

  oname 实现数据库复制的数据库对象名称; 

  type 实现数据库复制的数据库对象类别; 

  use_existing_object true表示用主复制节点已经存在的数据库对象; 

  gname 主复制组名; 

-- 对数据库对象产生复制支持:   

    execute dbms_repcat.generate_replication_support('testuser','dept','table'); 

  -- 确认复制的组和对象已经加入数据库的数据字典:   

    select gname, master, status from dba_repgroup; 

  select * from dba_repobject; 

8. 创建主复制节点

A机:-- 用 repadmin 身份登录 orcl 数据库,创建主复制节点

    execute dbms_repcat.add_master_database (gname=>'testuser_mg',master=>'orcl.mytest2.com',use_existing_objects=>true, copy_rows=>false, propagation_mode => 'asynchronous'); 

  参数说明: 

  gname 主复制组名; 

  master 加入主复制节点的另一个数据库; 

  use_existing_object true表示用主复制节点已经存在的数据库对象; 

  copy_rows false表示第一次开始复制时不用和主复制节点保持一致; 

  propagation_mode 异步地执行; 

-- 确认复制的任务队列已经加入数据库的数据字典

    select * from user_jobs; 

9. 使同步组的状态由停顿(quiesced )改为正常(normal)

A机:-- 用 repadmin 连接数据库,运行以下命令

     execute dbms_repcat.resume_master_activity('testuser_mg',true); 

   -- 确认同步组的状态为正常(normal)

     select gname, master, status from dba_repgroup; 

10. 创建复制数据库的时间表,10分钟复制一次

A机:-- 用 repadmin 身份登录数据库,运行以下命令   

     begin 

       dbms_defer_sys.schedule_push (   destination => 'orcl.test2.com', 

       interval => 'sysdate + 10/1440', 

       next_date => sysdate); 

   end; 

   /   

     begin 

       dbms_defer_sys.schedule_purge (   next_date => sysdate, 

       interval => 'sysdate + 10/1440', 

       delay_seconds => 0, 

       rollback_segment => ''); 

   end; 

   / 

B机:-- 用 repadmin 身份登录数据库,运行以下命令

   begin 

       dbms_defer_sys.schedule_push (   destination => ' orcl.test1.com ', 

       interval => 'sysdate + 10 / 1440', 

       next_date => sysdate); 

   end; 

     /

   begin 

       dbms_defer_sys.schedule_purge (   next_date => sysdate, 

       interval => 'sysdate + 10/1440', 

       delay_seconds => 0, 

       rollback_segment => ''); 

   end; 

   / 

11. 添加或修改两边数据库的记录,跟踪复制过程

如果你想立刻看到添加或修改后数据库的记录的变化,可以在两边 repadmin 用户下找到 push 的 job_number,然后运行: 

exec dbms_job.run(job_number);

三、异常情况的处理 

1. 检查复制工作正常否,可以在 repadmin 用户下查询user_jobs 

select job,this_date,next_date,what, broken from user_jobs; 

正常的状态有两种: 

任务闲 —— this_date为空,next_date为当前时间后的一个时间值 

任务忙 —— this_date不为空,next_date为当前时间后的一个时间值 

异常状态也有两种: 

任务死锁 —— next_date为当前时间前的一个时间值 

任务死锁 —— next_date为非常大的一个时间值,例如:4001-01-01 

这可能因为网络中断照成的死锁 

解除死锁的办法: 

$ps –ef|grep orale 

找到死锁的刷新快照的进程号ora_snp*,用kill –9 命令删除此进程 

然后进入 repadmin 用户运行命令: 

exec dbms_job.run(job_number); 

说明:job_number 为用 select job,this_date,next_date,what from user_jobs; 命令查出的job编号。 

2. 增加或减少复制组的复制对象 

①、停止主数据库节点的复制动作,使同步组的状态由正常(normal)改为停顿(quiesced ) 

用 repadmin 身份登录数据库,运行以下命令 

execute dbms_repcat.suspend_master_activity (gname => 'testuser_mg'); 

②、在复制组testuser_mg里加入数据库对象,保证数据库对象必须有主关键字。 

execute dbms_repcat.create_master_repobject(sname=>'testuer',oname=>'emp', type=>'table',use_existing_object=>true,gname=>'testuser_mg'); 

对加入的数据库对象产生复制支持 

execute dbms_repcat.generate_replication_support('testuser','emp','table'); 

③、在复制组scott_mg里删除数据库对象。 

execute dbms_repcat.drop_master_repobject ('testuser','dept','table'); 

④、重新使同步组的状态由停顿(quiesced )改为正常(normal)。 

execute dbms_repcat.resume_master_activity('scott_mg',false);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏kl的专栏

spring boot动态调整线上日志级别

日志模块是每个项目中必须的,用来记录程序运行中的相关信息。一般在开发环境下使用DEBUG级别的日志输出,为了方便查看问题,而在线上一般都使用INFO级别的日志,...

4466
来自专栏FreeBuf

Linux内核中的递归漏洞利用

6月1号,我提交了一个linux内核中的任意递归漏洞。如果安装Ubuntu系统时选择了home目录加密的话,该漏洞即可由本地用户触发。如果想了解漏洞利用代码和短...

2305
来自专栏PHP在线

SQL语句执行过程详解

一条sql,plsql的执行到底是怎样执行的呢? 一、SQL语句执行原理: 第一步:客户端把语句发给服务器端执行 当我们在客户端执行 select 语句时,客户...

4346
来自专栏xingoo, 一个梦想做发明家的程序员

Beats数据采集---Packetbeat\Filebeat\Topbeat\WinlogBeat使用指南

Beats是elastic公司的一款轻量级数据采集产品,它包含了几个子产品: packetbeat(用于监控网络流量)、 filebeat(用于监听日志数...

3939
来自专栏阮一峰的网络日志

Systemd 入门教程:实战篇

上一篇文章,我介绍了 Systemd 的主要命令,今天介绍如何使用它完成一些基本的任务。 ? 一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会...

3377
来自专栏大数据

故障分析:数据库一致性关闭缓慢问题诊断

想必我们大家都知道,Shutdown immediate即一致性关闭数据库,数据库下次启动不需要做实例恢复即可open数据库。那么当数据库一致性关闭出现缓慢等状...

1798
来自专栏数据和云

故障分析:数据库一致性关闭缓慢问题诊断

想必我们大家都知道,Shutdown immediate即一致性关闭数据库,数据库下次启动不需要做实例恢复即可open数据库。那么当数据库一致性关闭出现缓慢等状...

2855
来自专栏社区的朋友们

TAF 必修课(三):Server 启动全过程

本节对 Taf-server整个启动流程进行解析,思考多协议支持,开发运营一体化。

8670
来自专栏Java架构沉思录

三分钟构建高性能WebSocket 服务

每当使用SpringBoot进行Weboscket开发时,最容易想到的就是spring-boot-starter-websocket(或spring-webso...

633
来自专栏沈玉琛的专栏

当 MySQL 连接池遇上事务(一):神秘的幽灵锁

MySQL连接池是一个很好的设计,通过将大量短连接转化为少量的长连接,从而提高整个系统的吞吐率。一般各个团队都会对连接池进行封装,只提供简洁的接口供上层使用。但...

1.2K2

扫码关注云+社区