9.8 反映障害による未送信情報の取得(更新SQL出力機能)
Datareplicatorでは,抽出側DBの更新と反映側DBの更新には時間差があります。したがって,反映処理の最中に抽出側DBに障害が発生した場合,抽出側DBと反映側DBとの間に不整合が発生することがあります。
更新SQL出力機能は,このような場合に抽出側DBからの未送信情報(反映側DBに反映されていない情報)をSQL文にしてファイル出力する機能です。これによって,反映されていない情報を知ることができます。
- 注
- 更新SQL出力機能の使用時に更新情報の抽出,及び反映側システムへの送信はできません。
- 更新SQL出力機能を使用しても,抽出情報キューファイルに格納されている未送信情報がクリアされることはありません。
- <この節の構成>
- (1) 使用方法
- (2) 更新SQLファイル
- (3) 操作手順
- (4) 注意事項
(1) 使用方法
更新SQL出力機能の使用方法について説明します。
(a) 前提条件
更新SQL出力機能を使用する場合,次に示す条件を満たしている必要があります。
- 抽出側Datareplicatorのプロセスが起動可能である(CPU障害などから回復している)
- 抽出側システムにある次のファイルが正常な状態である(ディスク障害などから回復している)
- 抽出システム定義ファイル
- 抽出環境定義ファイル
- 送信環境定義ファイル
- 抽出定義ファイル
- 抽出定義プリプロセスファイル
- 抽出情報キューファイル
- 抽出マスタステータスファイル
- 抽出サーバステータスファイル
- データ連動用連絡ファイル
- 二重化制御ファイル
- HiRDBシステムログ
(b) コマンド
hdestartに-s -Lオプションを指定して実行します。コマンドの詳細については,hdestartコマンドを参照してください。
(c) 使用するプロセス
更新SQL出力機能を使用すると,更新SQL出力プロセスが起動します。更新SQL出力プロセスの詳細を次に示します。
プロセス名 | 起動方法 | 終了方法 |
---|
hdesqlput | hdestart -s -L | hdestop |
更新SQL出力プロセスは,次に示す点を除いて送信プロセスと同じ動作をします。
- 反映側Datareplicatorへの接続及び送信を行いません。
- 抽出サーバステータスファイルの更新を行いません。
- HiRDBの正常停止や連動停止ログ(pdrplstop)を検知した場合でも,停止しません。
- hdeevent -n 0 が実行された場合でも停止しません。
- 抽出システム定義のsendcontrolオペランドにsendmstを指定している場合も,nodemst方式で動作します。
- 縮退状態の送信先が存在する場合,送信環境定義のoverwrite_continueオペランドにfalseが指定されていても,縮退状態は継続されます。
(2) 更新SQLファイル
更新SQL出力機能によって出力される更新SQLファイルについて説明します。
(a) 出力先
更新SQLファイルの出力先を次に示します。
項目 | 出力先 |
---|
出力先ノード | 抽出側DBの更新対象になる各ノード |
出力先ディレクトリ | 抽出側Datareplicator運用ディレクトリ |
ファイル名称 | SQLTXT_サーバ名_送信先識別子 |
同じ名称のファイルが存在している場合,情報がそのファイルに追加出力されます。
また,抽出情報キューファイルに未送信情報が存在しない場合,更新SQLファイルは作成されません。
(b) 出力形式
更新SQLファイルには,未送信情報が1行1SQL文の形式で出力されます。SQL文として出力されるデータはCOMMITされたトランザクションのものだけであり,ROLLBACKされたトランザクションのデータは出力されません。また,トランザクションはCOMMITされた順番に並べ替えて出力されます。なお,仕掛かり中の更新情報は出力されません。
出力されるデータの形式を次に示します。
- INSERT文
/* 更新日時 */ INSERT INTO 認可識別子.表名(列名,列名,...) VALUES(値※1,値,...); |
- UPDATE文※2
/* 更新日時 */ UPDATE 認可識別子.表名 SET※3 列名=値※1,列名=値, ... WHERE※4 列名=値 AND 列名=値 ...; |
- DELETE文
/* 更新日時 */ DELETE FROM 認可識別子.表名 WHERE※4 列名=値※1 AND 列名=値 ...; |
- PURGE TABLE文※5
/* 更新日時 */ PURGE TABLE 認可識別子.表名; |
- イベント※6
/* ****-**-** **:**:** */ /* HDEEVENT イベントコード */ |
- トランザクションの終端
/* ****-**-** **:**:** */ COMMIT; |
- 注※1
- 出力する列値の形式と内容を次の表に示します。なお,繰返し列の場合は,NULL値/非NULL値に関係なく,列値は*MCOL*と出力されます。
列属性 | 文字集合 指定 | hdestartコマンドの-Hオプション | 出力される形式 | 出力される内容 | 備考 |
---|
CHAR,又は VARCHAR | なし | なし | 文字形式 (例:'aaa') | 該当する列の列値 | 制御コードはピリオドとして出力されます。 |
あり | 16進形式 (例:X'C3C3C3') | - |
あり | なし | 文字形式 (例:'aaa') | 該当する列の列値をDBロケールに文字コード変換した後の列値 | 制御コードはピリオドとして出力されます。 |
あり | 16進形式 (例:X'C3C3C3') | - |
MCHAR,又は MVARCHAR | - | なし | 文字形式 (例:M'あイうエお') | 該当する列の列値 | 制御コードはピリオドとして出力されます。 |
あり | 16進形式 (例:X'81C141') | - |
NCHAR,又は NVARCHAR | - | なし | 文字形式 (例:N'あいう') | 制御コードはピリオドとして出力されます。 |
あり | 16進形式 (例:X'81C181C2') | - |
INTEGER,又はSMALLINT | - | - | 10進形式 (例:100) | - |
DECIMAL | - | - | 10進形式 (例:100) | パック形式データを文字列に変換する際にエラーが発生した場合,その列は16進形式で出力されます。 |
FLOAT,又はSMALLFLT | - | - | 浮動小数点形式 (例:1.0…0E+02) | - |
DATE | - | - | 文字形式 (例:'2008-04-15') | パック形式データを文字列に変換する際にエラーが発生した場合,その列は16進形式で出力されます。 |
TIME | - | - | 文字形式 (例:'16:15:30') |
TIMESTAMP | - | - | 文字形式 (例:'2008-04-15 16:15:30') |
INTERVAL YEAR TO DAY | - | - | 10進形式 (例:+12340102.) |
INTERVAL HOUR TO SECOND | - | - | 10進形式(例:+112233.) |
BLOB | - | - | 固定文字列 | "*BLOB*" | - SUBSTR演算の場合も,該当する固定文字列("*BLOB*"又は"*BINARY*")が出力されます。
- NULL値/非NULL値に関係なく,該当する固定文字列("*BLOB*"又は"*BINARY*")が出力されます。
|
BINARY | - | - | "*BINARY*" |
ADT | - | - | 固定文字列 | "*ADT*" | NULL値/非NULL値に関係なく,該当する固定文字列"*ADT*"が出力されます。 |
- (凡例)
- -:該当しません。
- 注※2
- 繰返し列に対する更新情報を出力する場合,次の制限があります。
- UPDATE ADD,UPDATE SET,及びUPDATE DELETEは,すべてUPDATE SETとして出力されます。
- 要素指定による更新の場合でも,列名に対する添え字及び'*'は出力されません。
- 注※3
- 定義長が256バイト以上の可変長データが非更新の場合,その列はSET句に出力されません。
- 注※4
- WHERE句にはマッピングキー列が出力されます。列値がNULLの場合には,「列名 IS NULL」の形式で出力されます。
- 注※5
- 複数サーバにわたる分割表に対するPURGE TABLEの更新情報を検知した場合,送信環境定義のprg_eventnoオペランド指定の有無に従って動作します。指定値による動作の違いを次に示します。
オペランドの指定 | 動作 |
---|
あり | prg_eventnoオペランドに指定した番号のイベントを出力します。イベント出力後,処理を続行します。 |
なし | 該当するPURGE TABLEを無視します。 |
- 注※6
- イベントコード0は本来反映側Datareplicatorへの送信対象ではありませんが,このファイルには出力されます。
- 一つのトランザクション中で複数のイベントが発行された場合,最後に発行されたイベントだけ出力されます。また,hdeeventコマンドによるイベント発行の場合,イベントが出力された直後にCOMMITが出力されます。
(c) 出力例
更新SQLファイルの出力例を次に示します。
/* 2004-12-29 19:18:00 */ INSERT INTO "USR1"."T1"("C1","C2") VALUES(1,'a');
/* 2004-12-29 19:18:30 */ UPDATE "USR1"."T1" SET "C1"=2,"C2"='b' WHERE "C1"=2;
/* 2004-12-29 19:19:00 */ DELETE FROM "USR1"."T1" WHERE "C1" IS NULL;
/* 2004-12-29 19:19:30 */ PURGE TABLE "USR1"."T1";
/* ****-**-** **:**:** */ /* HDEEVENT 200 */
/* ****-**-** **:**:** */ COMMIT; |
(3) 操作手順
更新SQL出力を実行するには,次のように操作します。
- 反映側Datareplicatorが起動している場合,停止します。
これは,項番3又は項番6でオプションを誤って指定した場合に反映側システムに接続してしまうのを防ぐための操作です。
- 送信環境定義のoverwriteオペランドにtrueを指定している場は,抽出側Datareplicatorを停止した後,falseに変更します。
これは,項番3で抽出情報キューファイルが満杯になった場合に縮退してしまうのを防ぐための操作です。
- 抽出側Datareplicatorの抽出処理を開始します。
- 次に示す方法で,システムログのすべての更新情報を抽出したことを確認します。
- 抽出側Datareplicatorのエラー情報ファイルにKFRB00042-E(抽出情報キューファイルが満杯)が出ていないことを確認します。
KFRB00042-Eが出ている場合,抽出情報キューファイルを追加した後,抽出処理を再開してください※。
- 注※
- 抽出情報キューファイルの最大数は16個です。16個存在する状態で満杯になった場合,一部の更新情報は出力されません。
- HiRDBシステムログの抽出状況から,必要な更新情報の抽出が終了していることを確認します。
pdloglsコマンドの実行結果とpdls -d rpl -jコマンド実行結果のSystem Log Extract Pointを比較し,前者を後者が追い越していることを確認します。次に例を示します。
pdloglsの出力例
$ pdlogls -d sys -s flora370
HOSTNAME : flora370(151739)
Group Type Server Gen No. Status Run ID Block No.
log10 sys sds01 1 oc-d--u 3e6835a9 1 40
log11 sys sds01 0 os----- 00000000 0 0 |
pdlsの出力例
$ pdls -d rpl -j -s flora370
SYSTEMID : HRD1(150621)
Data replication : Y
UNITID : unt1(150621)
Data replication : Y
SERVER NAME : sds01
Extract Database : Y
Extract Status : C
System Log Extract Point :
Run ID Group Gen No. BLock No.
3e6835a9 log10 1 41
System Log Sync Info :
Run ID Group Gen No. BLock No.
3e6835a9 log10 1 13 |
pdloglsの結果では最終ブロック番号がlog10の40ブロック目となっていますが,pdlsでは現在抽出中のシステムログブロック番号がlog10の41ブロック目となっています。これによって,必要な更新情報の抽出処理が終了していることが分かります。
- 抽出側Datareplicatorを停止します。
- すべての更新SQLファイルを削除した後,抽出側Datareplicatorの更新SQL出力処理を開始します。
- hdestateコマンドを実行して,Queue write positionとQueue current posの値が等しくなったことを確認します。
Queue current posについてはhdestateコマンドを参照してください。
- 抽出側Datareplicatorを停止します。
- テキストエディタなどで更新SQLファイルを開き,未送信データを確認してください。
未送信データを反映側へ送信する必要がある場合には,送信処理を開始してください。送信する必要がない場合には,抽出情報キューファイルに格納されている未送信データを削除するために,抽出側Datareplicatorを部分初期化又は初期化してください。
(4) 注意事項