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つの行が複数回変更されてから削除されると、出力レコードには削除インジケータと最後の変更操作の結果のみが含まれます。同一トランザクションで行が挿入されてから削除されると、削除レコードのみが出力に含まれます。
複数表に基づくレコードは、同じ出力先ストリーム、または異なる出力先ストリームに出力することができます。次の出力先ストリームを使用できます。
- ファイル
- OpenVMSメールボックス
- OpenVMSパイプ
- 実行時にアクティブ化される共有可能イメージを介したアプリケーションへの直接コールバック
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のオプションは次のとおりです。
- Format=Binary
Format=Binaryオプションを指定すると、Oracle RMUでデータ変換が実行されません。すべてのデータがオリジナルのバイナリ状態のままフラット・ファイル形式に出力されます。
「表1-19」に、Binary形式の出力レコードの出力フィールドとデータ型を示します。
表1-19 出力フィールド フィールド名 データ型 バイト長 説明 ACTION CHAR (1) 1 レコードの状態を示します。Mは、挿入または変更アクションを示します。Dは、削除アクションを示します。Eは、コールバック・ルーチンが使用されているときにストリームのEOFを示します。Pは、コールバック・ルーチンが使用されているときにコマンドラインのParameter修飾子の値を示します(Parameter修飾子の説明を参照してください)。Cは、Include=Action=Commit修飾子が指定されたときに、トランザクションのコミット情報を示します。 RELATION_NAME CHAR (31) 31 表名。31文字になるように空白が埋め込まれます。 RECORD_TYPE INTEGER
(Longword)4 Oracle Rdb内部リレーション識別子。 DATA_LEN SMALLINT(Word) 2 データ・レコードの内容の長さ(バイト)。 NBV_LEN SMALLINT(Word) 2 NULLビット・ベクターの内容の長さ(ビット)。 DBK BIGINT(Quadword) 8 レコード論理データベース・キー。データベース・キーは3つのフィールドの構造で、16ビットの行番号、32ビットのページ番号、16ビットの領域番号を含みます。 START_TAD DATE VMS(Quadword) 8 トランザクションの開始日時。 COMMIT_TAD DATE VMS(Quadword) 8 トランザクションのコミット日時。 TSN BIGINT(Quadword) 8 レコードの操作を実行したトランザクションのトランザクション順序番号。 RECORD_VERSION SMALLINT(Word) 2 レコードのバージョン。 Record Data データにより異なる。 実際のデータ・レコード・フィールドの内容。 Record NBV BIT VECTOR(ビット配列) NULLビット・ベクター。データ・レコードの各フィールドに対して1ビットがあります。ビット値が1の場合、対応するフィールドはNULLです。ビット値が0の場合、対応するフィールドはNULLではなく実際のデータ値を含みます。NULLビット・ベクターはバイト境界から開始します。最後のNULLビットの後のベクターの最終バイトに他のビットがあっても使用されません。
- Format=Dump
Format=Dumpオプションを指定すると、Oracle RMUによって、表示に適した出力形式が生成されます。Dump形式出力の各行には、列名(LogMiner接頭辞列を含む)と最大200バイトの列データが含まれます。印刷不可能な文字はピリオド(.)で置き換えられ、数値と日付はテキストに変換されます。NULL列は文字列NULLとして示されます。この形式はデバッグ時に利用するためのものです。実際の出力内容と形式は将来変更される予定があります。
- Format=Text
Format=Textオプションを指定すると、Oracle RMUによってすべてのデータが固定長列の印刷可能なテキストに変換されてからアンロードされます。指定のVARCHAR(n)文字列の文字数がnよりも少ないときに、文字列がn文字長になるように空白が埋め込まれます。- Format=(Delimited_Text [,delimiter-options])
Format=Delimited_Textオプションを指定すると、Oracle RMUによってすべてのデータにデリミタが適用されてからアンロードされます。
DATE VMS日付は、yyyymmddhhmmssccというソート可能な日時書式で出力されます。たとえば、1993年3月20は1993032000000000と出力されます。
デリミタのオプションは次のとおりです。
- Prefix=string
ASCII出力ファイルのすべての列値の先頭に付ける接頭辞文字列を指定します。このオプションを省略すると、列の接頭辞は引用符(")になります。- Separator=string
行の列値を区切る文字列を指定します。このオプションを省略すると、列のセパレータはカンマ(,)になります。- Suffix=string
ASCII出力ファイルのすべての列値の末尾に付ける接尾辞文字列を指定します。このオプションを省略すると、列の接尾辞は引用符(")になります。- Terminator=string
1行分のすべての列値の後に付ける、行の終端文字を指定します。このオプションを省略すると、終端文字として行端マーカーが使用されます。- Null=string
NULLがデータベースの列で検出されたときに、NULLとして出力ファイルにアンロードされる文字列を指定します。
Nullオプションは次のいずれかとしてコマンドラインで指定できます。
- 引用符で囲んだ文字列
- 何も囲まない一組の二重引用符("")
- 文字列なし
NULL文字を表す文字列は、Oracle RMUコマンドラインでは引用符で囲む必要があります。NULL文字として空白文字(1つまたは複数)は指定できません。Null値と他のDelimited_Textオプションで同じ文字を使用することはできません。
注意
デリミタ・オプションに指定する各文字列の値は、引用符で囲む必要があります。Oracle RMUは、値を解釈する際にそれらの引用符を除外します。引用符(")をデリミタとして指定する場合は、4つの引用符からなる文字列を指定します。このように指定すると、Oracle RMUは、1つの引用符をデリミタとして使用するよう要求されたものと解釈します。たとえば、Suffix = """"と指定したとします。
その場合、Oracle RMUはこれらの引用符を次のように読み取ります。
- 最初の引用符は文字列から除外されます。
- 2つ目と3つ目の引用符は、1つの引用符(")をデリミタとして使用するリクエストであると解釈されます。
- 4つ目の引用符は除外されます。
このようにして1つの引用符がデリミタとして使用されます。
さらに、デリミタ付き文字列の一部として引用符を指定する必要がある場合は、文字列に含める引用符ごとに2つの引用符を使用する必要があります。たとえば、Suffix = "**""**"と指定すると、Oracle RMUは**"**というデリミタを使用します。
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
削除または変更されたレコード、あるいはトランザクション・コミット情報を、アフター・イメージ・ジャーナルから抽出するかどうかを指定します。次のキーワードを指定できます。
- Commit
NoCommit
Commitを指定すると、トランザクション・コミット・レコードが、各トランザクションの最終レコードとして各出力ストリームに書き込まれます。コミット情報レコードが出力ストリームに書き込まれるのは、トランザクションの他のすべてのレコードが書き込まれた後です。デフォルトはNoCommitです。
出力ストリームは、抽出対象の表のデフォルト・ファイル名で作成されるため、出力ストリームごとに一意のファイル名を指定することが重要です。一意の定義とは、ファイル以外の出力デバイス(パイプまたはメールボックスなど)に書き込むときに、各出力先に対して確実に固有のファイル名を指定できるということです。つまり、各出力ストリームにOutput=MBA1234:と指定するかわりに、Output=MBA1234:MBXを使用するか、MBA1234:のすべての出現箇所で同一のファイル名を使用する必要があります。
固有のファイル名を使用しないと、返されるコミット・レコードが増加したり、予期しないコミット・レコードが返されたりすることがあります。ただし、通常これは、ストリーム指向の出力デバイス(ディスク・ファイル以外)を使用する場合のみの制約です。
バイナリ・レコード形式は標準のLogMiner出力形式に基づきます。ただし、一部のフィールドは、コミット・アクション・レコードでは使用されません。このレコードのバイナリ形式と内容を「表1-20」に示します。このレコード・タイプはすべての出力データ形式で書き込まれます。
表1-20 コミット・レコードの内容 フィールド 長さ(バイト) 内容 ACTION 1 C RELATION 31 0 RECORD_TYPE 4 0 DATA_LEN 2 RM_TID_LEN、AERCP_LEN、RM_TID、AERCPの長さ NBV_LEN 2 0 TID 4 トランザクション(アタッチ)ID PID 4 プロセスID START_TAD 8 トランザクション開始日時 COMMIT_TAD 8 トランザクション・コミット日時 TSN 8 トランザクションID RM_TID_LEN 4 グローバルTIDの長さ AERCP_LEN 4 AERCP情報の長さ RM_TID RM_TID_LEN グローバルTID AERCP AERCP_LEN 再起動制御情報 RDB$LM_USERNAME 12 ユーザー名
オリジナルのトランザクションが分散2フェーズ・トランザクションに含まれていた場合、RM_TIDコンポーネントはグローバル・トランザクション・マネージャ(XAまたはDDTM)の一意トランザクションIDです。そうでない場合、このフィールドにはバイナリの0が含まれます。
AIJ Extract Recovery Control Point(AERCP)情報は、データベースとアフター・イメージ・ジャーナル・ファイルのスコープ内でこのトランザクションを一意に識別するために使用されます。.aij順序番号と、最後のマイクロ・クワイエット・ポイントのVBNおよびTSNが含まれます。これは、ジャーナル・シーケンスの特定のポイントを再起動するためにContinuous LogMinerプロセスによって使用されます。- Delete
NoDelete
Deleteを指定すると、削除前のレコードの内容がaijファイルから抽出されます。NoDeleteを指定すると、削除前のレコードの内容は抽出されません。デフォルトはDeleteです。- Modify
NoModify
Modifyを指定すると、変更または追加されたレコードの内容が.aijファイルから抽出されます。NoModifyを指定すると、変更または追加されたレコードの内容は抽出されません。デフォルトはModifyです。
IO_Buffers=integer
出力データ・ファイルのために使用されるI/Oバッファの数を指定します。デフォルトのバッファ数は2であり、通常はこの値で適切です。十分に高速のI/Oサブシステム・ハードウェアを使用する場合は、バッファを追加することでパフォーマンスが向上する可能性があります。ただし、バッファ数を増やすと、消費される仮想メモリーとプロセスの作業セットも増加します。Log
Nolog
.aijファイルの抽出をSYS$OUTPUTまたはOutput修飾子で指定した宛先に報告することを指定します。アクティビティを記録しているときは、Log修飾子の出力によって、コミットまたはロールバックされたトランザクション数が示されます。デフォルトでは、DCL VERIFYフラグの設定が使用されます。このフラグはDCL SET VERIFYコマンドによって制御されます。Options=options-list
次のオプションを指定できます。
- File=file-spec
表と出力先のリストを含むオプション・ファイル。Table修飾子のかわり、あるいはTable修飾子と一緒にオプション・ファイルを使用して、抽出対象の表を指定します。オプション・ファイルの各行には、前にTable=と付けて表名を指定する必要があります。表名の後には、Output=または、Callback_Module=およびCallback_Routine=のいずれかで出力先を指定します。次に例を示します。
TABLE=tblname,OUTPUT=outfile TABLE=tblname,CALLBACK_MODULE=image,CALLBACK_ROUTINE=routine
Table修飾子のRecord_Definition=file-specオプションを使用して、出力データのレコード定義ファイルを作成します。デフォルト・ファイル・タイプは.rrdです。デフォルト・ファイル名は表名です。
Table修飾子のTable_Definition=file-specオプションを使用して、トランザクション・データを保持する表を作成するためのSQL文を含むファイルを作成します。デフォルト・ファイル・タイプは.sqlです。デフォルト・ファイル名は表名です。
Options=File修飾子の各オプションは詳しく指定し(省略表記はできません)、等号(=)と値文字列を後に指定する必要があります。値文字列の後には、カンマか行端マーカーを付ける必要があります。後にハイフンを付けると行の継続を指定できます。コメントは感嘆符(!)を使用して指定できます。
表名の指定でアスタリスク(*)とパーセント記号(%)のワイルド・カード文字を使用して、指定した構成要素と一致するすべての表を選択できます。アスタリスクは0以上の文字、パーセント記号は1文字と一致します。
ワイルド・カード文字を含む表名指定では、文字列の最初の文字がシャープ記号(#)の場合、ワイルド・カード指定と一致しない文字列が検索されます。これにより、ワイルド・カード指定を使用して表を除外できるようになります。シャープ記号の指定が評価されるのは、表名の指定にアスタリスクかパーセント記号が含まれる場合のみです。
たとえば、表名の指定#FOO%は、長さが4文字で先頭が文字列FOOではないすべての表名を選択することを指定します。- Shared_Read
入力アフター・イメージ・ジャーナル・バックアップ・ファイルをRMS共有ロック指定で開くことを指定します。- Dump
入力メタデータ・ファイルの内容を書式設定して表示することを指定します。通常、この情報はデバッグ・ツールとして使用されます。
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
BeforeおよびSince修飾子がトランザクション・コミットの時刻に基づいてトランザクションを選択することを指定します。
- Start_Transaction
BeforeおよびSince修飾子がトランザクション開始時刻に基づいてトランザクションを選択することを指定します。
日付選択のデフォルトはCommit_Transactionです。
Since=date-time
抽出対象のトランザクションの開始時刻を指定します。Select修飾子に指定した値によって異なりますが、Sinceに指定した日付以降にコミットまたは開始されたトランザクションが選択されます。Sinceに指定した日付よりも前にコミットまたは開始されたトランザクションの情報は、出力には含まれません。Sort_Workfiles=integer
ソート作業ファイルの数を指定します。ソート作業ファイルのデフォルト数は2です。大きなトランザクションを抽出するとき、使用するソート作業ファイルの数を増やすと、I/Oロードを複数のディスク・デバイスに分散することでパフォーマンスが向上することがあります。SORTWORKn(nは数値0〜9)論理名を使用して、ソート作業ファイルの場所を指定します。Statistics_Interval=integer
アンロード操作の進捗を確認できるように統計を定期的に表示することを指定します。次のような統計が表示されます。
- 経過時間
- CPU時間
- バッファされたI/O
- 直接I/O
- ページ・フォルト
- 1つの表についてアンロードされたレコード数
- すべての表について抽出された合計レコード数
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を指定できます。
- Callback_Module=image-name, Callback_Routine=routine-name
LogMinerプロセスがOpenVMSライブラリ・ルーチンLIB$FIND_IMAGE_SYMBOLを使用して、指定した共有可能イメージをアクティブ化し、指定したエントリ・ポイントのルーチン名を探します。このルーチンは抽出されるレコードごとにコールされます。最終コールはActionフィールドをEに設定した状態(出力ストリームの最後を示す)で行われます。これらのオプションは一緒に指定する必要があります。- Control
Control表オプションを使用して、抽出データをOracleデータベースにロードするためにSQL*Loaderで使用できる出力ファイルを生成します。このオプションは、固定テキスト形式のデータ・ファイルと組み合せて使用する必要があります。Control表オプションは、コマンドラインとオプション・ファイルのどちらにも指定できます。- Output=file-spec
Outputファイル指定があると、指定した場所にアンロード・レコードが書き込まれます。- Record_Definition=file-spec
Record_Definition=file-specオプションは、出力データのレコード定義ファイルを作成するために使用できます。デフォルト・ファイル・タイプは.rrdです。デフォルト・ファイル名は表名です。- Table_Definition=file-spec
Table_Definition=file-specオプションを使用して、トランザクション・データを保持する表を作成するためのSQL文を含むファイルを作成します。デフォルト・ファイル・タイプは.sqlです。デフォルト・ファイル名は表名です。
他の修飾子は最後に指定したもののみがアプリケーションで使用されますが、Table修飾子は異なり、RMU Unload After_Journalコマンドに複数回指定できます。それぞれのTable修飾子で別の表を指定する必要があります。
Trace
NoTrace
.aijファイルのアンロードをトレースすることを指定します。デフォルトはNotraceです。アンロード操作をトレースすると、Trace修飾子の出力によって、.aijファイルのトランザクションがTSNによって識別され、アンロード・プロセスでOracle RMUが各トランザクションに何を実行したかが記述されます。Trace修飾子と一緒にLog修飾子を指定できます。
- データベースに対してRMU Unload After_Journalコマンドを使用するには、そのデータベースのルート・ファイルのアクセス制御リスト(ACL)にRMU$DUMP権限が必要です。あるいは、OpenVMS SYSPRVまたはBYPASS権限が必要です。
- Oracle Rdbのアフター・イメージ・ジャーナルでは、コミット済トランザクションでデータベースに対して行われたすべての変更を、順次ログすなわちジャーナル・ファイルに記録することで、データの整合性を守ります。データベースのリストアおよびリカバリ戦略の一環として、アフター・イメージ・ジャーナルを有効にして、全体バックアップ操作の間のデータベース・トランザクション・アクティビティを記録することをお薦めします。LogMiner for Rdbに加えて、アフター・イメージ・ジャーナル・ファイルが、いくつかのデータベース・パフォーマンス拡張機能(高速コミット、行キャッシュ、ホット・スタンバイ機能など)を有効にするために使用されます。
- Continuous修飾子を指定しないと、アフター・イメージ・ジャーナル・ファイルのバックアップ・コピーから変更済レコードしか抽出できません。このファイルはRMU Backup After_Journalコマンドを使用して作成します。
RMU Optimize After_Journalコマンドで最適化された.aijファイルからは抽出できません。- 抽出プロセスの一部として、Oracle RMUは、抽出されたジャーナル・レコードをソートして、重複したレコード更新を削除します。.aijファイルの抽出では、OpenVMSのソートおよびマージ・ユーティリティ(SORT/MERGE)を使用して、大きなトランザクションのジャーナル・レコードをソートするため、SORT/MERGEで使用される作業ファイルの数と場所を変更することにより、ソート操作の効率を高めることができます。作業ファイルの数は、RMU Unload After_JournalコマンドのSort_Workfiles修飾子で制御されます。許可される値は1〜10、デフォルト値は2です。これらの作業ファイルの場所は、SORTWORKn論理名(nは0〜9の数)を使用してデバイス指定に指定できます。SORT/MERGEの使用方法の詳細は、OpenVMSのドキュメント・セットを参照してください。Oracle Rdb論理名の使用方法の詳細は、『Oracle Rdb7 Guide to Database Performance and Tuning』を参照してください。
- 大きなトランザクションを抽出するとき、RMU Unload After_Journalコマンドによって一時作業ファイルが作成されることがあります。.aijのロールフォワード一時作業ファイルを、現在のデフォルト・ディレクトリとは異なるディスクとディレクトリの場所にリダイレクトできます。これは、別のディレクトリをLNM$FILE_DEV名前表のRDM$BIND_AIJ_WORK_FILE論理名に割り当てて行います。このようにすると、デフォルトのディスクで発生する可能性があるI/Oボトルネックの軽減に役立ちます。
- 各論理が別のデバイスまたはディレクトリを指すように論理RDB$BIND_AIJ_WORK_FILE1、RDB$BIND_AIJ_WORK_FILE2、... RDB$BIND_AIJ_WORK_FILEnを定義することで、検索リストを指定できます。数値は1から始めて、間を空けずに順に増やす必要があります。デバイスがいっぱいというエラーのためにAIJファイルが作成できないとき、Oracle Rdbは次の順次作業ファイルの論理を変換して、検索リストで次のデバイスを探します。RDB$BIND_AIJ_WORK_FILEを定義している場合は、これが最初に使用されます。
- RMU Unload After_Journalコマンドは、ディスク上のバックアップ.aijファイル、またはOld_File形式のテープ上のバックアップ.aijファイルを読み取ることができます。
- アフター・イメージ・ジャーナル・ファイルから抽出する1つ以上の表を選択できます。Table修飾子に指定したすべての表とOptionsファイルに指定したすべての表を組み合せて、出力ストリームの1つのリストが生成されます。特定の表は1回しか指定できません。厳密に同じ出力ストリーム指定を指定する(つまり、同一のファイル指定を使用する)ことで、複数の表を同じ出力先に書き込むことができます。
- アンロード操作が完了すると、RMUは抽出統計の情報を含むいくつかのDCLシンボルを作成します。抽出した表ごとに、RMUによって次のシンボルが作成されます。
- RMU$UNLOAD_DELETE_COUNT_tablename
- RMU$UNLOAD_MODIFY_COUNT_tablename
- RMU$UNLOAD_OUTPUT_tablename
シンボルのtablename構成要素は表の名前です。複数の表が1つの操作で抽出されるときは、シンボルのセットが複数作成されます。シンボルRMU$UNLOAD_MODIFY_COUNT_tablenameおよびRMU$UNLOAD_DELETE_COUNT_tablenameの値は、変更行と削除行について返されるレコード数を含む文字列です。RMU$UNLOAD_OUTPUT_tablenameシンボルは、出力先の詳細ファイル指定を示す文字列です。または、出力先がアプリケーション・コールバック・ルーチンである場合は、共有可能イメージ名とルーチン名を示す文字列です。- Callback_ModuleおよびCallback_Routineオプションを使用するときは、LogMinerプロセスがルーチンをコールできるように、汎用シンボルまたはエントリ・ポイントを使用して共有可能イメージを指定する必要があります。共有可能イメージの作成の詳細は、OpenVMSのドキュメントのLinkerユーティリティの説明を参照してください。
- Callback_Routineは、出力レコードごとに1回ずつコールされます。Callback_Routineには次の2つのパラメータが渡されます。
- 出力レコードの長さ(longword値)
- レコード・バッファへのポインタ
レコード・バッファは、出力先に書き込まれるのと同じフィールドと長さのデータ構造です。- Oracle RMUイメージは認識済イメージとしてインストールされるため、共有可能イメージも認識済イメージであることが必要です。OpenVMSインストール・ユーティリティを使用して、共有可能イメージを認識させます。場合によっては、抽出の終了時に必要なクリーンアップ処理を実行する終了ハンドラを設定する必要があります。
- セグメント文字列データ(BLOB)は、LogMinerプロセスを使用して抽出できません。セグメント文字列データはデータベース・キーを介して実表の行に関連するため、抽出すべきデータを判別する簡単な方法がありません。また、抽出列のデータ型がLIST OF BYTE VARYINGからBIGINTに変更されます。この列にはオリジナルのBLOBデータのDBKEYが含まれます。このため、この列の内容は信頼できないと考える必要があります。ただし、フィールド定義そのものは、オリジナルのセグメント文字列データのデータベース・キーを表すquadword整数として抽出されます。生成される表定義またはレコード定義ファイルでは、セグメント文字列データ型はLogMiner for Rdb機能ではサポートされないことを示すコメントが追加されます。
- SQL TRUNCATE TABLE文を使用して表から削除されるレコードは、抽出されません。SQL TRUNCATE TABLE文では、データベースから削除される各データ・レコードはジャーナル処理されません。
- SQL ALTER DATABASEコマンドでDROP STORAGE AREA句とCASCADEキーワードを使用して表から削除されるレコードは、抽出されません。このプロセスで削除されるどのデータもジャーナル処理されません。
- SQL DROP TABLE文を使用した表の削除によって削除されるレコードは、抽出されません。SQL DROP TABLE文では、データベースから削除される各データ・レコードはジャーナル処理されません。
- RDMS$CREATE_LAREA_NOLOGGING論理が定義されているとき、表が作成されてからトランザクションがコミットされるまでの間のDML操作は抽出できません。
- バーティカル・レコード・パーティション(VRP)機能を使用する表は、LogMiner機能を使用して抽出できません。現在、LogMinerソフトウェアではこのような表が検出されません。Oracle Rdbの将来のリリースでは、バーティカル・パーティション表を検出して、アクセスを拒否する予定です。
- バイナリ形式出力では、出力ファイルのVARCHARフィールドに空白が埋め込まれません。VARCHARデータ型は、2バイトのカウント・フィールドと固定長のデータ・フィールドとして抽出されます。2バイトのカウント・フィールドは、固定長データ・フィールドの有効文字数を示します。データ・フィールドのその他の内容は予測できません。
- 表定義がアフター・イメージ・ジャーナル・ファイル内で変更されているとき、表に対する変更を抽出できません。表のデータ定義言語(DDL)変更は、抽出中の.aijファイルでは許可されません。.aijファイルのすべてのレコードは、現在のレコード・バージョンであることが必要です。LogMiner for Rdbを使用して抽出予定の表に対してDDL操作を実行する場合は、次のようにする必要があります。
- アフター・イメージ・ジャーナル・ファイルをバックアップします。
- RMU Unload After_Journalコマンドを使用して.aijファイルを抽出します。
- DDL変更を行います。
- LogMiner機能を使用するときは、OpenVMS Alpha High Performance Sort/Mergeユーティリティ(論理名SORTSHRをSYS$SHARE:HYPERSORTに定義して選択)を使用しないでください。HYPERSORTでは、LogMinerで必要なライブラリ・ソート・ルーチンのサブセットしかサポートされません。SORTSHR論理名をHYPERSORTに定義しないようにしてください。
- RMU Unload After_Journalコマンドで使用されるメタデータ情報ファイルは、内部バイナリ形式です。この内容と形式はドキュメント化されておらず、他のユーティリティで直接利用することもできません。メタデータ情報ファイルの内容と形式は、RMU Unload After_Journalユーティリティの所定バージョン固有のものです。Oracle Rdbの新しいバージョンや更新がリリースされると、多くの場合、メタデータ情報ファイルを再作成する必要が生じます。メタデータ情報ファイルの書込みと読取りには同じバージョンのOracle Rdbを使用する必要があります。RMU Unload After_Journalコマンドは、メタデータ情報ファイルの形式とバージョンを確認し、バージョンが一致しない場合にはエラー・メッセージを発行します。
- デバッグのためにメタデータ情報ファイルの内容を書式設定して表示するには、Options=Dump修飾子とRestore_Metadata修飾子を一緒に使用します。このダンプは、Oracleサポート・サービスの技術者の問題分析に役立つこともあります。メタデータ情報ファイルの内容と形式は変更されることがあります。
- Output修飾子とStatistics_Interval修飾子を両方使用する場合、ログ、トレースおよび統計情報のために使用される出力ストリームが、統計間隔ごとにディスクにフラッシュされます(RMS $FLUSHサービスを使用)。これによって、トレースおよびログ情報の出力ファイルが定期的にディスクに書き込まれるようになります。
- 入力バックアップ・アフター・イメージ・ジャーナル・ファイルをContinuous修飾子と一緒にコマンドラインに指定できます。指定したアフター・イメージ・ジャーナル・バックアップ・ファイルは、オフライン・モードで処理されます。ファイルの処理が終了すると、RMU Unload After_Journalコマンドはオンライン・モードに切り替わり、アクティブなオンライン・ジャーナルが処理されます。
- 入力アフター・イメージ・ジャーナル・ファイルをコマンドラインに指定しないと、Continuous LogMinerは、一番前に変更されたオンライン・アフター・イメージ・ジャーナル・ファイルの先頭から抽出を開始します。Restart=修飾子は、抽出する最初のトランザクションの制御に使用できます。
- Continuous LogMinerでは、固定サイズの循環アフター・イメージ・ジャーナル・ジャーナルが必要です。
- アフター・イメージ・ジャーナル・ファイルは、aijファイルにContinuous LogMinerチェックポイントがある場合はバックアップできません。Continuous LogMinerは、抽出しているオンライン.aijファイルの物理EOFにチェックポイントを移動します。
- すべてのレコードがすべてのデータベース・ユーザーによって書き込まれたことを確認するため、Continuous LogMinerプロセスは次のライブ・ジャーナル・ファイルに切り替えません。切り替えるのは、そのファイルに別のプロセスが書き込んでからです。Continuous LogMinerプロセスが.aijバックアップ・ファイルのリストを処理している間は、ライブ・ジャーナルをバックアップしないでください。
- バックアップ・アフター・イメージ・ジャーナル・ファイルをコマンドラインに指定して、Continuous修飾子を指定する場合、オンライン・ジャーナル・ファイルのジャーナル順序番号は、バックアップ・ジャーナル・ファイルの番号から連続して増加する必要があります。
RMU Unload After_Journal /Continuousコマンドによる処理の際にアフター・イメージ・ジャーナル・ファイルのシーケンスを維持するには、コマンドが開始してからContinuous LogMinerプロセスがライブ・オンライン・アフター・イメージ・ジャーナルに到達するまでの間、アフター・イメージ・ジャーナル・バックアップ操作を試行しないことが重要です。- 複数のContinuous LogMinerプロセスを1つのデータベースで同時に実行できます。各Continuous LogMinerプロセスは独立して作動します。
- Continuous LogMinerがライブ・アフター・イメージ・ジャーナル・ファイルを読み取るのは、ジャーナルへの書込み処理の直後です。このため、ジャーナルが存在するディスク・デバイスのI/Oロードが増加することがあります。Continuous LogMinerは、最高水位標ロックをチェックして、ジャーナルに書込みがあったかどうか、また最高位の書込みブロックの位置がどこかを判別することで、不要なジャーナルI/Oを最小限に抑えようとします。
- バーティカル・パーティション表は抽出できません。
例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)