Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1148870
  • 博文数量: 231
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 2662
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-03 16:35
个人简介

学无止境

文章分类

全部博文(231)

文章存档

2014年(7)

2013年(103)

2011年(11)

2010年(53)

2009年(57)

分类: Oracle

2013-10-11 14:30:25

配置和管理master复制。
高级复制可以是多主站点复制,或是物化视图站点复制,物化视图站点复制需要基于一个主站点。
 
配置高级复制环境,除了需要数据库版本支持高级复制外需要设置参数GLOBAL_NAMES为TRUE。
GLOBAL_NAMES指定了DBLINK是否要求和被连接的数据库具有相同的名称。
如果GLOBAL_NAMES为false,则不执行检查。如果使用或计划使用分布式处理,Oracle建议设置该参数为true,确保在同一个网络环境中连接和数据库名的命名一致。
数据的global_name具有域名,相同域名之间才能进行复制。
其他还需要设置一些相关参数,如job_processes等,满足需求。
 
多主站点复制配置。这里配置简单的情况,2个master站点相互复制。
 
1.数据库环境检查及设置
 
SQL> select value from v$option where parameter='Advanced replication';
VALUE
----------------------------------------------------------------
TRUE
 
SQL> alter system set global_names = true;
SQL> alter system set job_queue_processes = 10;
SQL> alter database rename global_name to ora10g.com;
SQL> select * from global_name;
GLOBAL_NAME
---------------------------------
ORA10G.COM
 
另一个数据库设置为ora10g48.com
SQL> select * from global_name;
 
GLOBAL_NAME
--------------------------------------------------------------------------------
ORA10G48.COM
 
 
以下步骤先在ora10g.com上执行:
 
2.创建一个复制管理员账号
conn system/oracle@ora10g
CREATE USER repadmin IDENTIFIED BY repadmin;
 
3.给复制管理员账号分配权限
执行GRANT_ADMIN_ANY_SCHEMA存储过程,分配创建和管理复制环境的权限。
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;

4.注册传播器,传播器负责传播延迟事务队列到其他master站点上。
BEGIN
   DBMS_DEFER_SYS.REGISTER_PROPAGATOR (
      username => 'repadmin');
END;
/
 
5.注册接收器,接收器用来接收其他master站点传播的延迟事务队列。
BEGIN
   DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
      username => 'repadmin',
      privilege_type => 'receiver',
      list_of_gnames => NULL);
END;
/
 

6.在master站点上设置调度purge。
为了保持延迟事务队列的大小,便于check。需要purge成功完成的延迟事务。
SCHEDULE_PURGE存储过程自动地purge,执行该存储过程必须使用复制管理账号。
 
CONNECT repadmin/repadmin@ora10g

BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
      interval => 'SYSDATE + 1/24',
      delay_seconds => 0);
END;
/

以上相同类似的步骤在ora10g48的数据库上也执行一遍。
 
以下步骤完成在各master站点之间的调度连接创建。
 
1.在master站点之间创建dblink

DBLINK提供了分布式机制,允许不同站点之间复制数据。在创建私有dblink之前,必须先创建用于每个私有dblink的公有dblink。私有dblink要创建在复制管理员账号下。
 
CONNECT system/oracle@ora10g
CREATE PUBLIC DATABASE LINK ora10g48.com USING 'ora10g48';
 
CONNECT repadmin/repadmin@ora10g
CREATE DATABASE LINK ora10g48.com CONNECT TO repadmin IDENTIFIED BY repadmin;
 
CONNECT system/oracle@ora10g48
CREATE PUBLIC DATABASE LINK ora10g.com USING 'ora10g';
 
CONNECT repadmin/repadmin@ora10g48
CREATE DATABASE LINK ora10g.com CONNECT TO repadmin IDENTIFIED BY repadmin;
 
2.定义每个dblink的调度,创建调度连接

使用SCHEDULE_PUSH存储过程定义调度连接。该调度连接决定了多长时间传播延迟事务队列到其他master站点。需要为第一步中建立的每一个dblink都执行一次SCHEDULE_PUSH过程。
 
CONNECT repadmin/repadmin@ora10g
BEGIN
   DBMS_DEFER_SYS.SCHEDULE_PUSH (
      destination => 'ora10g48.com',
      interval => 'SYSDATE + (1/144)',
      next_date => SYSDATE,
      parallelism => 1,
      execution_seconds => 1500,
      delay_seconds => 1200);
END;
/
 
CONNECT repadmin/repadmin@ora10g48
BEGIN
   DBMS_DEFER_SYS.SCHEDULE_PUSH (
      destination => 'ora10g.com',
      interval => 'SYSDATE + (1/144)',
      next_date => SYSDATE,
      parallelism => 1,
      execution_seconds => 1500,
      delay_seconds => 1200);
END;
/
 
设置master站点之后,准备建立master组,按以下照顺序成功建立复制环境。
 
以下步骤创建了一个ldy_repg的master组。
在ora10g.com上使用复制管理员用户登录:
CONNECT repadmin/repadmin@ora10g
 
1.准备需要复制的对象
复制表:
ldy.ar_tab
包含索引:
pk_ar_tab1(主键索引)
idx_ar_objname
 
所有站点上都已经具有了相同的复制表和数据。
 
在准备复制表的时候,遭遇到一个问题。使用CTAS方法从dba_objects建立的表,在之后添加对象时,始终会报"ORA-23318: 出现 ddl 故障"的错误
create table ar_tab1 as select * from dba_objects;
如果是已经建好一张表,通过这张表再去用CTAS的方法建立的表,添加时没有问题。
create table ar_tab1 as select * from ar_tab2;
 
平台是win7,10.2.0.5,不知道是否遭遇了bug。
 
2.创建master组
BEGIN
   DBMS_REPCAT.CREATE_MASTER_REPGROUP (
      gname => 'ldy_repg');
END;
/
 
3.添加对象到master组
添加之前,先确认复制组的状态是QUIESCED
SQL> select gname, master, status from dba_repgroup;
 
GNAME                          M STATUS
------------------------------ - ---------
LDY_REPG                       Y QUIESCED
 
如果不是,可以使用命令将组挂起
SQL> execute dbms_repcat.suspend_master_activity (gname => 'ldy_repg');

使用CREATE_MASTER_REPOBJECT存储过程增加对象到前面建立的master组中。在大多数情况下,通常增加表和索引到master组中,也可以添加存储过程、视图、同义词等。
添加表:
BEGIN
   DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
      gname => 'ldy_repg',
      type => 'TABLE',
      oname => 'ar_tab1',
      sname => 'ldy',
      use_existing_object => TRUE,
      copy_rows => FALSE
      );
END;
/
添加索引:
BEGIN
   DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
      gname => 'ldy_repg',
      type => 'INDEX',
      oname => 'pk_ar_tab1',
      sname => 'ldy',
      use_existing_object => TRUE,
      copy_rows => FALSE);
END;
/
 
BEGIN
   DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
      gname => 'ldy_repg',
      type => 'INDEX',
      oname => 'idx_ar_objname',
      sname => 'ldy',
      use_existing_object => TRUE,
      copy_rows => FALSE);
END;
/
 
添加之后可以查看dba_repobject视图,检查已添加的对象。
select * from dba_repobject;
 
如果需要删除对象用以下命令:
begin
DBMS_REPCAT.drop_master_repobject(
type => 'TABLE',
oname => 'ar_tab1',
sname => 'ldy'
);
end;
/
 
4.添加其他站点数据库
在master定义站点(创建master组的站点默认为master定义站点)上定义了master组之后,需要定义其他站点,参与到这个复制环境中。
BEGIN
   DBMS_REPCAT.ADD_MASTER_DATABASE (
      gname => 'ldy_repg',
      master => 'ora10g48.com',
      use_existing_objects => TRUE,
      copy_rows => FALSE,
      propagation_mode => 'ASYNCHRONOUS');
END;
/
 
添加之后可以在dba_repsites
select * from dba_repsites;
 
5.产生复制支持
BEGIN
    DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
      sname => 'ldy',
      oname => 'ar_tab1',
      type => 'TABLE',
      min_communication => TRUE);
END;
/
 
产生复制支持后,必须等待DBA_REPCATLOG视图为空时,才可以重新启用master。
SELECT COUNT(*) FROM DBA_REPCATLOG WHERE GNAME = 'LDY_REPG';
 
6.激活复制组,开始复制
SQL> execute dbms_repcat.resume_master_activity('ldy_repg',true);
SQL> select gname, master, status from dba_repgroup;
 
GNAME                          M STATUS
------------------------------ - ---------
LDY_REPG                       Y NORMAL
 
至此master复制配置完成。

阅读(962) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~