この章では、マスター・レプリケーション・サイトでマスター・グループを作成する方法を説明します。
この章には、次の項が含まれます。
マスター・サイトを設定した後、マスター・グループを作成できます。レプリケーション環境を正しく構築するには、図3-2に示す手順に従う必要があります。
この章では、hr_repg
マスター・グループを作成して、図3-1に示すオブジェクトをレプリケートします。
この章のスクリプトを設計どおりに動作させるために、orc1.example.com
、orc2.example.com
およびorc3.example.com
にhr
スキーマが存在することを確認してください。hr
スキーマには次のデータベース・オブジェクトが含まれます。
countries
表
departments
表
employees
表
jobs
表
job_history
表
locations
表
regions
表
dept_location_ix
索引
emp_department_ix
索引
emp_job_ix
索引
emp_manager_ix
索引
jhist_department_ix
索引
jhist_employee_ix
索引
jhist_job_ix
索引
loc_country_ix
索引
リストされている索引は、hr
スキーマの外部キー列を基準とした索引です。親表の更新や削除が許可されていない場合を除き、外部キー参照制約がある表のレプリケーションでは、常に外部キーに索引を作成してからこれらの索引をレプリケートすることをお薦めします。索引は自動でレプリケートされません。
デフォルトでは、Oracle Databaseのインストール時に、hr
スキーマが自動的にインストールされます。この章のスクリプト例では、すべてのマスター・サイトにhrスキーマが存在し、そのスキーマには各サイトのデータベース・オブジェクトのすべてが含まれることを前提としています。また、表には、Oracleのインストール時に自動的に挿入されたデータが含まれるものとします。hr
スキーマがレプリケーション・サイトにインストールされていない場合は、手動でインストールできます。
関連項目: hrスキーマやその他のサンプル・スキーマ、およびサンプル・スキーマの手動インストールについては、『Oracle Databaseサンプル・スキーマ』 を参照してください。 |
次に示す手順に従って、hr_repg
マスター・グループを作成します。
注意: このドキュメントをオンラインで参照している場合は、次の「BEGINNING OF SCRIPT」の行から「END OF SCRIPT」の行までのテキストをテキスト・エディタにコピーして編集し、使用している環境に適したスクリプトを作成します。 |
/************************* BEGINNING OF SCRIPT ******************************/ SET ECHO ON SPOOL create_mg.out CONNECT repadmin@orc1.example.com /*
マスター・グループに関係するすべてのマスター・サイトに、スキーマが存在しない場合は、スキーマを作成して、必要な権限を付与します。この例では、Oracleのインストール時にデフォルトでインストールされたスキーマの1つであるhr
スキーマを使用します。したがって、hr
スキーマはすべてのマスター・サイトに存在します。
*/ PAUSE Press <RETURN> to continue when the schema exists at all master sites. /*
新しいマスター・グループを定義するには、CREATE_MASTER_REPGROUP
プロシージャを使用します。オブジェクトをマスター・グループに追加する場合または他のレプリケーション管理タスクを実行する場合は、この手順で定義したマスター・グループ名を参照します。この手順はレプリケーション管理者が実行します。
*/ BEGIN DBMS_REPCAT.CREATE_MASTER_REPGROUP ( gname => 'hr_repg'); END; / /*
オブジェクトをマスター・グループに追加するには、CREATE_MASTER_REPOBJECT
プロシージャを使用します。多くの場合、表と索引をマスター・グループへ追加しますが、プロシージャ、ビューその他も追加できます。
*/ BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'TABLE', oname => 'countries', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'TABLE', oname => 'departments', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); 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.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'TABLE', oname => 'jobs', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'TABLE', oname => 'job_history', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'TABLE', oname => 'locations', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'TABLE', oname => 'regions', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'INDEX', oname => 'dept_location_ix', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'INDEX', oname => 'emp_department_ix', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'INDEX', oname => 'emp_job_ix', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'INDEX', oname => 'emp_manager_ix', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'INDEX', oname => 'jhist_department_ix', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'INDEX', oname => 'jhist_employee_ix', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'INDEX', oname => 'jhist_job_ix', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'hr_repg', type => 'INDEX', oname => 'loc_country_ix', sname => 'hr', use_existing_object => TRUE, copy_rows => FALSE); END; / /*
マスター定義サイト(デフォルトではマスター・グループが作成されたサイトがマスター定義サイトになります)でマスター・グループを定義すれば、レプリケーション環境に関係する他のサイトを定義できます。orc2.example.com
およびorc3.example.com
サイトをレプリケーション環境に追加する場合があります。この例では、すべてのマスター・サイトにマスター・グループを作成しますが、データベースを静止することなく、まず1つのマスター・サイトにマスター・グループを作成して、後でマスター・サイトを追加することもできます。この場合には、この手順をスキップします。
この例では、hrスキーマがすべてのマスター・サイトに存在することが前提となっているため、ADD_MASTER_DATABASE
プロシージャのuse_existing_objects
パラメータにTRUE
が設定されています。つまり、hr
スキーマのオブジェクトは、すべてのマスター・サイトで事前に作成されていることが前提となっています。また、各マスター・サイトの表には同一データが格納されていることが前提となるため、copy_rows
パラメータにFALSE
が設定されています。
*/ BEGIN DBMS_REPCAT.ADD_MASTER_DATABASE ( gname => 'hr_repg', master => 'orc2.example.com', use_existing_objects => TRUE, copy_rows => FALSE, propagation_mode => 'ASYNCHRONOUS'); END; / /*
注意: DBA_REPSITES ビューにorc2.example.com が表示されてから作業を続けます。他のSQL*Plusセッションで、次のSELECT 文を実行し、orc2.example.com が表示されることを確認します。
SELECT DBLINK FROM DBA_REPSITES WHERE GNAME = 'HR_REPG'; |
*/ PAUSE Press <RETURN> to continue. BEGIN DBMS_REPCAT.ADD_MASTER_DATABASE ( gname => 'hr_repg', master => 'orc3.example.com', use_existing_objects => TRUE, copy_rows => FALSE, propagation_mode => 'ASYNCHRONOUS'); END; / /*
注意: DBA_REPSITES ビューにorc3.example.com が表示されてから作業を続けます。他のSQL*Plusセッションで、次のSELECT 文を実行し、orc3.example.com が表示されることを確認します。
|
*/ PAUSE Press <RETURN> to continue. /*
*/ PAUSE Press <RETURN> to continue after configuring conflict resolution methods or if no conflict resolution methods are required. /*
*/
BEGIN DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT ( sname => 'hr', oname => 'countries', type => 'TABLE', min_communication => TRUE); END; / BEGIN DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT ( sname => 'hr', oname => 'departments', type => 'TABLE', min_communication => TRUE); END; / BEGIN DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT ( sname => 'hr', oname => 'employees', type => 'TABLE', min_communication => TRUE); END; / BEGIN DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT ( sname => 'hr', oname => 'jobs', type => 'TABLE', min_communication => TRUE); END; / BEGIN DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT ( sname => 'hr', oname => 'job_history', type => 'TABLE', min_communication => TRUE); END; / BEGIN DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT ( sname => 'hr', oname => 'locations', type => 'TABLE', min_communication => TRUE); END; / BEGIN DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT ( sname => 'hr', oname => 'regions', type => 'TABLE', min_communication => TRUE); END; / /*
注意: DBA_REPCATLOG ビューが空になってから、マスター・アクティビティを再開します。DBA_REPCATLOG ビューを監視するには、次のSELECT 文を実行します。
SELECT COUNT(*) FROM DBA_REPCATLOG WHERE GNAME = 'HR_REPG'; |
*/ PAUSE Press <RETURN> to continue. /*
マスター・グループの作成、レプリケーション・オブジェクトの追加、レプリケーション・サポートの生成および追加マスター・データベースの追加を行った後で、レプリケーション・アクティビティを開始する必要があります。RESUME_MASTER_ACTIVITY
プロシージャを使用して、指定したマスター・グループのレプリケーションをオンにします。
*/ BEGIN DBMS_REPCAT.RESUME_MASTER_ACTIVITY ( gname => 'hr_repg'); END; / SET ECHO OFF SPOOL OFF /************************* END OF SCRIPT **********************************/