この章では、リモート・マテリアライズド・ビュー・レプリケーション・サイトで、マテリアライズド・ビュー・グループを作成する方法を説明します。
この章では、次の項目を説明します。
マテリアライズド・ビュー環境を構築する前に、マスター・サイトの設定、マスター・グループの作成および目的のマテリアライズド・ビュー・サイトの設定を行います。また、作成したマテリアライズド・ビュー・サイトでのアクティビティによって、マスター・サイトで競合が発生する可能性がある場合は、マテリアライズド・ビュー・グループを作成する前に、マテリアライズド・ビューのマスター表に対して競合解消を設定します。
マテリアライズド・ビュー・サイトを設定して、1つ以上のマスター・グループを作成すれば、リモート・マテリアライズド・ビュー・サイトにマテリアライズド・ビュー・グループを作成できます。図5-1では、マテリアライズド・ビュー・グループの作成プロセスを説明しています。
|
関連項目: マテリアライズド・ビュー・サイトの設定の詳細は、第2章「レプリケーション・サイトの構成」を参照してください。マスター・グループの作成の詳細は、第3章「マスター・グループの作成」を参照してください。 |
この章では、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マテリアライズド・ビュー・サイトにhr_repgマテリアライズド・ビュー・グループを作成します。 このマテリアライズド・ビュー・グループは、orc1.example.comマスター・サイトのhr_repgマスター・グループに基づいています。
手順1 マスター・サイトにマテリアライズド・ビュー・ログを作成します。
マスター・サイトの1つで、マテリアライズド・ビュー・サイトをサポートするには、マテリアライズド・ビューにレプリケートされる各マスター表のマテリアライズド・ビュー・ログを作成する必要があります。 orc1.example.comがmv1.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言語リファレンス』の |
手順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; /*
次のプロシージャは、リモート・マテリアライズド・ビュー・サイトのマテリアライズド・ビュー管理者が実行します。
*/ CONNECT mviewadmin@mv1.example.com /*
gnameパラメータで指定したマスター・グループは、ターゲット・マスター・サイトでレプリケートするマスター・グループの名前と一致する必要があります。
*/ BEGIN DBMS_REPCAT.CREATE_MVIEW_REPGROUP ( gname => 'hr_repg', master => 'orc1.example.com', propagation_mode => 'ASYNCHRONOUS'); END; / /*
特定のリフレッシュ・グループに追加されたすべてのマテリアライズド・ビューは、同時にリフレッシュされます。このため、リフレッシュ・グループ内の関連するマテリアライズド・ビュー間では、トランザクション一貫性が保たれます。
*/ 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; / /*
リフレッシュ・グループに追加するすべてのマテリアライズド・ビュー・グループ・オブジェクトは同時にリフレッシュされるので、関連するマテリアライズド・ビュー間での参照整合性が保たれます。
*/ 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マテリアライズド・ビュー・サイトにhr_repgマテリアライズド・ビュー・グループを作成します。 このマテリアライズド・ビュー・グループは、mv1.example.comマテリアライズド・ビュー・サイトのhr_repgマテリアライズド・ビュー・グループに基づいています。
手順1 マスター・マテリアライズド・ビュー・サイトにマテリアライズド・ビュー・ログを作成します。
マスター・マテリアライズド・ビュー・サイトの1つが他のマテリアライズド・ビュー・サイトをサポートするには、他のマテリアライズド・ビュー・サイトにレプリケートされるマテリアライズド・ビューごとにマテリアライズド・ビュー・ログを作成する必要があります。 mv1.example.comがmv2.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言語リファレンス』の |
手順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; /*
次のプロシージャは、リモート・マテリアライズド・ビュー・サイトのマテリアライズド・ビュー管理者が実行します。
*/ CONNECT mviewadmin@mv2.example.com /*
gnameパラメータで指定したレプリケーション・グループは、ターゲット・マスター・マテリアライズド・ビュー・サイトでレプリケートするレプリケーション・グループの名前と一致する必要があります。
*/ BEGIN DBMS_REPCAT.CREATE_MVIEW_REPGROUP ( gname => 'hr_repg', master => 'mv1.example.com', propagation_mode => 'ASYNCHRONOUS'); END; / /*
特定のリフレッシュ・グループに追加されたすべてのマテリアライズド・ビューは、同時にリフレッシュされます。このため、リフレッシュ・グループ内の関連するマテリアライズド・ビュー間では、トランザクション一貫性が保たれます。
*/ 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; / /*
リフレッシュ・グループに追加するすべてのマテリアライズド・ビュー・グループ・オブジェクトは同時にリフレッシュされるので、関連するマテリアライズド・ビュー間での参照整合性が保たれます。
*/ 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 **********************************/