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

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);

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics