Oracle Advanced Replication Best Practice

來源:互聯網
上載者:User

一、實驗環境:
vmoel5u4機:IP:192.168.92.100     
      OS:Linux version 2.6.18-164.el5
      DB:Oracle 10g Enterprise Edition Release 10.2.0.1.0;

even機:IP: 192.168.92.200
      OS:Linux version 2.6.18-164.el5
      DB:Oracle 10g Enterprise Edition Release 10.2.0.1.0;

 

二、實驗步驟:

1. 初始化參數設定
vmoel6u4機:db_domain=ORACLE.COM
      global_names=true
      job_queue_processes=10
      open_links=4

even機:db_domain=ORACLE.COM
      global_names=true
      job_queue_processes=10 # 預設值
      open_links=4 # 預設值

 

2. 設定資料庫串連
vmoel5u4資料庫名: PROD
even資料庫名:EMR
兩個個資料庫網域名稱都是: ORACLE.COM
vmoel5u4資料庫sid號:PROD
EVEN資料庫sid號:EMR
Listener連接埠號碼: 1521

 

確認兩個資料庫之間可以互相訪問,在tnsnames.ora裡設定資料庫連接字串。
vmoel5u4機:
EMR=
 (DESCRIPTION=
  (ADDRESS_LIST=
   (ADDRESS=(PROTOCOL=tcp)(HOST=even.oracle.com)(PORT=1521))
   )
  (CONNECT_DATA=
   (SERVICE_NAME=EMR)
   (server=dedicated)
   )
  )
tnsping EMR 測試連通

even機:
PROD =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = vmoel5u4.oracle.com)(port=1521))
    )
    (CONNECT_DATA =
      (service_name = PROD)
      (server = dedicated)
    )
  )
tnsping PROD 測試連通

 

 

3. 用 system 使用者串連資料庫,改資料庫全域名稱,建公用的資料庫連結。
vmoel5u4機:alter database rename global_name to PROD.ORACLE.COM;

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
PROD.ORACLE.COM

even機:alter database rename global_name to EMR.ORACLE.COM;

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
EMR.ORACLE.COM

 

4, PROD 資料庫上

CONNECT SYSTEM/ORACLE@PROD

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;

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

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

CONNECT repadmin/repadmin@PROD

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

CONNECT SYSTEM/ORACLE@PROD

CREATE USER proxy_mviewadmin IDENTIFIED BY proxy_mviewadmin;

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

CREATE USER proxy_refresher IDENTIFIED BY proxy_refresher;

GRANT CREATE SESSION TO proxy_refresher;
GRANT SELECT ANY TABLE TO proxy_refresher;

 

4, EMR資料庫上

CONNECT SYSTEM/ORACLE@EMR

CREATE USER mviewadmin IDENTIFIED BY mviewadmin;

BEGIN
   DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (
      username => 'mviewadmin');
END;
/

GRANT COMMENT ANY TABLE TO mviewadmin;

GRANT LOCK ANY TABLE TO mviewadmin;

CREATE USER propagator IDENTIFIED BY propagator;

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

 

CREATE USER refresher IDENTIFIED BY refresher;

GRANT CREATE SESSION TO refresher;

GRANT ALTER ANY MATERIALIZED VIEW TO refresher;

 

CONNECT SYSTEM/ORACLE@EMR

CREATE PUBLIC DATABASE LINK PROD.ORACLE.COM USING 'PROD';

CONNECT mviewadmin/mviewadmin@EMR;

CREATE DATABASE LINK PROD.ORACLE.COM
  CONNECT TO proxy_mviewadmin IDENTIFIED BY proxy_mviewadmin;

CONNECT propagator/propagator@EMR

CREATE DATABASE LINK PROD.ORACLE.COM
  CONNECT TO repadmin IDENTIFIED BY repadmin;

 

CONNECT mviewadmin/mviewadmin@EMR

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

CONNECT mviewadmin/mviewadmin@EMR

BEGIN
   DBMS_DEFER_SYS.SCHEDULE_PUSH (
      destination => 'PROD.ORACLE.COM',
      interval => 'SYSDATE + 1/1440',
      next_date => SYSDATE,
      stop_on_error => FALSE,
      delay_seconds => 0,
      parallelism => 0);
END;
/

 

5, 在PROD上

CONNECT repadmin/repadmin@PROD

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

BEGIN
   DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
      gname => 'hr_repg',
      type => 'TABLE',
      oname => 'employees',
      sname => 'hr',
      use_existing_object => TRUE,
      copy_rows => FALSE);
END;
/

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

 

SELECT COUNT(*) FROM DBA_REPCATLOG WHERE GNAME = 'HR_REPG';

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

CONNECT hr/hr@PROD

CREATE MATERIALIZED VIEW LOG ON hr.employees;

 

6,在EMR上

CONNECT SYSTEM/ORACLE@EMR

CREATE TABLESPACE demo_mv1
 DATAFILE '/u01/app/oracle/oradata/EMR/demo_mv1.dbf' SIZE 100M AUTOEXTEND ON
 EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

CREATE TEMPORARY TABLESPACE temp_mv1
 TEMPFILE '/u01/app/oracle/oradata/EMR/temp_mv1.dbf' SIZE 50M AUTOEXTEND ON;

CREATE USER hr IDENTIFIED BY hr;

ALTER USER hr DEFAULT TABLESPACE demo_mv1
              QUOTA UNLIMITED ON demo_mv1;

ALTER USER hr TEMPORARY TABLESPACE temp_mv1;

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
 TO hr;

 

CONNECT hr/hr@EMR

CREATE DATABASE LINK PROD.ORACLE.COM
   CONNECT TO proxy_refresher IDENTIFIED BY proxy_refresher;

CONNECT mviewadmin/mviewadmin@EMR

BEGIN
   DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
      gname => 'hr_repg',
      master => 'PROD.ORACLE.COM',
      propagation_mode => 'ASYNCHRONOUS');
END;
/

 

BEGIN
   DBMS_REFRESH.MAKE (
      name => 'mviewadmin.hr_refg',
      list => '',
      next_date => SYSDATE,
      interval => 'SYSDATE + 1/1440',
      implicit_destroy => FALSE,
      rollback_seg => '',
      push_deferred_rpc => TRUE,
      refresh_after_errors => FALSE);
END;
/

CREATE MATERIALIZED VIEW hr.employees_mv1
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE
  AS SELECT * FROM hr.employees@PROD.ORACLE.COM;

BEGIN
   DBMS_REPCAT.CREATE_MVIEW_REPOBJECT (
      gname => 'hr_repg',
      sname => 'hr',
      oname => 'employees_mv1',
      type => 'SNAPSHOT',
      min_communication => TRUE);
END;
/

BEGIN
   DBMS_REFRESH.ADD (
      name => 'mviewadmin.hr_refg',
      list => 'hr.employees_mv1',
      lax => TRUE);
END;
/

 

7,在PROD上

SQL> conn hr/hr
Connected.

SQL> update employees set salary=88888 where employee_id=107;

1 row updated.

SQL> commit;

Commit complete.

SQL> select salary from employees where employee_id=107;

    SALARY
----------
     88888

 

8,在EMR上

 

SQL>  select salary from employees_mv1 where employee_id=107;

    SALARY
----------
     88888

 

從上面可以看出PROD庫上的hr.employees表被更新後,EMR庫的物化視圖employees_mv1 在一分鐘後更新過來了。

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.