ヘッダーをスキップ
Oracle Rdb for OpenVMS Oracle RMUリファレンス・マニュアル
リリース7.2
E06177-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

1.64 RMU Unload After_Journalコマンド


形式




説明

RMU Unload After_Journalコマンドは、アフター・イメージ・ジャーナル(.aij)ファイルのバイナリ・データ・レコードの内容を変換して出力ファイルに格納します。コミット済トランザクションの指定した表のデータ・レコードが、トランザクションがコミットされた順序で、出力ストリーム(ファイル、デバイスまたはアプリケーション・コールバック)に抽出されます。

RMU Unload After_Journalコマンドを使用する前に、データベースでのLogMiner抽出を有効にする必要があります。RMU Set Logminerコマンドを使用して、データベースのLogMiner for Rdb機能を有効にします。RMU Unload After_JournalコマンドにContinuous修飾子を付けて使用する前には、データベースでのContinuous LogMiner抽出を有効にする必要があります。詳細は、第1.57節を参照してください。

.aijファイルから抽出したデータ・レコードは、データベースの実表でトランザクションによって追加、変更または削除されたレコードです。索引ノード、データベース・メタデータ、セグメント文字列(BLOB)、ビュー、COMPUTED BY列、システム・リレーションおよび一時表は、アフター・イメージ・ジャーナル・ファイルからアンロードできません。

トランザクションごとに、レコードの最後の内容が抽出されます。1つのトランザクションでの1つのレコードへの複数の変更は、要約されて、レコードの最後の変更のみが出力ストリームに含まれます。アフター・イメージ・ジャーナル・ファイルから、データ・レコードのどの列が変更されたかを直接判別することはできません。変更された列を判別するには、アフター・イメージ・ジャーナル・ファイルのレコードと以前のレコードを比較する必要があります。

抽出対象のアフター・イメージ・ジャーナル・ファイルの作成に使用されたデータベースは、RMU Unload After_Journalコマンドの実行時に使用可能であることが必要です。データベースは、.aijファイルからデータ・レコードを抽出するために必要なメタデータ情報(表名、列数、レコード・バージョンおよびレコードの圧縮など)を取得するために使用されます。データベースは、メタデータをロードするためだけに読み取られ、その後、切断されます。データベース・メタデータ情報を保存しておいて、後のセッションで使用することもできます。詳細は、Save_MetaDataおよびRestore_MetaData修飾子の説明を参照してください。

Continuous修飾子を使用する場合、Continuous LogMinerプロセスが実行しているノードでデータベースが開いている必要があります。データベースは常に使用されます。メタデータ情報の取得とオンライン・アフター・イメージ・ジャーナル・ファイルへのアクセスのために、常に使用可能であることが必要です。Save_MetaDataおよびRestore_MetaData修飾子は、Continuous修飾子と一緒には使用できません。

1つ以上の.aijファイルとContinuous修飾子を両方ともRMU Unload After_Journalコマンドラインに指定するときは、Continuous LogMinerプロセスがオンライン・モード(アクティブなオンライン.aijファイルが抽出される)に移行するまで.aijバックアップ操作が行われないことが重要です。自動.aijバックアップを使用しているときに、Continuous LogMiner機能を使用したい場合は、.aijバックアップ操作をいつ行うかを明示的に制御できるように、自動バックアップ機能(ABS)を無効にして、手動.aijバックアップの使用を検討することをお薦めします。

アフター・イメージ・ジャーナル・ファイル(1つまたは複数)は順に処理されます。指定したすべての表は、アフター・イメージ・ジャーナル・ファイルを介して1つの経路で抽出されます。

各トランザクションのコミット・レコードが処理されるとき、指定した表の変更および削除されたすべてのレコードがソートされて、重複するものが削除されます。その後、変更されたレコードと削除されたレコードが出力ストリームに書き込まれます。ロールバックされたトランザクションは無視されます。抽出対象ではない表のデータ・レコードは無視されます。トランザクション内の出力レコードの実際の順序は、予測不可能です。

抽出された出力では、変更または追加されたレコードは、変更として返されます。出力ストリームでは挿入されたレコードと更新されたレコードを区別することはできません。削除(消去)されたレコードは、削除として返されます。1つのレコードを変更して削除するトランザクションでは、削除レコードのみが生成されます。トランザクションで新しいレコードをデータベースに追加した後、同じトランザクションでそのレコードを削除すると、削除レコードのみが生成されます。

LogMinerプロセスは、DをRDB$LM_ACTIONフィールドに配置して行が削除されたことを示します。削除操作の直前の行の内容が、出力レコードのユーザー・フィールドに記録されます。1トランザクションで1つの行が複数回変更されてから削除されると、出力レコードには削除インジケータと最後の変更操作の結果のみが含まれます。同一トランザクションで行が挿入されてから削除されると、削除レコードのみが出力に含まれます。

複数表に基づくレコードは、同じ出力先ストリーム、または異なる出力先ストリームに出力することができます。次の出力先ストリームを使用できます。

LogMiner for Rdb機能の使用方法の詳細は、「付録B」を参照してください。


コマンドのパラメータ

root-file-spec

表をアンロードするアフター・イメージ・ジャーナル・ファイルに対応するデータベースのルート・ファイル指定。デフォルトのファイル拡張子は.rdbです。

データベースは、アフター・イメージ・ジャーナル・ファイルの作成に使用されたのと同じ実際のデータベースであることが必要です。データベースは、表のメタデータ(データに関する情報)をRMU Unload After_Journalコマンドで得るために必要です。特に、データベース内の有効な表の名前とリレーション識別が、表の列数や様々な記憶領域の表の圧縮情報とともに必要です。

RMU Unload After_Journalプロセスは、メタデータを読み取るために抽出操作の開始時にデータベースに短時間アタッチします。Continuous修飾子を指定しないかぎり、プロセスはメタデータを読み取ると、その後の操作ではデータベースに接続しません。Continuous修飾子では、抽出操作が停止せずに実行されること、プロセスがデータベースにアタッチしたままになることが指定されます。

aij-file-name

抽出操作のソースとして使用される1つ以上のアフター・イメージ・ジャーナル・バックアップ・ファイル。ファイル指定のカンマ区切りリストを指定することで、複数のジャーナル・ファイルから抽出できます。Oracle RMUでは、一連のファイルから抽出するためにOpenVMSワイルド・カード指定(*および%記号を使用)がサポートされます。アットマーク(@)記号で始まるファイル指定は、アフター・イメージ・ジャーナル・ファイルのリストを含むオプション・ファイル(アフター・イメージ・ジャーナルそのもののファイル指定ではない)を指します。アットマーク記号の構文を使用する場合は、アットマーク記号とファイル名を二重引用符で囲む必要があります(たとえば、aij-file-nameに"@files.opt"と指定します)。デフォルトのファイル拡張子は.aijです。

コマンドの修飾子

Before=date-time

抽出対象のトランザクションの終了日時を指定します。Select修飾子に基づいて、指定したBeforeの日時よりも前にコミットまたは開始されたトランザクションが選択されます。Beforeの日時よりも後でコミットまたは開始されたトランザクションによる情報の変更は、出力には含まれません。

Continuous

NoContinuous

LogMinerプロセスが、データベースにアタッチして、レコードの抽出をほぼリアルタイムで開始します。Continuous修飾子を指定すると、外部ソース(たとえば、[Ctrl]+[y]、STOP/ID、$FORCEXまたはデータベース停止)によって停止されるまで、RMU Unload After_Journalコマンドが、データベースのオンライン・アフター・イメージ・ジャーナル・ファイルからレコードを抽出します。

データベースをContinuous LogMiner機能に対して明示的に有効にする必要があります。Continuous LogMiner機能を有効にするには、RMU Set LogminerコマンドにEnableおよびContinuous修飾子を付けて使用します。Continuous LogMiner機能の使用を無効にするには、RMU Set LogminerコマンドにEnableおよびNocontinuous修飾子を付けて使用します。

Continuous LogMinerプロセスの出力は、情報の連続したストリームです。Continuous LogMiner機能の使用目的は、変更をOpenVMSメールボックスまたはパイプに書き込むこと、あるいはユーザー指定のコールバック・ルーチンをコールすることです。ディスク・ファイルへの出力の書込みは、Continuous LogMiner機能で問題なく実行できますが、ファイルが無限に大きくなるのを防ぐための組込み機能がありません。

コールバック・ルーチンまたはメールボックスの処理のレスポンスが非常によいことが重要です。ユーザー指定のコールバック・ルーチンが停止するか、読取りが早くないためにメールボックスがいっぱいになった場合、RMU Unload After_Journalコマンドはストールします。Continuous LogMinerプロセスは、現在抽出しているアフター・イメージ・ジャーナルおよびすべての後続ジャーナルのバックアップを停止します。Continuous LogMinerプロセスが十分な期間実行できない場合、使用可能なすべてのジャーナルがいっぱいになって、バックアップされない可能性があります。

データベースでContinuous LogMiner機能が有効になっているとき、現在の.aij EOFロケーションを調整および管理するためにAIJの高水位ロック(AIJHWM)が利用されます。AIJHWMロックのロック値ブロックには、最高位の書込み.aijブロックの場所が含まれます。Continuous修飾子を付けたRMU Unload After_Journalコマンドは、AIJHWMロックをポーリングして、データが.aijファイルに書き込まれたかどうかを判別し、最高位の書込みブロックを探します。データベースでContinuous LogMiner機能が有効になっていない場合、ロック動作の変更はありません。AIJHWMロックは保持されず、RMU Unload After_JournalコマンドにContinuous修飾子を指定できません。

.aij EOFロケーションのロックを維持するには、アフター・イメージ・ジャーナル・ファイルに書き込むプロセスがロックを使用して、ジャーナルへの書込みを順次処理する必要があります。Continuous LogMiner機能が有効になっていないとき、プロセスはかわりにアフター・イメージ・ジャーナル・ファイルでの領域の割当てを調整して、ロックを保持せずにファイルに書き込むことができます。Continuous LogMinerプロセスでは、.aij I/O操作中にAIJHWMロックを保持する必要があります。場合によっては、このようにして.aijファイルへの全スループットを減らすことができます。複数のプロセスによる複数の重複I/O書込み操作を減らすように作用するためです。

Save_MetaDataおよびRestore_MetaData修飾子には、Continuous修飾子との互換性がありません。

Extend_Size=integer

出力データ・ファイルのファイル割当ておよび拡張容量を指定します。デフォルトの拡張サイズは1000ブロックです。大きな値を使用すると、出力ファイルの断片化を減らすために役立ちます。また、大容量のデータが抽出される際のパフォーマンスが向上します。

Format=options

Format修飾子を指定しないと、Oracle RMUによってデータが固定長のバイナリ・フラット・ファイルに出力されます。

Formatのオプションは次のとおりです。

Ignore=Old_Version[=table-list]

無視するオプションの条件または項目を指定します。

RMU Unload After_Journalコマンドでは、AIJファイルの最新ではないレコード・バージョンを致命的エラー状態として扱います。つまり、レコード・バージョンが表の現在の最大バージョンと同じではないレコードを抽出しようとすると、致命的エラーが発生します。

また、ごくまれに、実際にはトランザクションによってレコードの変更が正常に終了していなくても、レコードの変更に伴う動詞のロールバックによって、古いバージョンのレコードがアフター・イメージ・ジャーナルに書き込まれることがあります。このような珍しいケースでは、RMU Unload After_Journalコマンドが古いレコード・バージョンを検出し、致命的エラーで強制終了します。

Ignore=Old_Version修飾子がある場合、RMU Unload After_Journalコマンドは、レコード・バージョンが最新ではないレコードごとに警告メッセージを表示します。それらのレコードは出力ストリームには書き込まれません。Old_Version修飾子には、オプションとして表名のリストを指定できます。これを指定すると、それらの表についてのみ、最新でないレコード・バージョンのエラーが無視されます。

Include=Action=include-type

削除または変更されたレコード、あるいはトランザクション・コミット情報を、アフター・イメージ・ジャーナルから抽出するかどうかを指定します。次のキーワードを指定できます。

IO_Buffers=integer

出力データ・ファイルのために使用されるI/Oバッファの数を指定します。デフォルトのバッファ数は2であり、通常はこの値で適切です。十分に高速のI/Oサブシステム・ハードウェアを使用する場合は、バッファを追加することでパフォーマンスが向上する可能性があります。ただし、バッファ数を増やすと、消費される仮想メモリーとプロセスの作業セットも増加します。

Log

Nolog

.aijファイルの抽出をSYS$OUTPUTまたはOutput修飾子で指定した宛先に報告することを指定します。アクティビティを記録しているときは、Log修飾子の出力によって、コミットまたはロールバックされたトランザクション数が示されます。デフォルトでは、DCL VERIFYフラグの設定が使用されます。このフラグはDCL SET VERIFYコマンドによって制御されます。

Options=options-list

次のオプションを指定できます。

Order_AIJ_Files

NoOrder_AIJ_Files

デフォルトでは、アフター・イメージ・ジャーナル・ファイルは、RMU Unload After_Journalコマンドに指定した順序で処理されます。Order_AIJ_Files修飾子では、入力アフター・イメージ・ジャーナル・ファイルを順序番号の昇順で処理することを指定します。これは、いくつもの入力ファイルのワイルド・カード(*または%)処理を使用するときに役立ちます。.aijファイルがそれぞれ開かれ、最初のブロックが読み取られ(順序番号の判別)、ファイルが閉じてから、ソート操作が行われます。

Output=file-spec

ログおよびトレース出力(LogおよびTrace修飾子で選択)を指定ファイルにリダイレクトします。この修飾子を指定しないと、LogおよびTrace修飾子で生成される出力(容量が大きくなる可能性がある)がSYS$OUTPUTに表示されます。

Parameter=character-strings

連結して、起動時にコールバック・ルーチンに渡す1つ以上の文字列を指定します。

ユーザー指定のコールバック・ルーチンに関連付けられている各表に対して、コールバック・ルーチンは2つのパラメータ(パラメータ・レコードの長さおよびパラメータ・レコードへのポインタ)を使用してコールされます。このレコードのバイナリ形式と内容を「表1-21」に示します。

表1-21 パラメータ・レコードの内容
フィールド 長さ(バイト) 内容
ACTION 1 P
RELATION 31 リレーション名
RECORD_TYPE 4 0
DATA_LEN 2 パラメータ文字列の長さ
NBV_LEN 2 0
LDBK 8 0
START_TAD 8 0
COMMIT_TAD 8 0
TSN 8 0
DATA ? 可変長パラメータ文字列の内容

Restart=restart-point

抽出を開始する場所を示すAIJ Extract Restart Control Point(AERCP)を指定します。AERCPは、最後に抽出されたトランザクションのトランザクション順序番号(TSN)と、既知のマイクロ・クワイエット・ポイントが存在する.aijファイル内の場所を示します。

Restart修飾子を指定せず、入力アフター・イメージ・ジャーナル・ファイルをコマンドラインに指定しないと、Continuous LogMinerプロセスは、一番前に変更されたオンライン・アフター・イメージ・ジャーナル・ファイルの先頭から抽出を開始します。

AERCP構造をテキスト表示用に書式設定すると、6つのフィールド(MBZフィールドは除く)で構成され、ハイフンで区切られた符号なし整数として表示されます(たとえば、1-28-12-7-3202-3202)。

Restore_Metadata=file-spec

指定したファイルからRMU Unload After_Journalコマンドがデータベース・メタデータ情報を読み取ることを指定します。Databaseパラメータは必須ですが、Restore_Metadata修飾子を指定するとデータベースそのものはアクセスされません。デフォルトのファイル・タイプは.metadataです。Restore_Metadata修飾子を指定すると、Continuous修飾子は指定できません。

Restore_Metadata修飾子を指定するとデータベースが使用できないため、特定のデータベース固有アクションを実行できません。たとえば、アフター・イメージ・ジャーナルのチェックが無効になります。データベース構造と表の変更が行われてもメタデータ情報の静的コピーは更新されないため、データベースのDML操作の後でメタデータ・ファイルを確実に保存することが重要です。

Restore_Metadata修飾子を指定すると、アフター・イメージ・ジャーナル・ファイルが、メタデータ・ファイルの作成に使用されたのと同じデータベースを使用して作成されたことを確認するために、追加のチェックが行われます。このようなチェックによって、セキュリティが強化され、誤ったファイルの照合を防ぐことに役立ちます。

Save_Metadata=file-spec

指定したファイルにRMU Unload After_Journalコマンドがメタデータ情報を書き込むことを指定します。Save_Metadata修飾子を指定すると、Continuous、Restore_Metadata、TableおよびOptions=file修飾子とaij-file-nameパラメータは指定できません。デフォルトのファイル・タイプは.metadataです。

Select=selection-type

BeforeおよびSince修飾子の日付と時刻がトランザクション開始時間とトランザクション・コミット時間のどちらを参照するかを指定します。

Select修飾子のselection-typeとして次のオプションを指定できます。

日付選択のデフォルトはCommit_Transactionです。

Since=date-time

抽出対象のトランザクションの開始時刻を指定します。Select修飾子に指定した値によって異なりますが、Sinceに指定した日付以降にコミットまたは開始されたトランザクションが選択されます。Sinceに指定した日付よりも前にコミットまたは開始されたトランザクションの情報は、出力には含まれません。

Sort_Workfiles=integer

ソート作業ファイルの数を指定します。ソート作業ファイルのデフォルト数は2です。大きなトランザクションを抽出するとき、使用するソート作業ファイルの数を増やすと、I/Oロードを複数のディスク・デバイスに分散することでパフォーマンスが向上することがあります。SORTWORKn(nは数値0〜9)論理名を使用して、ソート作業ファイルの場所を指定します。

Statistics_Interval=integer

アンロード操作の進捗を確認できるように統計を定期的に表示することを指定します。

次のような統計が表示されます。

Statistics_Interval修飾子を指定する場合、デフォルトの間隔は60秒です。最小値は1秒です。最初の間隔が経過する前にアンロード操作が正常に終了すると、アンロードされたファイル数に関する情報メッセージを受け取ります。最初の間隔が経過する前にアンロード操作が失敗すると、エラー・メッセージとアンロードされたレコード数の統計を受け取ります。

アンロード操作中は、いつでも[Ctrl]と[T]を同時に押して現在の統計を表示できます。

Symbols

Nosymbols

各表で抽出されるレコードの情報を示すDCLシンボルを作成するかどうかを指定します。

多数の表をアンロードする場合に、関連するシンボルの作成が多すぎて、CLIシンボル表の領域が不足することがあります。この場合、エラー・メッセージ「LIB-F-INSCLIMEM, insufficient CLI memory」が返されます。Nosymbols修飾子を指定すると、シンボルが作成されません。

デフォルトはSymbolsです。シンボルが作成されます。

Table=(Name=table-name, table-options)

アンロード対象の表の名前と出力先を指定します。table-nameには、データベース内の表を指定する必要があります。ビュー、索引およびシステム・リレーションは、アフター・イメージ・ジャーナル・ファイルからアンロードできません。

表名の指定でアスタリスク(*)とパーセント記号(%)のワイルド・カード文字を使用して、指定した構成要素と一致するすべての表を選択できます。アスタリスクは0以上の文字、パーセント記号は1文字と一致します。

ワイルド・カード文字を含む表名指定では、文字列の最初の文字がシャープ記号(#)の場合、ワイルド・カード指定と一致しない文字列が検索されます。これにより、ワイルド・カード指定を使用して表を除外できるようになります。シャープ記号の指定が評価されるのは、表名の指定にアスタリスクかパーセント記号が含まれる場合のみです。

たとえば、表名の指定#FOO%は、長さが4文字で先頭が文字列FOOではないすべての表名を選択することを指定します。

Table修飾子には次のtable-optionsを指定できます。

他の修飾子は最後に指定したもののみがアプリケーションで使用されますが、Table修飾子は異なり、RMU Unload After_Journalコマンドに複数回指定できます。それぞれのTable修飾子で別の表を指定する必要があります。

Trace

NoTrace

.aijファイルのアンロードをトレースすることを指定します。デフォルトはNotraceです。アンロード操作をトレースすると、Trace修飾子の出力によって、.aijファイルのトランザクションがTSNによって識別され、アンロード・プロセスでOracle RMUが各トランザクションに何を実行したかが記述されます。Trace修飾子と一緒にLog修飾子を指定できます。

使用上の注意


Continuous LogMiner機能の使用上の注意


例1

次の例は、EMPLOYEES表を.aijバックアップ・ファイルMFP.AIJBCKからアンロードします。


RMU /UNLOAD /AFTER_JOURNAL MFP.RDB MFP.AIJBCK -
    /TABLE = (NAME = EMPLOYEES, OUTPUT = EMPLOYEES.DAT)

例2

次の例は、SALES、STOCK、SHIPPINGおよびORDERS表を、.aijバックアップ・ファイルMFS.AIJBCK_1-JUL-1999〜MFS.AIJBCK_3-JUL-1999から同時にアンロードします。入力.aijバックアップ・ファイルは、指定した順序で処理されることに注意してください。


$ RMU /UNLOAD /AFTER_JOURNAL MFS.RDB -
   MFS.AIJBCK_1-JUL-1999, -
   MFS.AIJBCK_2-JUL-1999, -
   MFS.AIJBCK_3-JUL-1999 -
   /TABLE = (NAME = SALES, OUTPUT = SALES.DAT) -
   /TABLE = (NAME = STOCK, OUTPUT = STOCK.DAT) -
   /TABLE = (NAME = SHIPPING, OUTPUT = SHIPPING.DAT) -
   /TABLE = (NAME = ORDER, OUTPUT = ORDER.DAT)

例3

BeforeおよびSince修飾子を使用して、時間範囲に基づいてデータをアンロードします。次の例は、1999年9月1日14時30分から1999年9月3日16時の間にコミットされたトランザクションによってPLANETS表に行われた変更を抽出します。


$ RMU /UNLOAD /AFTER_JOURNAL MFS.RDB MFS.AIJBCK -
   /TABLE = (NAME = PLANETS, OUTPUT = PLANETS.DAT) -
   /BEFORE = "3-SEP-1999 16:00:00.00" -
   /SINCE = "1-SEP-1999 14:30:00.00"

例4

次の例は、ワイルド・カード指定MFS.AIJBCK_1999-07-*と一致するすべての.aijバックアップ・ファイルから、SALESおよびSTOCK表を同時にアンロードします。入力.aijバックアップ・ファイルは、ファイル・システムから返される順序で処理されます。


$ RMU /UNLOAD /AFTER_JOURNAL MFS.RDB -
   MFS.AIJBCK_1999-07-* -
   /TABLE = (NAME = SALES, OUTPUT = SALES.DAT) -
   /TABLE = (NAME = STOCK, OUTPUT = STOCK.DAT)

例5

次の例は、AIJ_BACKUP_FILES.DATというファイルに指定された.aijバックアップ・ファイルからTICKER表をアンロードします(アットマーク記号(@)とファイル指定を囲む二重引用符に注意してください)。入力.aijバックアップ・ファイルは順に処理されます。出力レコードは、MBA127:というメールボックス・デバイスに書き込まれます。別のプログラムがシステムですでに実行しており、このプログラムがメールボックスに書き込まれたデータを読み取って処理します。


$ RMU /UNLOAD /AFTER_JOURNAL MFS.RDB -
   "@AIJ_BACKUP_FILES.DAT" -
   /TABLE = (NAME = TICKER, OUTPUT = MBA127:)

例6

RMU Unload After_Journalコマンドを使用した後で、RMU Loadコマンドを使用して、あるデータベースから別のデータベースのチェンジ・テーブルにトランザクション・データを移動することができます。ターゲット・データベースにロードする表ごとにレコード定義(.rrd)ファイルを作成する必要があります。レコード定義ファイルは、Table修飾子にRecord_Definitionオプションを指定して作成できます。


$ RMU /UNLOAD /AFTER_JOURNAL OLTP.RDB MYAIJ.AIJBCK -
  /TABLE = ( NAME = MYTBL, -
             OUTPUT = MYTBL.DAT, -
             RECORD_DEFINITION=MYLOGTBL) -
  /TABLE = ( NAME = SALE, -
             OUTPUT=SALE.DAT, -
             RECORD_DEFINITION=SALELOGTBL)

$ RMU /LOAD WAREHOUSE.RDB MYLOGTBL MYTBL.DAT -
   /RECORD_DEFINITION = FILE = MYLOGTBL.RRD

$ RMU /LOAD WAREHOUSE.RDB SALELOGTBL SALE.DAT -
   /RECORD_DEFINITION = FILE = SALELOGTBL.RRD

例7

出力ファイルのレコード構造定義を含むRMSファイルを、RMU Loadコマンドの入力ファイルとして使用できます。レコードの記述には、CDOレコードおよびフィールド定義形式を使用します。これは、RMU LoadおよびRMU UnloadコマンドでRecord_Definition修飾子を使用するときに使用されるのと同じ形式です。デフォルトのファイル拡張子は.rrdです。

LogMinerプロセスが出力.rrdファイルに書き込むフィールドのレコード定義を、次の表に示します。アンロードされる実際のユーザー・データ・フィールドのレコード定義ファイルにこれらのフィールドを手動で追加できます。このファイルは、データベース内のトランザクション表をロードするために使用できます。トランザクション表は、LogMinerプロセスが書き込む出力です。データベースで実行された順次トランザクションで構成されます。


DEFINE FIELD RDB$LM_ACTION          DATATYPE IS TEXT SIZE IS 1.
DEFINE FIELD RDB$LM_RELATION_NAME   DATATYPE IS TEXT SIZE IS 31.
DEFINE FIELD RDB$LM_RECORD_TYPE     DATATYPE IS SIGNED LONGWORD.
DEFINE FIELD RDB$LM_DATA_LEN        DATATYPE IS SIGNED WORD.
DEFINE FIELD RDB$LM_NBV_LEN         DATATYPE IS SIGNED WORD.
DEFINE FIELD RDB$LM_DBK             DATATYPE IS SIGNED QUADWORD.
DEFINE FIELD RDB$LM_START_TAD       DATETYPE IS DATE
DEFINE FIELD RDB$LM_COMMIT_TAD      DATATYPE IS DATE
DEFINE FIELD RDB$LM_TSN             DATATYPE IS SIGNED QUADWORD.
DEFINE FIELD RDB$LM_RECORD_VERSION  DATATYPE IS SIGNED WORD.

例8

次の例に示すように、Table修飾子を使用するかわりに、オプション・ファイルを使用して抽出対象の表(1つまたは複数)を指定できます。


$ TYPE TABLES.OPTIONS
TABLE=MYTBL, OUTPUT=MYTBL.DAT
TABLE=SALES, OUTPUT=SALES.DAT
$ RMU /UNLOAD /AFTER_JOURNAL OLTP.RDB MYAIJ.AIJBCK -
   /OPTIONS = FILE = TABLES.OPTIONS

例9

次の例は、稼働中データベースからEMPLOYEES表をアンロードし、すべての変更レコードをMBA145デバイスに書き込みます。別のプログラムが常にメールボックスを読み取って、レコードを処理すると考えられます。


$ RMU /UNLOAD /AFTER_JOURNAL /CONTINUOUS MFP.RDB -
 /TABLE = (NAME = EMPLOYEES, OUTPUT = MBA145:)

例10

この例は、3つの表(EMPLOYEES、SALESおよびCUSTOMERS)の1つのメールボックスへのアンロードを示します。メールボックスはファイル指向デバイスではありませんが、それぞれに同じファイル名を指定します。これが必要なのは、LogMinerプロセスのデフォルトでは表名がファイル名になるためです。各出力ストリームの宛先に同じファイル名を明示的に指定しないと、LogMinerプロセスによって各表に1つのメールボックス・チャネルが割り当てられます。すべての表でファイル名を同じにすると、LogMinerプロセスによって検出され、すべての入力表に対してチャネルが1つだけ割り当てられます。


$ DEFINE MBX$ LOADER_MBX:X
$ RMU /UNLOAD /AFTER_JOURNAL /CONTINUOUS MFP.RDB -
 /TABLE = (NAME = EMPLOYEES, OUTPUT = MBX$:) -
 /TABLE = (NAME = SALES, OUTPUT = MBX$:) -
 /TABLE = (NAME = CUSTOMERS, OUTPUT = MBX$:)

例11

この例では、トランザクション・コミット情報を含めるために、/Include =Action =Commit修飾子を指定しています。さらに、EMPLOYEESおよびSALES表は、2つの異なるメールボックス・デバイス(個別のプロセスで読み取られる)に抽出されます。各トランザクションのすべての変更済レコードが抽出された後で、コミット・レコードが各メールボックスに書き込まれます。


$ RMU /UNLOAD /AFTER_JOURNAL /CONTINUOUS MFP.RDB -
 /INCLUDE = ACTION = COMMIT -
 /TABLE = (NAME = EMPLOYEES, OUTPUT = LOADER_EMP_MBX:X) -
 /TABLE = (NAME = SALES, OUTPUT = LOADER_SAL_MBX:X)

例12

この例では、複数の入力バックアップ・アフター・イメージ・ジャーナル・ファイルを指定しています。Order_AIJ_Files修飾子は、.aijファイルが.aij順序番号の昇順で(ファイル名には関係なく)処理されることを指定します。抽出操作の前に、各入力ファイルが開き、.aijのオープン・レコードが読み取られます。その後、.aij順序番号の昇順で、一度に1つずつ.aijファイルが開いて抽出されます。



$ RMU /UNLOAD /AFTER_JOURNAL /LOG /ORDER_AIJ_FILES -
 MFP.RDB *.AIJBCK -
 /TABLE = (NAME = C1, OUTPUT=C1.DAT)
%RMU-I-UNLAIJFL, Unloading table C1 to DGA0:[DB]C1.DAT;1
%RMU-I-LOGOPNAIJ, opened journal file DGA0:[DB]ABLE.AIJBCK;1
%RMU-I-AIJRSTSEQ, journal sequence number is "5"
%RMU-I-LOGOPNAIJ, opened journal file DGA0:[DB]BAKER.AIJBCK;1
%RMU-I-AIJRSTSEQ, journal sequence number is "4"
%RMU-I-LOGOPNAIJ, opened journal file DGA0:[DB]CHARLIE.AIJBCK;1
%RMU-I-AIJRSTSEQ, journal sequence number is "6"
%RMU-I-LOGOPNAIJ, opened journal file DGA0:[DB]BAKER.AIJBCK;1
%RMU-I-AIJRSTSEQ, journal sequence number is "4"
%RMU-I-AIJMODSEQ, next AIJ file sequence number will be 5
%RMU-I-LOGOPNAIJ, opened journal file DGA0:[DB]ABLE.AIJBCK;1
%RMU-I-AIJRSTSEQ, journal sequence number is "5"
%RMU-I-AIJMODSEQ, next AIJ file sequence number will be 6
%RMU-I-LOGOPNAIJ, opened journal file DGA0:[DB]CHARLIE.AIJBCK;1
%RMU-I-AIJRSTSEQ, journal sequence number is "6"
%RMU-I-AIJMODSEQ, next AIJ file sequence number will be 7
%RMU-I-LOGSUMMARY, total 7 transactions committed
%RMU-I-LOGSUMMARY, total 0 transactions rolled back
---------------------------------------------------------------------
ELAPSED: 0 00:00:00.15 CPU: 0:00:00.08 BUFIO: 62 DIRIO: 19 FAULTS: 73
Table "C1" : 3 records written (3 modify, 0 delete)
Total : 3 records written (3 modify, 0 delete)

例13

LogMinerプロセスが出力に書き込むフィールドのSQLレコード定義を、次の例に示します。アンロードされる実際のユーザー・データ・フィールドに対する表作成コマンドにこれらのフィールドを手動で追加できます。または、Table_Definition修飾子を使用してSQL定義ファイルを自動的に作成できます。これは、Table修飾子と一緒に使用するか、オプション・ファイル内で指定します。これは変更データのトランザクション表を作成するために使用できます。


SQL> CREATE TABLE MYLOGTABLE (
cont> RDB$LM_ACTION          CHAR,
cont> RDB$LM_RELATION_NAME   CHAR (31),
cont> RDB$LM_RECORD_TYPE     INTEGER,
cont> RDB$LM_DATA_LEN        SMALLINT,
cont> RDB$LM_NBV_LEN         SMALLINT,
cont> RDB$LM_DBK             BIGINT,
cont> RDB$LM_START_TAD       DATE VMS,
cont> RDB$LM_COMMIT_TAD      DATE VMS,
cont> RDB$LM_TSN             BIGINT,
cont> RDB$LM_RECORD_VERSION  SMALLINT ...);

例14

次の例は、PERSONNELデータベースのEMPLOYEES表に対するトランザクション表のレコード定義(.rrd)ファイルです。


DEFINE FIELD RDB$LM_ACTION          DATATYPE IS TEXT SIZE IS 1.
DEFINE FIELD RDB$LM_RELATION_NAME   DATATYPE IS TEXT SIZE IS 31.
DEFINE FIELD RDB$LM_RECORD_TYPE     DATATYPE IS SIGNED LONGWORD.
DEFINE FIELD RDB$LM_DATA_LEN        DATATYPE IS SIGNED WORD.
DEFINE FIELD RDB$LM_NBV_LEN         DATATYPE IS SIGNED WORD.
DEFINE FIELD RDB$LM_DBK             DATATYPE IS SIGNED QUADWORD.
DEFINE FIELD RDB$LM_START_TAD       DATATYPE IS DATE.
DEFINE FIELD RDB$LM_COMMIT_TAD      DATATYPE IS DATE.
DEFINE FIELD RDB$LM_TSN             DATATYPE IS SIGNED QUADWORD.
DEFINE FIELD RDB$LM_RECORD_VERSION  DATATYPE IS SIGNED WORD.

DEFINE FIELD EMPLOYEE_ID            DATATYPE IS TEXT SIZE IS 5.
DEFINE FIELD LAST_NAME              DATATYPE IS TEXT SIZE IS 14.
DEFINE FIELD FIRST_NAME             DATATYPE IS TEXT SIZE IS 10.
DEFINE FIELD MIDDLE_INITIAL         DATATYPE IS TEXT SIZE IS 1.
DEFINE FIELD ADDRESS_DATA_1         DATATYPE IS TEXT SIZE IS 25.
DEFINE FIELD ADDRESS_DATA_2         DATATYPE IS TEXT SIZE IS 20.
DEFINE FIELD CITY                   DATATYPE IS TEXT SIZE IS 20.
DEFINE FIELD STATE                  DATATYPE IS TEXT SIZE IS 2.
DEFINE FIELD POSTAL_CODE            DATATYPE IS TEXT SIZE IS 5.
DEFINE FIELD SEX                    DATATYPE IS TEXT SIZE IS 1.
DEFINE FIELD BIRTHDAY               DATATYPE IS DATE.
DEFINE FIELD STATUS_CODE            DATATYPE IS TEXT SIZE IS 1.

DEFINE RECORD EMPLOYEES.
   RDB$LM_ACTION .
   RDB$LM_RELATION_NAME .
   RDB$LM_RECORD_TYPE .
   RDB$LM_DATA_LEN .
   RDB$LM_NBV_LEN .
   RDB$LM_DBK .
   RDB$LM_START_TAD .
   RDB$LM_COMMIT_TAD .
   RDB$LM_TSN .
   RDB$LM_RECORD_VERSION .
   EMPLOYEE_ID .
   LAST_NAME .
   FIRST_NAME .
   MIDDLE_INITIAL .
   ADDRESS_DATA_1 .
   ADDRESS_DATA_2 .
   CITY .
   STATE .
   POSTAL_CODE .
   SEX .
   BIRTHDAY .
   STATUS_CODE .
END EMPLOYEES RECORD.

例15

次のCソース・コード・セグメントは、LogMinerプロセスの従業員トランザクション情報を処理するためのコールバック・モジュールおよびルーチンとして使用できるモジュールの構造を示します。ルーチンEmployees_Callbackは、LogMinerプロセスによって抽出レコードごとにコールされます。このコールバック・ルーチンが最後にコールされるとき、出力ストリームの終了を示すためにRDB$LM_ACTIONフィールドがEに設定されます。


#include <stdio>
typedef unsigned char date_type[8];
typedef unsigned char dbkey_type[8];
typedef unsigned char tsn_type[8];

typedef struct {
    unsigned char       rdb$lm_action;
    char                rdb$lm_relation_name[31];
    unsigned int        rdb$lm_record_type;
    unsigned short int  rdb$lm_data_len;
    unsigned short int  rdb$lm_nbv_len;
    dbkey_type          rdb$lm_dbk;
    date_type           rdb$lm_start_tad;
    date_type           rdb$lm_commit_tad;
    tsn_type            rdb$lm_tsn;
    unsigned short int  rdb$lm_record_version;
    char                employee_id[5];
    char                last_name[14];
    char                first_name[10];
    char                middle_initial[1];
    char                address_data_1[25];
    char                address_data_2[20];
    char                city[20];
    char                state[2];
    char                postal_code[5];
    char                sex[1];
    date_type           birthday;
    char                status_code[1];
} transaction_data;

void employees_callback (unsigned int data_len, transaction_data
                         data_buf)
{    .
     .
     .
 return;}

Cコンパイラ(VAX CまたはDEC C)を使用してこのモジュールをコンパイルします。このモジュールをリンクするとき、シンボルEMPLOYEES_CALLBACKを共有可能イメージ内で外部化する必要があります。共有可能イメージの作成の詳細は、OpenVMSのマニュアルのLinkerユーティリティの説明を参照してください。

OpenVMS Alphaシステムでは、次のようにLINKコマンドを使用できます。


$ LINK /SHAREABLE = EXAMPLE.EXE EXAMPLE.OBJ + SYS$INPUT: /OPTIONS
SYMBOL_VECTOR = (EMPLOYEES_CALLBACK = PROCEDURE)
<Ctrl/Z>

OpenVMS VAXシステムでは、次のようにLINKコマンドを使用できます。


$ LINK /SHAREABLE = EXAMPLE.EXE EXAMPLE.OBJ + SYS$INPUT: /OPTIONS
UNIVERSAL = EMPLOYEES_CALLBACK
<Ctrl/Z>

例16

RMU Unload After_JournalおよびRMU Loadコマンドを使用すると、トリガーとトランザクション表を使用して表データをデータベース間でレプリケートする方法を構築できます。このデータ・レプリケーション方法は、トランザクションでのソース表の変更に基づきます。プログラミングは必要ありません。かわりに、Oracle Rdbの既存の機能を組み合せてこの処理を実行できるようにします。

この例では、一意の顧客ID値、顧客名、住所および郵便番号を含む単純な顧客情報表CUSTについて検討します。この表への変更を、OLTPデータベースから報告用データベース・システムに定期的(おそらく夜間)に移動します。

まず、報告用データベースで、OLTPの顧客表と同じ構造の顧客表を作成します。この例では、この表はRPT_CUSTという名前です。これには、OLTPの顧客表CUSTと同じフィールドが含まれます。


SQL> CREATE TABLE RPT_CUST
cont> CUST_ID               INTEGER,
cont> CUST_NAME             CHAR (50),
cont> CUST_ADDRESS          CHAR (50),
cont> CUST_POSTAL_CODE      INTEGER);

次に、LogMinerによってCUST表から抽出するトランザクション・データのための一時表を報告用データベースに作成します。一時表のデータが各トランザクションのコミット時にメモリーから削除されるように、この一時表定義にはON COMMIT DELETE ROWSを指定します。一時表を使用するのは、表への変更をジャーナル処理する必要がないためです。


SQL> CREATE GLOBAL TEMPORARY TABLE RDB_LM_RPT_CUST (
cont> RDB$LM_RECORD_TYPE    INTEGER,
cont> RDB$LM_DATA_LEN       SMALLINT,
cont> RDB$LM_NBV_LEN        SMALLINT,
cont> RDB$LM_DBK            BIGINT,
cont> RDB$LM_START_TAD      DATE VMS,
cont> RDB$LM_COMMIT_TAD     DATE VMS,
cont> RDB$LM_TSN            BIGINT,
cont> RDB$LM_RECORD_VERSION SMALLINT,
cont> CUST_ID               INTEGER,
cont> CUST_NAME             CHAR (50),
cont> CUST_ADDRESS          CHAR (50),
cont> CUST_POSTAL_CODE      INTEGER) ON COMMIT DELETE ROWS;

報告用データベースのRPT_CUST表に移入するデータについて、RDB_LM_RPT_CUSTトランザクション表にトリガーを作成します。このトリガーは、OLTPデータベースのCUST表のトランザクション情報に基づいてRPT_CUST表で行の挿入、更新または削除を行うために使用されます。一意のCUST_IDフィールドを使用して、顧客レコードを変更するか追加するかを判別します。


SQL> CREATE TRIGGER RDB_LM_RPT_CUST_TRIG
cont>  AFTER INSERT ON RDB_LM_RPT_CUST
cont>
cont> -- Modify an existing customer record
cont>
cont>  WHEN (RDB$LM_ACTION = 'M' AND
cont>        EXISTS (SELECT RPT_CUST.CUST_ID FROM RPT_CUST
cont>                WHERE RPT_CUST.CUST_ID =
cont>                RDB_LM_RPT_CUST.CUST_ID))
cont>      (UPDATE RPT_CUST SET
cont>              RPT_CUST.CUST_NAME = RDB_LM_RPT_CUST.CUST_NAME,
cont>              RPT_CUST.CUST_ADDRESS =
cont>              RDB_LM_RPT_CUST.CUST_ADDRESS,
cont>              RPT_CUST.CUST_POSTAL_CODE =
cont>              RDB_LM_RPT_CUST.CUST_POSTAL_CODE
cont>       WHERE RPT_CUST.CUST_ID = RDB_LM_RPT_CUST.CUST_ID)
cont>  FOR EACH ROW
cont>
cont> -- Add a new customer record
cont>
cont>  WHEN (RDB$LM_ACTION = 'M' AND NOT
cont>        EXISTS (SELECT RPT_CUST.CUST_ID FROM RPT_CUST
cont>                WHERE RPT_CUST.CUST_ID =
cont>                RDB_LM_RPT_CUST.CUST_ID))
cont>      (INSERT INTO RPT_CUST VALUES
cont>              (RDB_LM_RPT_CUST.CUST_ID,
cont>               RDB_LM_RPT_CUST.CUST_NAME,
cont>               RDB_LM_RPT_CUST.CUST_ADDRESS,
cont>               RDB_LM_RPT_CUST.CUST_POSTAL_CODE))
cont>  FOR EACH ROW
cont>
cont> -- Delete an existing customer record
cont>
cont>  WHEN (RDB$LM_ACTION = 'D')
cont>      (DELETE FROM RPT_CUST
cont>       WHERE RPT_CUST.CUST_ID = RDB_LM_RPT_CUST.CUST_ID)
cont>  FOR EACH ROW;

トリガー内では、実行するアクション(顧客レコードの追加、更新、削除など)は、RDB$LM_ACTIONフィールド(DまたはMと定義される)と報告用データベース内の顧客レコードの存在に基づきます。変更に対しては、顧客レコードが存在しない場合は追加され、存在している場合は更新されます。OLTPデータベースでの削除に対しては、顧客レコードが報告用データベースから削除されます。

RMU Loadコマンドを使用して、LogMinerプロセスの出力を読み取り、データを一時表にロードします。この表に挿入が行われるたびに、トリガーが実行します。Commit_Every修飾子を使用して、一時表の顧客レコードでメモリーがいっぱいにならないようにします。トリガーが実行するとすぐに、一時表のレコードは不要になるためです。


$ RMU /UNLOAD /AFTER_JOURNAL OLTP.RDB OLTP.AIJBCK -
 /TABLE = (NAME = CUST, -
           OUTPUT = CUST.DAT, -
           RECORD_DEFINITION = RDB_LM_RPT_CUST.RRD)

$ RMU /LOAD REPORT_DATABASE.RDB RDB_LM_RPT_CUST CUST.DAT -
      /RECORD_DEFINITION = FILE = RDB_LM_RPT_CUST.RRD -
      /COMMIT_EVERY = 1000

例17

次の例は、抽出データをOracleデータベースにロードするためにSQL*Loaderで使用できる制御ファイルを生成する方法を示します。


$ RMU/UNLOAD/AFTER TEST_DB TEST_DB_AIJ1_BCK -
     /FORMAT=TEXT -
     /TABLE=(NAME=TEST_TBL, -
             OUTPUT=LOGMINER_TEXT.TXT, -
             CONTROL=LOGMINER_CONTROL.CTL, -
             TABLE_DEFINITION=TEST_TBL.SQL)

この例では次の制御ファイルが生成されます。この制御ファイルは、固定長のレコード・テキスト・ファイルを対象としたものです。NULLは、対応するNULLバイトFILLER列を参照する列定義にNULLIF句を使用して処理されます。基礎となる表の各列にNULLバイトFILLER列がありますが、レコードの先頭のLogMiner固有の列にはありません。列がNULLの場合、対応するRDB$LM_NBn FILLER列は1に設定されます。VARCHAR列には空白が埋め込まれますが、ファイルがSQL*Loaderでロードされるとき、デフォルトでは空白は無視されます。空白を保持する場合は、制御ファイルを更新して、PRESERVE BLANKS句を追加します。


-- Control file for LogMiner transaction data 25-AUG-2000 12:15:50.47
-- From database table "TEST_DB"
LOAD DATA
INFILE 'DISK:[DIRECTORY]LOGMINER_TEXT.TXT;'
APPEND INTO TABLE 'RDB_LM_TEST_TBL'
(
RDB$LM_ACTION                   POSITION(1:1) CHAR,
RDB$LM_RELATION_NAME            POSITION(2:32) CHAR,
RDB$LM_RECORD_TYPE              POSITION(33:44) INTEGER EXTERNAL,
RDB$LM_DATA_LEN                 POSITION(45:50) INTEGER EXTERNAL,
RDB$LM_NBV_LEN                  POSITION(51:56) INTEGER EXTERNAL,
RDB$LM_DBK                      POSITION(57:76) INTEGER EXTERNAL,
RDB$LM_START_TAD                POSITION(77:90) DATE "YYYYMMDDHHMISS",
RDB$LM_COMMIT_TAD               POSITION(91:104) DATE "YYYYMMDDHHMISS",
RDB$LM_TSN                      POSITION(105:124) INTEGER EXTERNAL,
RDB$LM_RECORD_VERSION           POSITION(125:130) INTEGER EXTERNAL,
TEST_COL                        POSITION(131:150) CHAR NULLIF RDB$LM_NB1 = 1,
RDB$LM_NB1               FILLER POSITION(151:151) INTEGER EXTERNAL
)

例17

次の例は、データベースMFPのメタデータ・ファイルを作成します。後のRMU Unload After_Journalコマンドの入力としてこのメタデータ・ファイルを使用できます。


$ RMU /UNLOAD /AFTER_JOURNAL MFP /SAVE_METADATA=MF_MFP.METADATA /LOG
%RMU-I-LMMFWRTCNT, Wrote 107 objects to metadata file
 "DUA0:[DB]MFMFP.METADATA;1"

例18

この例は、データベースMFPに対して事前に作成したメタデータ情報ファイルを使用します。データベースは、アンロード操作中にはアクセスされません。データベース・メタデータ情報はファイルから読み取られます。抽出操作がソース・データベースに直接依存しないため、AIJおよびMETADATAファイルを別のシステムに移動してそこで抽出することができます。


$ RMU /UNLOAD /AFTER_JOURNAL /RESTORE_METADATA=MF_MFP.METADATA -
    MFP AIJ_BACKUP1 /TABLE=(NAME=TAB1, OUTPUT=TAB1) /LOG
%RMU-I-LMMFRDCNT, Read 107 objects from metadata file
 "DUA0:[DB]MF_MFP.METADATA;1"
%RMU-I-UNLAIJFL, Unloading table TAB1 to DUA0:[DB]TAB1.DAT;1
%RMU-I-LOGOPNAIJ, opened journal file DUA0:[DB]AIJ_BACKUP1.AIJ;1
%RMU-I-AIJRSTSEQ, journal sequence number is "7216321"
%RMU-I-AIJMODSEQ, next AIJ file sequence number will be 7216322
%RMU-I-LOGSUMMARY, total 2 transactions committed
%RMU-I-LOGSUMMARY, total 0 transactions rolled back
----------------------------------------------------------------------
 ELAPSED:  0 00:00:00.15 CPU: 0:00:00.01 BUFIO: 11 DIRIO: 5 FAULTS: 28
Table "TAB1" : 1 record written (1 modify, 0 delete)
Total : 1 record written (1 modify, 0 delete)