oracle高级复制配置手记

来源:互联网 发布:手机淘宝10.0 编辑:程序博客网 时间:2024/05/01 03:35
一、准备工作

1.1 检查初始化参数

确认gloal_names是否为true,job_queue_process大于0。分别在主站点和物化视图站点执行下面两条sqlplus 命令,检查数据库初始化参数是否符合要求。

show parameter global_names
show parameter job

如果初始化参数设置的不满足要求,可以通过下列语句动态修改。

alter system set global_names = true;
alter system set job_queue_processes = 20;

1.2 检查全局数据库名称

两个数据库的db_domain 名称应该相同,只有db_name 不同。通过下列语句检查主站点和物化视图站点的全局数据库名:

select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM

如果全局数据库名设置不符合规范,可以通过如下语句动态修改。

alter database rename global_name to  RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM;     (主站点)
alter database rename global_name to  TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM;      (物化视图站点)

1.3 修改tnsnames.ora 文件

主站点和物化视图站点的tnsnames.ora参数文件中都添加下列内容,注意需要按照实际情况修改HOST的ip地址,以及SERVICE_NAME的值,PORT一般都默认为1521。

RANDY =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 19.168.0.66)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = randy)
    )
  )

TEST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 19.168.0.68)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = test)
    )
  )

二、主体站点配置

2.1 建立复制管理用户并授权

以sys或者system用户登陆到主体站点
conn sys/test as sysdba;

--建立复制管理员,在实际应用中,需要修改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;

2.2 注册传播者

这里使用了管理用户repadmin,也可以分别建立用户。

BEGIN
  DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'repadmin');
END;
/

2.3 注册接收者

这里使用了管理用户repadmin,也可以分别建立用户。

BEGIN
  DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
                    username => 'repadmin',
                    privilege_type => 'receiver',
                    list_of_gnames => NULL);
END;
/

2.4 建立物化视图站点复制管理员的代理用户

--出于简单考虑,这里也使用repadmin 用户
BEGIN
  DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
                    username => 'repadmin',
                    privilege_type => 'proxy_snapadmin',
                    list_of_gnames => NULL);
END;
/

--授权
--对于repadmin 而言,不需要create session 权限
--但是这里如果新建用户的话,create session 权限则是必须的
GRANT CREATE SESSION TO repadmin;
GRANT SELECT ANY TABLE TO repadmin;

2.5 设置清除延迟序列的job

--以复制管理员身份登陆到主站点
CONNECT repadmin/repadmin;

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

2.6 对复制用户授权

conn sys/test as sysdba

create user rbt
identified by rbt
default tablespace users
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,select any dictionary
TO rbt;


2.7 建立复制测试表

conn sys/test as sysdba

create table rbt.jobs
as
select * from hr.jobs;

alter table rbt.jobs
add constraint pk_jobs primary key(job_id);

2.8 在主体站点上建立主体组,将复制对象增加到复制组中

conn repadmin/repadmin

BEGIN
  DBMS_REPCAT.CREATE_MASTER_REPGROUP (
              gname => 'RBTSYN');
END;
/
Commit;

BEGIN
  DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
              gname => 'RBTSYN',
              type => 'TABLE',
              oname => 'JOBS',
              sname => 'RBT',
              use_existing_object => TRUE,
              copy_rows => FALSE);
END;
/

BEGIN
  DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
              gname => 'RBTSYN',
              type => 'INDEX',
              oname => 'PK_JOBS',
              sname => 'rbt',
              use_existing_object => TRUE,
              copy_rows => FALSE);
END;
/

--添加的时候如果一次没有成功,再次添加可能会报ORA-23308或ORA-23309的错误
--使用DBMS_REPCAT.DROP_MASTER_REPOBJECT删除对象后重新添加

2.9 在主体站点上生成复制支持

BEGIN
  DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
              sname => 'RBT',
              oname => 'JOBS',
              type => 'TABLE',
              min_communication => TRUE);
END;
/

2.10 在主体站点上开始复制

BEGIN
  DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
              gname =>'RBTSYN');
END;
/

2.11 主体站点上面建立物化视图日志表

conn rbt/rbt

create materialized view log on jobs;


3. 物化视图站点配置

--连接到物化视图站点
conn sys/test as sysdba;

3.1 建立物化视图管理员并授权

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;

3.2 注册传播者,并授权

--这里使用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;

3.3 注册接收者,并授权

--注册接受者
BEGIN
  DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
                    username => 'mvadmin',
                    privilege_type => 'receiver',
                    list_of_gnames => NULL);
END;
/                         

3.4 建立到主站点公用的数据库链接

--通过sys用户,建立公用的数据库链接,注意在正式使用的时候,需要按照需要修改数据--库链接的名字和主站点上面的别名
CREATE PUBLIC DATABASE LINK RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM USING 'randy';

3.5 从物化视图站点建立到主站点上代理物化视图管理员的数据库链

conn mvadmin/mvadmin

create database link RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM
connect to repadmin identified by repadmin;

3.6 在物化视图站点设置清除延迟序列的job

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

3.7 在物化视图站点上设置将修改推入到主站点的job

BEGIN
  DBMS_DEFER_SYS.SCHEDULE_PUSH (
                 destination => 'RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM',
                 interval => 'sysdate + 10/(60*60*24)',
                 next_date => SYSDATE,
                 stop_on_error => FALSE,
                 delay_seconds => 0,
                 parallelism => 0);
END;
/

3.8 建立复制用户并对其授权

create user rbt identified by rbt;
alter user rbt 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,select any dictionary
TO rbt;

3.9 在目标站点上面建立复制用户到主站点代理刷新者的数据库链

conn rbt/rbt

CREATE DATABASE LINK RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM
CONNECT TO repadmin IDENTIFIED BY repadmin;

3.10 在物化视图管理帐号上建立物化视图组

--以物化视图管理员身份登陆物化视图站点
CONNECT mvadmin/mvadmin

--物化视图组必须和复制站点上的复制组名称相同
BEGIN
  DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
              gname => 'RBTSYN',
              master => 'RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM',
              propagation_mode => 'ASYNCHRONOUS');
END;
/

--创建刷新组,从物化视图上面刷新数据到本地表
--对于只包含只读物化视图的站点,不需要此步骤
BEGIN
  DBMS_REFRESH.MAKE (
               name => 'mvadmin.rbt_refresh',
               list => '',
               next_date => SYSDATE,
               interval => 'sysdate + 10/(60*60*24)',
               implicit_destroy => FALSE,
               rollback_seg => '',
               push_deferred_rpc => TRUE,
               refresh_after_errors => FALSE);
END;
/

--创建物化视图

create table rbt.jobs
as
select * FROM rbt.jobs@RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM
where 1=2;

CREATE MATERIALIZED VIEW RBT.JOBS
ON PREBUILT TABLE
REFRESH FAST
NEXT sysdate + 5/1440
AS
SELECT * FROM rbt.jobs@RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM;

BEGIN
   DBMS_REFRESH.ADD(
     name => '"MVADMIN"."RBT_REFRESH"',
     list => '"RBT"."JOBS"',
     lax => TRUE);
END;

--将物化视图添加到刷新组
BEGIN
   DBMS_REFRESH.ADD(
     name => '"MVADMIN"."RBT_REFRESH"',
     list => '"RBT"."JOBS"',
     lax => TRUE);
END;

--将物化视图添加到物化视图组
--对于只读物化视图,此步骤可以省略
BEGIN
   DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT(
      gname => '"RBTSYN"',
      sname => '"RBT"',
      oname => '"JOBS"',
      type => 'SNAPSHOT',
      min_communication => FALSE);
END;

BEGIN
   DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT(
      gname => '"RBTSYN"',
      sname => '"RBT"',
      oname => '"PK_JOBS"',
      type => 'INDEX');
END;


--至此,物化视图的配置就全部完成了。


四、生成测试数据,并验证配置

--在主站点执行数据修改
begin
  for i in 1..20
  loop
    insert into jobs values(i,i,i,i);
  end loop;
  commit;
end;
/

--在复制站点验证结果

conn rbt/rbt

select * from jobs;

JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
1          1                                            1          1
10         10                                          10         10
......
19         19                                          19         19
20         20                                          20         20

5 注意事项

5.1 复制对象的限制

序列不能复制;
主键索引和其他索引,均需要添加到复制对象里面,不能自动复制;
ddl语句,不会自动复制。

5.2 如何使用序列同步

只能对所有的序列,建立一个job,扫描对应表的最大id值,并定时执行,或者在需要使用的时候,手工执行序列同步job。


本文参照网上的一篇文章《oracle物化视图配置指导书》,因为作者没有留下姓名,只有表示精神上的感谢了。

原创粉丝点击