Oracle高階複製Step by Step

bq_wang發表於2008-12-26
Oracle高階複製Step by Step
實施起因
某專案中遇到內外網資料庫同步的問題,假設電信機房和某機房網路物理隔絕,需要藉助中間伺服器進行資料庫同步,這個中間伺服器既可以是資料庫伺服器也可以是某種中介軟體或者某個程式。
因為兩頭都是Oracle資料庫,所以暫時先考慮使用資料庫同步的機制來進行預研,當然僅僅是預研而已,距離實施還有一定距離,比如暫時只考慮資料庫的單向同步,少量資料的雙向同步採用其他方法進行。另外一個目的是為了簡化預研的難度,比如省略了釋出模板(deployment template)和衝突解決方案(Conflict Resolution)。
    Master site(主站點)           Oracle例項為source
    Materialized view site(中間站點)Oracle例項為mid
Materialized view site Level2(目標站點)Oracle例項為dest
資料流方向為source->mid, mid->dest
    網路連通為source?mid,mid?dest;source<>dest
高階複製中的幾個概念
1) replication object:複製物件,指需要作複製的物件(object),包括表,索引,
儲存過程等等。複製物件的更新遵循事務一致性規則(transactionally consistent
manner)。
2) replication groups:複製組,是複製物件(replication object)的集合稱為group,
oracle 以replication group 的形式來管理複製。一個組可以包含多個模式的object,
一個模式也可以有多個組中的object,但是每個replication object 都只能屬於一個
replication group。
3) replication sites:複製站點,包含兩種型別,主體站點(master sites)和實
體化檢視站點(materialized view sites)。一個site 可以擔任一個replication
group 中的mater site 同時又擔任另外一個replication group 中的materialized
view site,注意必須是另外一個組,而不能是同一個replication group。
4) scheduled links:一個資料庫連結(database link),包含一個由使用者定義的計劃,
來將需要更新的事務推到其它的master sites,當建立scheduled link 的時候,oracle
將在本地任務佇列中建立一個任務。
5) master definition site:主體定義站點,大部分的高階複製配置都需要在一個站
點上作,這個站點就是maserdef site
 
建立replication站點
設定master主站點
SQL> connect system/inxite@source
已連線。
SQL> --在主站點建立複製管理員帳號
SQL> create user repadmin identified by repadmin;
使用者已建立。
SQL> --在主站點給該管理員賦予管理員許可權
SQL> begin
  2    dbms_repcat_admin.grant_admin_any_schema(
  3      username=>'repadmin');
  4  end;
  5  /
PL/SQL 過程已成功完成。
SQL> --授予相應的許可權
SQL> grant comment any table to repadmin;
授權成功。
SQL> grant lock any table to repadmin;
授權成功。
SQL> grant select any dictionary to repadmin;
授權成功。
SQL> --在主站點註冊傳播使用者
SQL> begin
  2    dbms_defer_sys.register_propagator(
  3      username=>'repadmin');
  4  end;
  5  /
PL/SQL 過程已成功完成。
SQL> --在主站點註冊接受使用者
SQL> begin
  2    dbms_repcat_admin.register_user_repgroup(
  3      username=>'repadmin',
  4      privilege_type='receiver',
  5      list_of_gnames=>NULL);
  6  end;
  7  .
PL/SQL 過程已成功完成。
SQL> --設定清除延遲序列的job
SQL> begin
  2    dbms_defer_sys.schedule_purge(
  3      next_date=>sysdate,
  4      interval=>'sysdate+1/24',
  5      delay_seconds=>0);
  6  end;
  7  /
PL/SQL 過程已成功完成。
SQL> --在主站點建立代理物化檢視管理員使用者
SQL> connect system/inxite@source
已連線。
SQL> create user proxy_mviewadmin identified by proxy_mviewadmin;
使用者已建立。
SQL> begin
  2    dbms_repcat_admin.register_user_repgroup(
  3      username=>'proxy_mviewadmin',
  4      privilege_type=>'proxy_snapadmin',
  5      list_of_gnames=>NULL);
  6  end;
  7  /
PL/SQL 過程已成功完成。
SQL> grant select_catalog_role to proxy_mviewadmin;
授權成功。
SQL>--建立代理重新整理使用者
SQL> create user proxy_refresher identified by proxy_refresher;
使用者已建立。
SQL> grant create session to proxy_refresher;
授權成功。
SQL> grant select any table to proxy_refresher;
授權成功。
SQL> spool off

 
設定物化檢視站點
SQL> --Connect as system at materialize view site at mid
SQL> set echo on
SQL> conn system/inxite@mid
已連線。
SQL> --在物化檢視站點(中間站點)建立物化檢視使用者
SQL> --建立物化檢視管理員
SQL> create user mviewadmin identified by mviewadmin;
使用者已建立。
SQL> begin
  2    dbms_repcat_admin.grant_admin_any_schema(
  3      username=>'mviewadmin');
  4  end;
  5  /
PL/SQL 過程已成功完成。
SQL> grant comment any table to mviewadmin;
授權成功。
SQL> grant lock any table to mviewadmin;
授權成功。
SQL> grant select any dictionary to mviewadmin;
授權成功。
SQL> --建立傳播者帳號
SQL> create user propagator identified by propagator;
使用者已建立。
SQL> begin
  2    dbms_defer_sys.register_propagator(
  3      username=>'propagator');
  4  end;
  5  /
PL/SQL 過程已成功完成。
SQL> --建立重新整理帳號
SQL> create user refresher identified by refresher;
使用者已建立。
SQL> grant create session to refresher;
授權成功。
SQL> grant alter any materialized view to refresher;
授權成功。
SQL> --把物化檢視管理員帳號註冊為傳播者
SQL> begin
  2    dbms_repcat_admin.register_user_repgroup(
  3      username=>'mviewadmin',
  4      privilege_type=>'receiver',
  5      list_of_gnames=>NULL);
  6  end;
  7  /
PL/SQL 過程已成功完成。
SQL>--建立公共資料庫連結到master站點(source站點)
SQL> connect system/inxite@mid
已連線。
SQL> create public database link source using 'source';
資料庫連結已建立。
SQL> conn mviewadmin/mviewadmin@mid
已連線。
SQL> create database link source connect to proxy_mviewadmin identified by proxy_mviewadmin;
資料庫連結已建立。
SQL> select * from tab@source;
未選定行
SQL> --create the propagator/receiver database link;
SQL> connect propagator/propagator@mid;
已連線。
SQL> create database link source connect to repadmin identified by repadmin;
資料庫連結已建立。
SQL> --Schedule purge at the mid materialized view site
SQL> conn mviewadmin/mviewadmin@mid
已連線。
SQL> begin
  2    dbms_defer_sys.schedule_purge(
  3      next_date=>sysdate,
  4      interval=>'sysdate+1/24',
  5      delay_seconds=>0,
  6      rollback_segment=>'');
  7  end;
  8  /
PL/SQL 過程已成功完成。
SQL> --Schedule push at the mid materialized view site
SQL> conn mviewadmin/mviewadmin@mid
已連線。
SQL> begin
  2    dbms_defer_sys.schedule_push(
  3      destination=>'source',
  4      interval=>'sysdate+1/24',
  5      next_date=>sysdate,
  6      stop_on_error=>false,
  7      parallelism=>0);
  8  end;
  9  /
PL/SQL 過程已成功完成。
SQL> --create proxy users at the mid materialized view site
SQL> --create proxy materialized view administrator
SQL> connect system/inxite@mid
已連線。
SQL> create user proxy_mviewadmin identified by proxy_mviewadmin;
使用者已建立。
SQL> begin
  2    dbms_repcat_admin.register_user_repgroup(
  3      username=>'proxy_mviewadmin',
  4      privilege_type=>'proxy_snapadmin',
  5      list_of_gnames=>NULL);
  6  end;
  7  /
PL/SQL 過程已成功完成。
SQL> grant select_catalog_role to proxy_mviewadmin;
授權成功。
SQL> --Create the proxy refresher
SQL> create user proxy_refresher identified by proxy_refresher;
使用者已建立。
SQL> grant create session to proxy_refresher;
授權成功。
SQL> grant select any table to proxy_refresher;
授權成功。
SQL> spool off

設定物化檢視站點2
SQL> --connect as system at level 2 materialized view site dest
SQL> connect system/inxite@dest
已連線。
SQL> --create level2 materialized view site users at dest
SQL> create user mviewadmin identified by mviewadmin;
使用者已建立。

SQL> begin
  2    dbms_repcat_admin.grant_admin_any_schema(
  3      username=>'mviewadmin');
  4  end;
  5  /
PL/SQL 過程已成功完成。
SQL> grant select any dictionary to mviewadmin;
授權成功。
SQL> --create the propagator
SQL> create user propagator identified by propagator;
使用者已建立。
SQL> begin
  2    dbms_defer_sys.register_propagator(
  3      username=>'propagator');
  4  end;
  5  /
PL/SQL 過程已成功完成。
SQL> --create the refresher
SQL> create user refresher identified by refresher;
使用者已建立。
SQL> grant create session to refresher;
授權成功。
SQL> grant alter any materialized view to refresher;
授權成功。
SQL> --create database links to master materialized view site
SQL> --create a public database link
SQL> connect system/inxite@dest
已連線。
SQL> create public database link mid using 'mid';
資料庫連結已建立。
SQL> connect mviewadmin/mviewadmin@dest
已連線。
SQL> create database link mid connect to proxy_mviewadmin identified by proxy_mviewadmin;
資料庫連結已建立。
SQL> select * from tab@mid;
未選定行
SQL> --create a propagator/receiver database link
SQL> connect propagator/propagator@dest
已連線。
SQL> create database link mid connect to mviewadmin identified by mviewadmin;
資料庫連結已建立。
SQL> select * from tab@mid;
未選定行
SQL> --Schedule purge at level 2 materialized view site at dest site
SQL> conn mviewadmin/mviewadmin@dest
已連線。
SQL> begin
  2    dbms_defer_sys.schedule_purge(
  3      next_date=>sysdate,
  4      interval=>'sysdate+1/24',
  5      delay_seconds=>0,
  6      rollback_segment=>'');
  7  end;
  8  /
PL/SQL 過程已成功完成。
SQL> --Schedule push at the dest materialized view site
SQL> conn mviewadmin/mviewadmin@dest;
已連線。
SQL> begin
  2    dbms_defer_sys.schedule_push(
  3      destination=>'mid',
  4      interval=>'sysdate+1/24',
  5      next_date=>sysdate,
  6      stop_on_error=>false,
  7      delay_seconds=>0,
  8      parallelism=>0);
  9  end;
 10  /
PL/SQL 過程已成功完成。
SQL> spool off

 
建立主站點組
SQL> connect repadmin/repadmin@source;
已連線。
SQL> --create the test schema at source master site
SQL> --...
SQL> --create the master group
SQL> begin
  2    dbms_repcat.create_master_repgroup(
  3      gname=>'test_repg');
  4  end;
  5  /
PL/SQL 過程已成功完成。
SQL> --add object to master group
SQL>
SQL> BEGIN
  2  DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
  3  gname => 'test_repg',
  4  type => 'TABLE',
  5  name => 'test',
  6  sname => 'test',
  7  use_existing_object => TRUE,
  8  copy_rows => FALSE);
  9  END;
 10  /
PL/SQL 過程已成功完成。
SQL>
SQL> BEGIN
  2  DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
  3  gname => 'test_repg',
  4  type => 'TABLE',
  5  name => 'dept',
  6  sname => 'test',
  7  use_existing_object => TRUE,
  8  copy_rows => FALSE);
  9  END;
 10  /
PL/SQL 過程已成功完成。
SQL> BEGIN
  2  DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
  3  sname => 'test',
  4  name => 'test',
  5  type => 'TABLE',
  6  min_communication => TRUE);
  7  END;
  8  /
PL/SQL 過程已成功完成。
SQL> BEGIN
  2  DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
  3  sname => 'test',
  4  name => 'dept',
  5  type => 'TABLE',
  6  min_communication => TRUE);
  7  END;
  8  /
PL/SQL 過程已成功完成。
SQL> --start replication
SQL> begin
  2    dbms_repcat.resume_master_activity(
  3      gname=>'test_repg');
  4  end;
  5  /
PL/SQL 過程已成功完成。
SQL> spool off

建立物化檢視組
 
SQL> conn test/test@source;
已連線。
SQL> create materialized view log on test.test;
實體化檢視日誌已建立。
SQL> create materialized view log on test.dept;
實體化檢視日誌已建立。
SQL> CONN system/inxite@mid;
已連線。
SQL> CREATE SMALLFILE TABLESPACE "test"
  2  DATAFILE 'E:\OracleDB\DBFILE01.DB' SIZE 200M AUTOEXTEND ON NEXT 200M MAXSIZE 8000M
  3  LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
表空間已建立。
SQL> CREATE USER "TEST" PROFILE "DEFAULT" IDENTIFIED BY "test" DEFAULT TABLESPACE "test" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK;
使用者已建立。
SQL> GRANT "CONNECT" TO "TEST";
授權成功。
SQL> GRANT "DBA" TO "TEST";
授權成功。
SQL> GRANT "DELETE_CATALOG_ROLE" TO "TEST";
授權成功。
SQL> GRANT "EXECUTE_CATALOG_ROLE" TO "TEST";
授權成功。
SQL> GRANT "EXP_FULL_DATABASE" TO "TEST";
授權成功。
SQL> GRANT "GATHER_SYSTEM_STATISTICS" TO "TEST";
授權成功。
SQL> GRANT "IMP_FULL_DATABASE" TO "TEST";
授權成功。
SQL> GRANT "RESOURCE" TO "TEST";
授權成功。
SQL> GRANT "SCHEDULER_ADMIN" TO "TEST";
授權成功。
SQL> GRANT "SELECT_CATALOG_ROLE" TO "TEST";
授權成功。
SQL> GRANT CREATE PROCEDURE TO TEST;
授權成功。
SQL> GRANT CREATE SEQUENCE TO TEST;
授權成功。
SQL> GRANT CREATE VIEW TO TEST;
授權成功。
SQL> GRANT CREATE SYNONYM TO TEST;
授權成功。
SQL> GRANT ALTER SESSION TO TEST;
授權成功。
SQL> GRANT CREATE MATERIALIZED VIEW TO TEST;
授權成功。
SQL> GRANT ALTER ANY MATERIALIZED VIEW TO TEST;
授權成功。
SQL> GRANT CREATE DATABASE LINK TO TEST;
授權成功。
SQL> grant create session to test;
授權成功。
SQL> grant create table to test;
授權成功。
SQL> conn system/inxite@dest
已連線。
SQL> CREATE SMALLFILE TABLESPACE "test"
  2  DATAFILE 'E:\OracleDB\DBFILE01.DB' SIZE 200M AUTOEXTEND ON NEXT 200M MAXSIZE 8000M
  3  LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
表空間已建立。
SQL> CREATE USER "TEST" PROFILE "DEFAULT" IDENTIFIED BY "test" DEFAULT TABLESPACE "test" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK;
使用者已建立。
SQL> GRANT "CONNECT" TO "TEST";
授權成功。
SQL> GRANT "DBA" TO "TEST";
授權成功。
SQL> GRANT "DELETE_CATALOG_ROLE" TO "TEST";
授權成功。
SQL> GRANT "EXECUTE_CATALOG_ROLE" TO "TEST";
授權成功。
SQL> GRANT "EXP_FULL_DATABASE" TO "TEST";
授權成功。
SQL> GRANT "GATHER_SYSTEM_STATISTICS" TO "TEST";
授權成功。
SQL> GRANT "IMP_FULL_DATABASE" TO "TEST";
授權成功。
SQL> GRANT "RESOURCE" TO "TEST";
授權成功。
SQL> GRANT "SCHEDULER_ADMIN" TO "TEST";
授權成功。
SQL> GRANT "SELECT_CATALOG_ROLE" TO "TEST";
授權成功。
SQL> GRANT CREATE SESSION TO TEST;
授權成功。
SQL> GRANT CREATE TABLE TO TEST;
授權成功。
SQL> GRANT CREATE PROCEDURE TO TEST;
授權成功。
SQL> GRANT CREATE SEQUENCE TO TEST;
授權成功。
SQL> GRANT CREATE VIEW TO TEST;
授權成功。
SQL> GRANT CREATE SYNONYM TO TEST;
授權成功。
SQL> GRANT ALTER SESSION TO TEST;
授權成功。
SQL> GRANT CREATE MATERIALIZED VIEW TO TEST;
授權成功。
SQL> GRANT ALTER ANY MATERIALIZED VIEW TO TEST;
授權成功。
SQL> GRANT CREATE DATABASE LINK TO TEST;
授權成功。
SQL> connect test/test@mid;
已連線。
SQL> create database link source connect to proxy_refresher identified by proxy_refresher;
資料庫連結已建立。
SQL> select * from tab@source;
未選定行
SQL> --create the materialized view group
SQL> connect mviewadmin/mviewadmin@mid;
已連線。
SQL> begin
  2    dbms_repcat.create_mview_repgroup(
  3      gname=>'test_repg',
  4      master=>'source',
  5      propagation_mode=>'ASYNCHRONOUS');
  6  end;
  7  /
PL/SQL 過程已成功完成。
SQL> --create the refresh group
SQL> begin
  2    dbms_refresh.make(
  3      name=>'mviewadmin.test_repg',
  4      list=>'',
  5      next_date=>sysdate,
  6      interval=>'sysdate+1/24',
  7      implicit_destroy=>false,
  8      rollback_seg=>'',
  9      push_deferred_rpc=>true,
 10      refresh_after_errors=>false);
 11  end;
 12  /

PL/SQL 過程已成功完成。

SQL> --add object to the materialized view group
SQL> create materialized view test.test_mv1
  2  refresh fast with primary key for update
  3  as select * from test.test@source;
實體化檢視已建立。
SQL> create materialized view test.dept_mv1
  2  refresh fast with primary key for update
  3  as select * from test.dept@source;
實體化檢視已建立。
SQL> select * from test.dept_mv1;
ID         Name
---------------------------
1         market
2          finacial
SQL> begin
  2    dbms_repcat.create_mview_repobject(
  3      gname=>'test_repg',
  4      sname=>'test',
  5      name=>'test_mv1',
  6      type=>'SNAPSHOT',
  7      min_communication=>true
  8  );
  9  end;
 10  /
PL/SQL 過程已成功完成。
SQL> begin
  2    dbms_repcat.create_mview_repobject(
  3      gname=>'test_repg',
  4      sname=>'test',
  5      name=>'dept_mv1',
  6      type=>'SNAPSHOT',
  7      min_communication=>true);
  8  end;
  9  /
PL/SQL 過程已成功完成。
SQL> --add objects to the refresh group
SQL> BEGIN
  2  DBMS_REFRESH.MAKE (
  3  name => 'mviewadmin.test_refg',
  4  list => '',
  5  next_date => SYSDATE,
  6  interval => 'SYSDATE + 1/24',
  7  implicit_destroy => FALSE,
  8  rollback_seg => '',
  9  push_deferred_rpc => TRUE,
 10  refresh_after_errors => FALSE);
 11  END;
 12  /
PL/SQL 過程已成功完成。
SQL> BEGIN
  2  DBMS_REFRESH.ADD (
  3  name => 'mviewadmin.test_refg',
  4  list => 'test.test_mv1',
  5  lax => TRUE);
  6  END;
  7  /
PL/SQL 過程已成功完成。
SQL> BEGIN
  2  DBMS_REFRESH.ADD (
  3  name => 'mviewadmin.test_refg',
  4  list => 'test.dept_mv1',
  5  lax => TRUE);
  6  END;
  7  /
PL/SQL 過程已成功完成。
SQL> --create materilized view logs at the master materialized view site
SQL> connect test/test@mid;
已連線。
SQL> create materialized view log on test.test_mv1;
實體化檢視日誌已建立。
SQL> create materialized view log on test.dept_mv1;
實體化檢視日誌已建立。
SQL> connect test/test@dest;
已連線。
SQL> create database link mid connect to proxy_refresher identified by proxy_refresher;
資料庫連結已建立。
SQL> select * from tab@mid;
未選定行
SQL> --create the materialized view group
SQL> connect mviewadmin/mviewadmin@dest;
已連線。
SQL> begin
  2    dbms_repcat.create_mview_repgroup(
  3      gname=>'test_repg',
  4      master=>'mid',
  5      propagation_mode=>'ASYNCHRONOUS');
  6  end;
  7  /
PL/SQL 過程已成功完成。
SQL> --create the refresh group
SQL> BEGIN
  2  DBMS_REFRESH.MAKE (
  3  name => 'mviewadmin.test_refg',
  4  list => '',
  5  next_date => SYSDATE,
  6  interval => 'SYSDATE + 1/24',
  7  implicit_destroy => FALSE,
  8  rollback_seg => '',
  9  push_deferred_rpc => TRUE,
 10  refresh_after_errors => FALSE);
 11  end;
 12  /
PL/SQL 過程已成功完成。
SQL> --add objects to the materialized view group
SQL> create materialized view test.test_mv2
  2  refresh fast with primary key for update
  3  as select * from test.test_mv1@mid;
實體化檢視已建立。
SQL> create materialized view test.dept_mv2
  2  refresh fast with primary key for update
  3  as select * from test.dept_mv1@mid;
實體化檢視已建立。
SQL> --add the materialized view to the materialized view group
SQL> begin
  2    dbms_repcat.create_mview_repobject(
  3      gname=>'test_repg',
  4      sname=>'test',
  5      name=>'test_mv2',
  6      type=>'SNAPSHOT',
  7      min_communication=>true);
  8  end;
  9  /
PL/SQL 過程已成功完成。
SQL>
SQL> begin
  2    dbms_repcat.create_mview_repobject(
  3      gname=>'test_repg',
  4      sname=>'test',
  5      name=>'dept_mv2',
  6      type=>'SNAPSHOT',
  7      min_communication=>true);
  8  end;
  9  /
PL/SQL 過程已成功完成。
SQL> --add objects to the refresh group
SQL> begin
  2    dbms_refresh.add(
  3      name=>'mviewadmin.test_refg',
  4      list=>'test.test_mv2',
  5      lax=>true);
  6  end;
  7  /
PL/SQL 過程已成功完成。
SQL> begin
  2    dbms_refresh.add(
  3      name=>'mviewadmin.test_refg',
  4      list=>'test.dept_mv2',
  5      lax=>true);
  6  end;
  7  /
PL/SQL 過程已成功完成。
SQL> spool off


參考文件:
Oracle?? Database Advanced Replication 10g Release 2 (10.2)
Oracle?? Database Advanced Replication Management API Reference 10g Release 2 (10.2)
關於Advanced Replication 的初步研究

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-522796/,如需轉載,請註明出處,否則將追究法律責任。

相關文章