分析するREDOデータにアクセスするには、V$LOGMNR_CONTENTS
ビューを問い合せます。(V$LOGMNR_CONTENTS
を問い合せるには、SYSDBA
またはLOGMINING
権限が必要なことに注意してください。)このビューは、データベースに対して行われた変更に関する次のような履歴情報を提供します(次に示す以外の情報もあります)。
データベースに対して行われた変更のタイプ: INSERT
、UPDATE
、DELETE
またはDDL
(OPERATION
列)。
変更が行われたSCN(SCN
列)。
変更がコミットされたSCN(COMMIT_SCN
列)。
変更が属するトランザクション(XIDUSN
列、XIDSLT
列およびXIDSQN
列)。
変更されたオブジェクトの表とスキーマの名前(SEG_NAME
列およびSEG_OWNER
列)。
変更を行うDDL文またはDML文を発行したユーザーの名前(USERNAME
列)。
SQL DML文による変更の場合では、REDOレコードを生成するために使用されたSQL DMLと等価のSQL DML(必ずしも同一ではない)を表すように再構築されたSQL文(SQL_REDO
列)。
パスワードがSQL_REDO
列にある文に含まれる場合のパスワードの暗号化。DDL文に対応するSQL_REDO
列の値は、REDOレコードを生成するために使用されるSQL DDLと常に同一です。
SQL DML変更による変更の場合では、変更を元に戻すために必要なSQL DML文を示すように再構築されたSQL文(SQL_UNDO
列)。
DDL文に対応するSQL_UNDO
列は常にNULL
です。一部のデータ型とロールバック操作についても、SQL_UNDO
列はNULL
です。
注意:
LogMinerは透過的データ暗号化(TDE)をサポートしているため、対象オブジェクト用のメタデータがLogMinerデータ・ディクショナリに含まれ、適切なマスター・キーがOracleウォレットにある場合は、暗号化された列(更新中の暗号化された列を含む)が含まれる表で実行されたDML操作がV$LOGMNR_CONTENTS
に表示されます。ウォレットはオープンされている必要があります。オープンされていない場合は、V$LOGMNR_CONTENTS
では関連付けられたREDOレコードを解釈することができません。データベースがオープンされていない(読取り専用、または読取り/書込み可能のいずれかの)場合、TDEはサポートされません。TDEの詳細は、『Oracle Database Advanced Securityガイド』を参照してください。
V$LOGMNR_CONTENTSの問合せの例
たとえば、Ronという名前のユーザーがoe.orders
表で行ったすべての削除操作を調べるとします。次のようなSQL問合せを発行します。
SELECT OPERATION, SQL_REDO, SQL_UNDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'OE' AND SEG_NAME = 'ORDERS' AND OPERATION = 'DELETE' AND USERNAME = 'RON';
次の出力が生成されます。画面上での書式設定は、ここに示したものと異なる場合があります。
OPERATION SQL_REDO SQL_UNDO DELETE delete from "OE"."ORDERS" insert into "OE"."ORDERS" where "ORDER_ID" = '2413' ("ORDER_ID","ORDER_MODE", and "ORDER_MODE" = 'direct' "CUSTOMER_ID","ORDER_STATUS", and "CUSTOMER_ID" = '101' "ORDER_TOTAL","SALES_REP_ID", and "ORDER_STATUS" = '5' "PROMOTION_ID") and "ORDER_TOTAL" = '48552' values ('2413','direct','101', and "SALES_REP_ID" = '161' '5','48552','161',NULL); and "PROMOTION_ID" IS NULL and ROWID = 'AAAHTCAABAAAZAPAAN'; DELETE delete from "OE"."ORDERS" insert into "OE"."ORDERS" where "ORDER_ID" = '2430' ("ORDER_ID","ORDER_MODE", and "ORDER_MODE" = 'direct' "CUSTOMER_ID","ORDER_STATUS", and "CUSTOMER_ID" = '101' "ORDER_TOTAL","SALES_REP_ID", and "ORDER_STATUS" = '8' "PROMOTION_ID") and "ORDER_TOTAL" = '29669.9' values('2430','direct','101', and "SALES_REP_ID" = '159' '8','29669.9','159',NULL); and "PROMOTION_ID" IS NULL and ROWID = 'AAAHTCAABAAAZAPAAe';
この出力は、ユーザーRonがoe.orders
表から2行を削除したことを示しています。再構築されたSQL文は、Ronが発行した実際の文と等価ですが、必ずしも同一とはかぎりません。その理由は、元のWHERE
句の記録がREDOログ・ファイルになく、そのため、LogMinerは、削除(あるいは更新または挿入)された行のみを個別に表示するためです。
したがって、両方の行の削除に1つのDELETE
文のみが関係している場合でも、V$LOGMNR_CONTENTS
の出力にはそれが反映されません。そのため、実際のDELETE
文は、DELETE FROM OE.ORDERS WHERE CUSTOMER_ID ='101
'またはDELETE FROM OE.ORDERS WHERE PROMOTION_ID = NULL
のいずれかです。