前提条件:
|
このデモでは、レプリケーションのコンフリクトを解決するために一般的なコンフリクト解決手順を使用するようSharePlexを設定します。汎用コンフリクト解決では、1つのPL/SQLプロシージャを使用して複数のテーブルのコンフリクトを解決できます。
次のような紛争解決戦略が示されています。
重要! ピアツーピアレプリケーションは、すべてのビジネスアプリケーションに対応しているわけではありません。環境に適している場合、カスタムのコンフリクト解決手順を作成するなど慎重な分析と実行が必要です。一般的に、それらはこのデモの手順よりも複雑です。このデモは、本番環境でのピアツーピア展開を行う根拠として使用しないでください。ピアツーピアレプリケーションの詳細については、『SharePlex管理ガイド』を参照してください。
デモを開始する前に、以下の説明に従ってデモ用オブジェクトをインストールします。
注意: スクリプトを実行するには、レプリケーションに含まれるテーブルのReplica IdentityをFullに設定します。
pg_p2p.sqlスクリプトとpg_od.sqlスクリプトは、これらのデモで使用するデモオブジェクトをインストールします。これらのスクリプトは、SharePlex製品ディレクトリのutilサブディレクトリに保存されています。
以下の手順でスクリプトを実行します。
注意: これらのスクリプトでは、デモオブジェクトをインストールするスキーマを入力するよう求められます。さらに、pg_p2p.sqlでは、正確なデータの信頼できるソースとなるシステムの名前を入力するよう求められます。
od_employee
Name |
Null? |
Type |
---|---|---|
emp_no | not null | int |
emp_first_name | varchar(20) | |
emp_last_name | varchar(20) | |
emp_dob | date | |
emp_dept_no | int | |
emp_timestamp | date |
Name |
Null? |
Type |
---|---|---|
exc_no | not null | int |
exc_type | varchar (6) | |
exc_target_table | varchar (66) | |
exc_fixed | varchar (3) | |
exc_info | varchar (500) | |
exc_timestamp | date |
exc_source
Name |
Type |
---|---|
pri_system | varchar |
注意: これらのテーブルとは別に他のデモオブジェクトも作成されますが、このデモでは扱いません。
注意: このデモでは、デモオブジェクトがdemoというスキーマにあることを前提としています。異なる場合は、実際のスキーマで置き換えてください。
両方のシステム(両方のデータベース)で以下の手順を実行します。
SharePlexをシャットダウンします。
sp_ctrl(peer1)>shutdown
SharePlex製品ディレクトリのutilサブディレクトリからpg_p2p.sqlスクリプトを実行します。これにより、od_employee_genデモのコンフリクト解決ルーチンがインストールされます。以下のプロンプトが表示されます。
以下の手順でSharePlexを設定します。
各システムで、conflict_resolution.databaseファイルをテキストエディタで開きます。このファイルの保存場所は、SharePlex変数データディレクトリのdataサブディレクトリです。
注意: Postは、レプリケーションの競合が発生したときにこのファイルをチェックし、呼び出すべき解決プロシージャがあるかどうかを判断します。
各システムで、conflict_resolution.databaseファイルに以下のエントリを作成します。各列を少なくとも数個のスペースかタブ文字で区切ります。
demo.od_employee | IUD | demo.od_employee_gen |
注意: 最初のコンポーネントはテーブルで、2番目はそのテーブルで競合が発生した場合に解決ルーチンが呼び出される操作タイプを指定し、3番目は使用される解決ルーチンの名前です。
peer1(信頼できるソース)に、peer2上のod_employeeテーブルにod_employeeテーブルを複製するod_peer1という名前の設定ファイルを作成します。
sp_ctrl(peer1)> create config od_peer1
demo.od_employee | demo.od_employee | peer2@r.database |
peer2(2番目のソース)に、peer1上のod_employeeテーブルにod_employeeテーブルを複製するod_peer2という名前の設定ファイルを作成します。
sp_ctrl(peer2)> create config od_peer2
demo.od_employee | demo.od_employee | peer1@r.database |
以下の手順でレプリケーションを有効化し、開始します。
peer1でod_peer1の設定をアクティベーションします。
peer2でod_peer2の設定をアクティベーションします。
各システムで、設定が正常にアクティベーションされたことを確認します。「File Name(ファイル名)」の下に「od_peer1」または「od_peer2」(システムにより異なる)という名前が表示され、「State(状態)」の下に「Active」と表示されます。
sp_ctrl(source)>list config
このデモでは、peer1で発生したINSERTで、peer2から複製された競合するINSERTが上書きされます。
peer2で、od_employeeに行を挿入します。
insert into od_employee values(1, 'John', 'Doe', '1949-04-01', 1, '2022-01-01');
peer1で同じ行(同じ値)を挿入します。
insert into od_employee values(1, 'John', 'Doe', '1949-04-01', 1, '2022-01-01');
このデモでは、UPDATEステートメントのコンフリクトが発生するたびに、emp timestamp列の値がより新しい行が優先されます。
注意: タイムスタンプの優先順位を機能させるためには、EMP_TIMESTAMPフィールドを他の列と共にNULLでない値に変更しなければなりません。UPDATE文のtimestamp列が更新されていないか、NULL値に変更されている場合、ストアドプロシージャは競合を解決できません。同期外れの問題が発生します。
このデモでは、DELETE文が競合を発生させても、それは無視されます。
exc_tableという名前のテーブルが、デモオブジェクトのインストール時に指定したスキーマにインストールされました。PSQLを通じて、それぞれのコンフリクトに関する情報を見ることができます。以下はテーブルの説明です。
列 | 説明 |
---|---|
EXC_NO | コンフリクトの例外番号。 |
EXC_TYPE | SQL 文の種類。INSERT、UPDATE、DELETE のいずれか。 |
EXC_TARGET_TABLE | コンフリクトが発生したテーブル。 |
EXC_FIXED |
コンフリクト解決ルーチンの結果。YESは、ルーチンが成功したことを意味します。NOは、ルーチンが失敗し、行を手動で正しい値に変更する必要があることを意味します。 |
EXC_INFO | コンフリクトの原因。 |
EXC_TIMESTAMP | このマシンでコンフリクトが発生した時間。 |
前提条件: 先に進む前に、SharePlexのデモオブジェクトがインストールされていることを確認します。「デモのための事前の作業」を参照してください。
このデモでは、レプリケーションのコンフリクトを解決するために一般的なコンフリクト解決手順を使用するようSharePlexを設定します。汎用コンフリクト解決では、1つのPL/SQLプロシージャを使用して複数のテーブルのコンフリクトを解決できます。
次のような紛争解決戦略が示されています。
重要! ピアツーピアレプリケーションは、すべてのビジネスアプリケーションに対応しているわけではありません。環境に適している場合、カスタムのコンフリクト解決手順を作成するなど慎重な分析と実行が必要です。一般的に、それらはこのデモの手順よりも複雑です。このデモは、本番環境でのピアツーピア展開を行う根拠として使用しないでください。ピアツーピアレプリケーションの詳細については、『SharePlex管理ガイド』を参照してください。
デモを開始する前に、以下の説明に従ってデモ用オブジェクトをインストールします。
注意: 以下の事前作業はOracleピアのみに該当します。PostgreSQLピアの事前作業については、「デモの事前作業 - PostgreSQL」を参照してください。
p2p.sqlとod.sqlスクリプトは、これらのデモで使用するデモオブジェクトをインストールします。これらのスクリプトは、SharePlex製品ディレクトリのutilサブディレクトリに保存されています。
以下の手順でスクリプトを実行します。
スクリプトは以下の項目を求めるプロンプトを表示します。
od_employee
Name |
Null? |
Type |
---|---|---|
EMP_NO | NOT NULL | NUMBER |
EMP_FIRST_NAME | VARCHAR2 | |
EMP_LAST_NAME | VARCHAR2 | |
EMP_DOB | DATE | |
EMP_DEPT_NO | NUMBER | |
EMP_TIMESTAMP | DATE |
od_timesheet
Name |
Null? |
Type |
---|---|---|
TS_EMP_NO | NUMBER | |
TS_IN_TIME | DATE | |
TS_OUT_TIME | DATE | |
TS_MOD_TIME | DATE |
od_department
Name |
Null? |
Type |
---|---|---|
DEPT_NO | NOT NULL | NUMBER |
DEPT_NAME | VARCHAR2 | |
DEPT_CODE | VARCHAR2 |
od_salary
Name |
Null? |
Type |
---|---|---|
SALE_EMP_NO | NUMBER | |
SAL_VALUE | NUMBER | |
SAL_CHANGED | DATE |
od_sales_emp_data
Name |
Null? |
Type |
---|---|---|
EMP_NO_KEY | NOT NULL | NUMBER |
EMPLOYEE_NAME | VARCHAR2 (70) | |
SALARY | NUMBER | |
DEPARTMENT | VARCHAR2 (50) |
oxc_table
Name |
Null? |
Type |
---|---|---|
EXC_NO | NOT NULL | NUMBER |
EXC_TYPE | VARCHAR2 (6) | |
EXC_TARGET_TABLE | VARCHAR2 (66) | |
EXC_FIXED | VARCHAR2 (3) | |
EXC_INFO | VARCHAR2 (500) | |
EXC_TIMESTAMP | DATE |
注意: このデモでは、デモオブジェクトがdemoというスキーマにあることを前提としています。異なる場合は、実際のスキーマで置き換えてください。
以下の手順では、Oracleピア用のデモオブジェクトを準備する方法について説明します。PostgreSQLピアのデモオブジェクトを準備する方法については、「オブジェクトの準備」を参照してください。
Oracleピアで以下の手順を実行します。
SharePlexをシャットダウンします。
sp_ctrl(peer1)>shutdown
デモオブジェクトを所有するユーザに、SharePlexの初回インストール時にSharePlexスキーマにインストールされたsp_crパッケージを実行するシステム特権を付与します。
SQL>grant execute on sp_cr to user_name
SharePlex製品ディレクトリのutilサブディレクトリからp2p.sqlスクリプトを実行します。これにより、od_employee_genデモのコンフリクト解決ルーチンがインストールされます。以下のプロンプトが表示されます。
SharePlexデータベースユーザの名前。
以下の手順でSharePlexを設定します。
注意: この設定では、Peer1がPostgresqlデータベースで、Peer2がOracleデータベースです。conflict_resolutionファイルの名前はOracleではconflict_resolution.sid、PostgreSQLではconflict_resolution.databaseです。
各システムで、conflict_resolutionファイルをテキストエディタで開きます。このファイルの保存場所は、SharePlex変数データディレクトリのdataサブディレクトリです。
注意: Postは、レプリケーションの競合が発生したときにこのファイルをチェックし、呼び出すべき解決プロシージャがあるかどうかを判断します。
各システムで、conflict_resolutionファイルに以下のエントリを作成します。各列を少なくとも数個のスペースかタブ文字で区切ります。
demo.od_employee | IUD | demo.od_employee_gen |
注意: 最初のコンポーネントはテーブルで、2番目はそのテーブルで競合が発生した場合に解決ルーチンが呼び出される操作タイプを指定し、3番目は使用される解決ルーチンの名前です。
peer1(信頼できるソース)に、peer2上のod_employeeテーブルにod_employeeテーブルを複製するod_peer1という名前の設定ファイルを作成します。
sp_ctrl(peer1)> create config od_peer1
datasource:r.dbname | ||
"demo"."od_employee" ("emp_no", "emp_first_name", "emp_last_name", "emp_dob", "emp_dept_no", "emp_timestamp") | "DEMO"."OD_EMPLOYEE" ("EMP_NO", "EMP_FIRST_NAME", "EMP_LAST_NAME", "EMP_DOB", "EMP_DEPT_NO", "EMP_TIMESTAMP") | peer2@o.sid |
peer2(2番目のソース)に、peer1上のod_employeeテーブルにod_employeeテーブルを複製するod_peer2という名前の設定ファイルを作成します。
sp_ctrl(peer2)> create config od_peer2
datasource:o.sid | ||
"DEMO"."OD_EMPLOYEE" ("EMP_NO", "EMP_FIRST_NAME", "EMP_LAST_NAME", "EMP_DOB", "EMP_DEPT_NO", "EMP_TIMESTAMP") | "demo"."od_employee" ("emp_no", "emp_first_name", "emp_last_name", "emp_dob", "emp_dept_no", "emp_timestamp") | peer2@r.dbname |
注意: 上記の例では、(ソースとターゲット)両方のテーブルで大文字と小文字の区別が異なるため、列マッピング機能が使用されています。
以下の手順でレプリケーションを有効化し、開始します。
peer1でod_peer1の設定をアクティベーションします。
peer2でod_peer2の設定をアクティベーションします。
各システムで、設定が正常にアクティベーションされたことを確認します。「File Name(ファイル名)」の下に「od_peer1」または「od_peer2」(システムにより異なる)という名前が表示され、「State(状態)」の下に「Active」と表示されます。
sp_ctrl(source)>list config
このデモでは、peer1で発生したINSERTで、peer2から複製された競合するINSERTが上書きされます。
peer1で、od_employeeに行を挿入します。
insert into od_employee values(1, 'John', 'Doe', '1949-04-01', 1, '2022-01-01');
peer2で同じ行(同じ値)を挿入します。
INSERT INTO OD_EMPLOYEE VALUES (1,'John','Doe',to_date ('04/01/1949','MM/DD/RRRR'),1,to_date('01/01/2022','MM/DD/RRRR'));
このデモでは、UPDATEステートメントのコンフリクトが発生するたびに、emp_timestamp列の値がより新しい行が優先されます。
注意: タイムスタンプの優先順位を機能させるためには、EMP_TIMESTAMPフィールドを他の列と共にNULLでない値に変更しなければなりません。UPDATE文のtimestamp列が更新されていないか、NULL値に変更されている場合、ストアドプロシージャは競合を解決できません。同期外れの問題が発生します。
このデモでは、DELETE文が競合を発生させても、それは無視されます。
exc_tableという名前のテーブルが、デモオブジェクトのインストール時に指定したスキーマにインストールされました。PSQL for PostgreSQLおよび SQLPLUS for Oracleを使用して、それぞれのコンフリクトに関する情報を表示することができます。以下はテーブルの説明です。
列 | 説明 |
---|---|
EXC_NO | コンフリクトの例外番号。 |
EXC_TYPE | SQL 文の種類。INSERT、UPDATE、DELETE のいずれか。 |
EXC_TARGET_TABLE | コンフリクトが発生したテーブル。 |
EXC_FIXED |
コンフリクト解決ルーチンの結果。YESは、ルーチンが成功したことを意味します。NOは、ルーチンが失敗し、行を手動で正しい値に変更する必要があることを意味します。 |
EXC_INFO | コンフリクトの原因。 |
EXC_TIMESTAMP | このマシンでコンフリクトが発生した時間。 |
SharePlexは、レプリケーションの手順を「設定」から取得します。これは、何をすべきかをSharePlexにユーザが定義して指定するものです。レプリケートするオブジェクトのグループごとに設定ファイルを作成します。
設定はソースシステム上にあり、以下を定義します。
デモ用の設定を作成するには:
ソースシステムのsp_ctrlでcreate configコマンドを実行し、sample_configという名前のレプリケーション設定を作成します。これでデフォルトのテキストエディタが開きます(Linuxシステムではvi)。
以下のテンプレート1を参照しながら、設定を構築します。
テンプレート1: 基本的なデモ設定のsample_config
datasource:r.source_DB | ||
"qarun"."basic_c127" | "splex"."basic_c127" | 10.250.14.105@r.sp_ad |
ファイルのコメント行でない最初の行に、空白を入れずに以下のように入力します。
(source_databasenameにはソースインスタンスのPostgreSQLデータベース名を代入)これは、データがレプリケートされるテーブルを見つける場所をSharePlexに伝えます。r.は、PostgreSQLのデータがレプリケートされていることをSharePlexに伝えます。
次の行に、ソーステーブルのオーナー名(splex)とテーブル名(demo_src)を入力し、2つの項目の間をスペースではなくドット(.)で区切ります。オーナーの名前をテーブル名に使用することで、SharePlexは正しいテーブルに確実にレプリケートします。これは、データベース内の異なるスキーマの異なるテーブルの名前が同一の場合があるからです。
2列目に、ターゲットテーブルのオーナー名(splex)とテーブル名(demo_dest)を入力し、2つの項目の間をスペースではなくドット(.)で区切ります
数個のスペースかタブを入力して3列目を作成します。Enterキーは押さないでください。
3列目に、以下の項目をスペースを空けずに入力します。これにより設定のルーティングマップが作成され、レプリケートされたデータを置く場所をSharePlexに伝えます。
例:
sysB@r.databasename
(オプション)設定を表示するには、ソースシステムのsp_ctrlでview configコマンドを実行します。
ソースシステムのsp_ctrlで設定をアクティベーションします。設定名では大文字と小文字が区別されます。
設定がアクティブであることを確認するには、ソースシステムで以下のsp_ctrlコマンドを入力し、すべての設定のリストを表示します。「File Name(ファイル名)」の下にsample_configの設定が表示され、「State(状態)」の下に「Active」と表示されます。
ヒント: 設定のアクティベーションに失敗した場合は、sp_ctrlでview config sample_configコマンドを使用してファイルを表示します。テンプレート1と比較し、入力した情報がすべて正しいことを確認してください。例えば、あるはずのない余分なスペースがないか、データベース名の前のr.のような構成要素が欠けていないかをチェックします。
設定ファイルの間違いを修正するには:
注意: アクティブな設定を変更するには、まずcopyconfigコマンドを使用して設定を新しいファイルにコピーし、そのコピーを編集してアクティベーションする必要があります。
注意: 先に進む前に、SharePlexのデモオブジェクトがインストールされていることを確認します。
このデモでは、レプリケーション設定を作成してアクティベーションし、ソーステーブルにデータを読み込んで、データがターゲットテーブルに正常にレプリケートされたことを確認します。また、同期がとれていないテーブルの修復も行います。
注意: このデモでは、デモオブジェクトがdemoというスキーマにあることを前提としています。異なる場合は、実際のスキーマで置き換えてください。
ソースシステムで以下の手順を実行します。
sp_ctrlを実行します。
以下のコマンドを実行して、sample_department、sample_salary、sample_timesheet、sample_employeeの各テーブルをターゲットシステム上の同名のテーブルに複製するsample_configという名前の設定ファイルを作成します。
sp_ctrl(source)>create config sample_config
テキストエディタで、以下のテンプレートに基づいて設定ファイルを作成します。コンポーネント(ソース指定、ターゲット指定、ルーティングマップ)の文字と文字の間にはスペースを入れず、各コンポーネントの間には少なくとも1つのスペースを入れます。
# sample_config configuration file | ||
datasource:r.source_databasename | ||
"demo"."sample_department" |
"demo"."sample_department" |
target_system@r.target_databasename |
"demo"."sample_salary" | "demo"."sample_salary" |
target_system@r.target_databasename |
"demo"."sample_timesheet" | "demo"."sample_timesheet" | target_system@r.target_databasename |
"demo"."sample_employee" | "demo"."sample_employee" | target_system@r.target_databasename |
ここで:
sp_ctrlで、設定ファイルが正常にアクティベーションされることを確認します。
sp_ctrl(source)>verify config sample_config
PostgreSQLからPostgreSQLへのレプリケーションの設定ファイルの例:
# data2k configuration file | ||
datasource:r.source_databasename | ||
"demo"."data2k" | "demo"."data2k" | target_system@r.target_databasename |
PostgreSQLからOracleへのレプリケーションの設定ファイルの例:
# data2k configuration file | ||
datasource:r.source_databasename | ||
"demo"."data2k" | "demo"."data2k" | target_system@o.target_databasename |
ソースシステムで以下の手順を実行します。設定をアクティベーションすると、SharePlexは、指定されたソースデータに行われたトランザクションの変更をキャプチャする準備が整います。
設定をアクティベーションします。
sp_ctrl(source)>activate config sample_config
注意: 設定名では大文字と小文字が区別されます。
設定が正常にアクティベーションされたことを確認します。「File Name(ファイル名)」の下に「config sample_config」という名前が表示され、「State(状態)」の下に「Active」と表示されます。
sp_ctrl(source)>list config
© ALL RIGHTS RESERVED. 利用規約 プライバシー Cookie Preference Center