oracle高級複製配置手記

一、準備工作

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 [email protected]
where 1=2;

CREATE MATERIALIZED VIEW RBT.JOBS
ON PREBUILT TABLE
REFRESH FAST
NEXT sysdate + 5/1440
AS
SELECT * FROM [email protected];

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物化視圖配置指導書》,因爲作者沒有留下姓名,只有表示精神上的感謝了。

發佈了52 篇原創文章 · 獲贊 2 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章