ヘッダーをスキップ
Oracle® Databaseアドバンスト・レプリケーション・マネージメントAPIリファレンス
12cリリース1 (12.1)
E52979-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

5 マテリアライズド・ビュー・グループの作成

この章では、リモート・マテリアライズド・ビュー・レプリケーション・サイトで、マテリアライズド・ビュー・グループを作成する方法を説明します。

この章には、次の項が含まれます。

マテリアライズド・ビュー環境を構築する前に、マスター・サイトの設定、マスター・グループの作成および目的のマテリアライズド・ビュー・サイトの設定を行います。また、作成したマテリアライズド・ビュー・サイトでのアクティビティによって、マスター・サイトで競合が発生する可能性がある場合は、マテリアライズド・ビュー・グループを作成する前に、マテリアライズド・ビューのマスター表に対して競合解消を設定します。

マテリアライズド・ビュー・グループ作成の概要

マテリアライズド・ビュー・サイトを設定して、1つ以上のマスター・グループを作成すれば、リモート・マテリアライズド・ビュー・サイトにマテリアライズド・ビュー・グループを作成できます。図5-1では、マテリアライズド・ビュー・グループの作成プロセスを説明しています。


関連項目:

マテリアライズド・ビュー・サイトの設定の詳細は、第2章「レプリケーション・サイトの構成」を参照してください。マスター・グループの作成の詳細は、第3章「マスター・グループの作成」を参照してください。

図5-1 マテリアライズド・ビュー・グループの作成

図5-1の説明が続きます。
「図5-1 マテリアライズド・ビュー・グループの作成」の説明

マテリアライズド・ビュー・グループの作成

この章では、2つのマテリアライズド・ビュー・サイトmv1.example.comおよびmv2.example.comに、2つのマテリアライズド・ビュー・グループを作成するプロセスを説明します。

  • mv1.example.comのマテリアライズド・ビュー・グループは、orc1.example.comマスター・サイトのhr_repgマスター・グループのオブジェクトに基づいています。

  • mv2.example.comのマテリアライズド・ビュー・グループは、mv1.example.comマテリアライズド・ビュー・サイトのhr_repgマテリアライズド・ビュー・グループのオブジェクトに基づいています。

このため、この章の例では複数層マテリアライズド・ビュー環境の作成方法、1つ以上のマテリアライズド・ビューが基にする他のマテリアライズド・ビューをどこにするかを説明します。

次の手順に従って、これら2つのマテリアライズド・ビュー・グループを作成します。


注意:

このドキュメントをオンラインで参照している場合は、次の「BEGINNING OF SCRIPT」の行から「END OF SCRIPT」の行までのテキストをテキスト・エディタにコピーして編集し、使用している環境に適したスクリプトを作成します。

/************************* BEGINNING OF SCRIPT ******************************

mv1.example.comにマテリアライズド・ビュー・グループを作成

次の手順に従って、mv1.example.comマテリアライズド・ビュー・サイトにhr_repgマテリアライズド・ビュー・グループを作成します。このマテリアライズド・ビュー・グループは、orc1.example.comマスター・サイトのhr_repgマスター・グループに基づいています。

手順1   マスター・サイトにマテリアライズド・ビュー・ログを作成します。

マスター・サイトの1つで、マテリアライズド・ビュー・サイトをサポートするには、マテリアライズド・ビューにレプリケートされる各マスター表のマテリアライズド・ビュー・ログを作成する必要があります。orc1.example.commv1.example.comマテリアライズド・ビュー・サイトのターゲット・マスター・サイトであることを図2-1で再確認してください。必要なマテリアライズド・ビュー・ログは、orc1.example.comに作成します。

*/

SET ECHO ON

SPOOL create_mv_group.out

CONNECT hr@orc1.example.com

CREATE MATERIALIZED VIEW LOG ON hr.countries;
CREATE MATERIALIZED VIEW LOG ON hr.departments;
CREATE MATERIALIZED VIEW LOG ON hr.employees;
CREATE MATERIALIZED VIEW LOG ON hr.jobs;
CREATE MATERIALIZED VIEW LOG ON hr.job_history;
CREATE MATERIALIZED VIEW LOG ON hr.locations;
CREATE MATERIALIZED VIEW LOG ON hr.regions;

/*

関連項目:

このSQL文の詳細は、『Oracle Database SQL言語リファレンス』CREATE MATERIALIZED VIEW LOG文に関する説明を参照してください。

手順2   レプリケート・スキーマおよびそのデータベース・リンクが存在しない場合は作成します。

マテリアライズド・ビュー・グループを構築する前に、リモート・マテリアライズド・ビュー・サイトにレプリケート・スキーマが存在して、必要なデータベース・リンクが作成されていることを確認します。

この例で、hrスキーマが存在しない場合は作成します。マテリアライズド・ビュー・サイトにhrスキーマが存在する場合は、必要な権限を付与してこの手順の次のタスクに進みます。

*/

CONNECT system@mv1.example.com

CREATE TABLESPACE demo_mv1
 DATAFILE 'demo_mv1.dbf' SIZE 10M AUTOEXTEND ON
 EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

CREATE TEMPORARY TABLESPACE temp_mv1
 TEMPFILE 'temp_mv1.dbf' SIZE 5M AUTOEXTEND ON;

ACCEPT password PROMPT 'Enter password for user: ' HIDE

CREATE USER hr IDENTIFIED BY &password;

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;

/*


レプリケート・スキーマへのデータベース・リンクが存在しない場合は作成します。

マテリアライズド・ビュー・グループを構築する前に、レプリケーション・スキーマへの必要なデータベース・リンクが存在することを確認します。マテリアライズド・ビューの所有者は、マスター・サイトの設定時に作成したproxy_refresherへのデータベース・リンクが必要です。

*/

CONNECT hr@mv1.example.com

CREATE DATABASE LINK orc1.example.com 
   CONNECT TO proxy_refresher IDENTIFIED BY &password;

/*
手順3   マテリアライズド・ビュー・グループを作成します。

次のプロシージャは、リモート・マテリアライズド・ビュー・サイトのマテリアライズド・ビュー管理者が実行します。

*/

CONNECT mviewadmin@mv1.example.com

/*

gnameパラメータで指定したマスター・グループは、ターゲット・マスター・サイトでレプリケートするマスター・グループの名前と一致する必要があります。

*/

BEGIN
   DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
      gname => 'hr_repg',
      master => 'orc1.example.com',
      propagation_mode => 'ASYNCHRONOUS');
END;
/

/*
手順4   リフレッシュ・グループを作成します。

特定のリフレッシュ・グループに追加されたすべてのマテリアライズド・ビューは、同時にリフレッシュされます。このため、リフレッシュ・グループ内の関連するマテリアライズド・ビュー間では、トランザクション一貫性が保たれます。

*/

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

/*
手順5   オブジェクトをマテリアライズド・ビュー・グループに追加します。

マスター表に基づいてマテリアライズド・ビューを作成します。

マテリアライズド・ビューを作成するときは、必ず、マテリアライズド・ビューに対する問合せの中で表の所有者のスキーマ名を指定します。次の例では、各問合せにおける表の所有者としてhrが指定されています。

*/

CREATE MATERIALIZED VIEW hr.countries_mv1 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.countries@orc1.example.com;

CREATE MATERIALIZED VIEW hr.departments_mv1 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.departments@orc1.example.com;

CREATE MATERIALIZED VIEW hr.employees_mv1 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.employees@orc1.example.com;

CREATE MATERIALIZED VIEW hr.jobs_mv1 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.jobs@orc1.example.com;

CREATE MATERIALIZED VIEW hr.job_history_mv1 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.job_history@orc1.example.com;

CREATE MATERIALIZED VIEW hr.locations_mv1 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.locations@orc1.example.com;

CREATE MATERIALIZED VIEW hr.regions_mv1 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.regions@orc1.example.com;

/*

オブジェクトをマテリアライズド・ビュー・グループに追加します。

*/

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

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

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

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

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

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

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

/*
手順6   オブジェクトをリフレッシュ・グループに追加します。

リフレッシュ・グループに追加するすべてのマテリアライズド・ビュー・グループ・オブジェクトは同時にリフレッシュされるので、関連するマテリアライズド・ビュー間での参照整合性が保たれます。

*/

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

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

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

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

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

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

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

/*

mv2.example.comにマテリアライズド・ビュー・グループを作成

次の手順に従って、mv2.example.comマテリアライズド・ビュー・サイトにhr_repgマテリアライズド・ビュー・グループを作成します。このマテリアライズド・ビュー・グループは、mv1.example.comマテリアライズド・ビュー・サイトのhr_repgマテリアライズド・ビュー・グループに基づいています。

手順1   マスター・マテリアライズド・ビュー・サイトにマテリアライズド・ビュー・ログを作成します。

マスター・マテリアライズド・ビュー・サイトの1つが他のマテリアライズド・ビュー・サイトをサポートするには、他のマテリアライズド・ビュー・サイトにレプリケートされるマテリアライズド・ビューごとにマテリアライズド・ビュー・ログを作成する必要があります。mv1.example.commv2.example.comマテリアライズド・ビュー・サイトのターゲット・マスター内部化ビュー・サイトであることを図2-1で再確認してください。必要なマテリアライズド・ビュー・ログは、mv1.example.comに作成します。

*/

CONNECT hr@mv1.example.com

CREATE MATERIALIZED VIEW LOG ON hr.countries_mv1;
CREATE MATERIALIZED VIEW LOG ON hr.departments_mv1;
CREATE MATERIALIZED VIEW LOG ON hr.employees_mv1;
CREATE MATERIALIZED VIEW LOG ON hr.jobs_mv1;
CREATE MATERIALIZED VIEW LOG ON hr.job_history_mv1;
CREATE MATERIALIZED VIEW LOG ON hr.locations_mv1;
CREATE MATERIALIZED VIEW LOG ON hr.regions_mv1;

/*

関連項目:

このSQL文の詳細は、『Oracle Database SQL言語リファレンス』CREATE MATERIALIZED VIEW LOG文に関する説明を参照してください。

手順2   レプリケート・スキーマおよびそのデータベース・リンクが存在しない場合は作成します。

マテリアライズド・ビュー・グループを構築する前に、リモート・マテリアライズド・ビュー・サイトにレプリケート・スキーマが存在して、必要なデータベース・リンクが作成されていることを確認します。

この例で、hrスキーマが存在しない場合は作成します。マテリアライズド・ビュー・サイトにhrスキーマが存在する場合は、この手順の次のタスクに進みます。

*/

CONNECT system@mv2.example.com
CREATE TABLESPACE demo_mv2
 DATAFILE 'demo_mv2.dbf' SIZE 10M AUTOEXTEND ON
 EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

CREATE TEMPORARY TABLESPACE temp_mv2
 TEMPFILE 'temp_mv2.dbf' SIZE 5M AUTOEXTEND ON;

ACCEPT password PROMPT 'Enter password for user: ' HIDE

CREATE USER hr IDENTIFIED BY &password;

ALTER USER hr DEFAULT TABLESPACE demo_mv2
              QUOTA UNLIMITED ON demo_mv2;

ALTER USER hr TEMPORARY TABLESPACE temp_mv2;

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;

/*

レプリケート・スキーマへのデータベース・リンクが存在しない場合は作成します。

マテリアライズド・ビュー・グループを構築する前に、レプリケーション・スキーマへの必要なデータベース・リンクが存在することを確認します。マテリアライズド・ビューの所有者は、マスター・マテリアライズド・ビュー・サイトの設定時に作成したproxy_refresherへのデータベース・リンクが必要です。

*/

CONNECT hr@mv2.example.com

CREATE DATABASE LINK mv1.example.com 
   CONNECT TO proxy_refresher IDENTIFIED BY &password;

/*

関連項目:

プロキシ・マスター・マテリアライズド・ビュー・サイトのユーザー作成の詳細は、手順6を参照してください。

手順3   マテリアライズド・ビュー・グループを作成します。

次のプロシージャは、リモート・マテリアライズド・ビュー・サイトのマテリアライズド・ビュー管理者が実行します。

*/

CONNECT mviewadmin@mv2.example.com

/*

gnameパラメータで指定したレプリケーション・グループは、ターゲット・マスター・マテリアライズド・ビュー・サイトでレプリケートするレプリケーション・グループの名前と一致する必要があります。

*/

BEGIN
   DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
      gname => 'hr_repg',
      master => 'mv1.example.com',
      propagation_mode => 'ASYNCHRONOUS');
END;
/

/*
手順4   リフレッシュ・グループを作成します。

特定のリフレッシュ・グループに追加されたすべてのマテリアライズド・ビューは、同時にリフレッシュされます。このため、リフレッシュ・グループ内の関連するマテリアライズド・ビュー間では、トランザクション一貫性が保たれます。

*/

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

/*
手順5   オブジェクトをマテリアライズド・ビュー・グループに追加します。

マスター・マテリアライズド・ビューに基づいてマテリアライズド・ビューを作成します。

他のマテリアライズド・ビューに基づいたマテリアライズド・ビューを作成した場合は必ず、マテリアライズド・ビューの問合せでマテリアライズド・ビュー所有者の名前を指定します。次の例では、各問合せにおけるマテリアライズド・ビューの所有者としてhrが指定されています。

*/

CREATE MATERIALIZED VIEW hr.countries_mv2 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.countries_mv1@mv1.example.com;

CREATE MATERIALIZED VIEW hr.departments_mv2 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.departments_mv1@mv1.example.com;

CREATE MATERIALIZED VIEW hr.employees_mv2 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.employees_mv1@mv1.example.com;

CREATE MATERIALIZED VIEW hr.jobs_mv2 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.jobs_mv1@mv1.example.com;

CREATE MATERIALIZED VIEW hr.job_history_mv2 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.job_history_mv1@mv1.example.com;

CREATE MATERIALIZED VIEW hr.locations_mv2 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.locations_mv1@mv1.example.com;

CREATE MATERIALIZED VIEW hr.regions_mv2 
  REFRESH FAST WITH PRIMARY KEY FOR UPDATE 
  AS SELECT * FROM hr.regions_mv1@mv1.example.com;

/*

マテリアライズド・ビューをマテリアライズド・ビュー・グループに追加します。

*/

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

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

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

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

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

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

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

/*
手順6   オブジェクトをリフレッシュ・グループに追加します。

リフレッシュ・グループに追加するすべてのマテリアライズド・ビュー・グループ・オブジェクトは同時にリフレッシュされるので、関連するマテリアライズド・ビュー間での参照整合性が保たれます。

*/

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

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

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

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

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

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

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

SET ECHO OFF

SPOOL OFF

/************************* END OF SCRIPT **********************************/