この章では、リモート・マテリアライズド・ビュー・レプリケーション・サイトで、マテリアライズド・ビュー・グループを作成する方法を説明します。
この章には、次の項が含まれます。
マテリアライズド・ビュー環境を構築する前に、マスター・サイトの設定、マスター・グループの作成および目的のマテリアライズド・ビュー・サイトの設定を行います。また、作成したマテリアライズド・ビュー・サイトでのアクティビティによって、マスター・サイトで競合が発生する可能性がある場合は、マテリアライズド・ビュー・グループを作成する前に、マテリアライズド・ビューのマスター表に対して競合解消を設定します。
マテリアライズド・ビュー・サイトを設定して、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つで、マテリアライズド・ビュー・サイトをサポートするには、マテリアライズド・ビューにレプリケートされる各マスター表のマテリアライズド・ビュー・ログを作成する必要があります。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言語リファレンス』のCREATE MATERIALIZED VIEW LOG 文に関する説明を参照してください。 |
マテリアライズド・ビュー・グループを構築する前に、リモート・マテリアライズド・ビュー・サイトにレプリケート・スキーマが存在して、必要なデータベース・リンクが作成されていることを確認します。
この例で、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; / /*
マスター表に基づいてマテリアライズド・ビューを作成します。
マテリアライズド・ビューを作成するときは、必ず、マテリアライズド・ビューに対する問合せの中で表の所有者のスキーマ名を指定します。次の例では、各問合せにおける表の所有者として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つが他のマテリアライズド・ビュー・サイトをサポートするには、他のマテリアライズド・ビュー・サイトにレプリケートされるマテリアライズド・ビューごとにマテリアライズド・ビュー・ログを作成する必要があります。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言語リファレンス』のCREATE MATERIALIZED VIEW LOG 文に関する説明を参照してください。 |
マテリアライズド・ビュー・グループを構築する前に、リモート・マテリアライズド・ビュー・サイトにレプリケート・スキーマが存在して、必要なデータベース・リンクが作成されていることを確認します。
この例で、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; / /*
マスター・マテリアライズド・ビューに基づいてマテリアライズド・ビューを作成します。
他のマテリアライズド・ビューに基づいたマテリアライズド・ビューを作成した場合は必ず、マテリアライズド・ビューの問合せでマテリアライズド・ビュー所有者の名前を指定します。次の例では、各問合せにおけるマテリアライズド・ビューの所有者として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 **********************************/