この章では、データベース・アプリケーションにおけるOracle Flashback Technologyの使用について説明します。
内容は次のとおりです。
Oracle Flashback TechnologyとはOracle Database機能のグループの1つであり、Point-in-Timeメディア・リカバリを使用しなくても、データベース・オブジェクトの過去の状態を表示したり、データベース・オブジェクトを前の状態に戻すことができます。
フラッシュバック機能を使用すると、次のことができます。
過去のデータを戻す問合せを実行します。
データベースに対する変更の詳細履歴を示したメタデータを戻す問合せを実行します。
表または行を前の時点にリカバリします。
トランザクション・データの変更を自動的に追跡およびアーカイブします。
データベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックします。
Oracle Flashback機能では、自動UNDO管理(AUM)システムにより、トランザクションに関するメタデータおよび履歴データが取得されます。フラッシュバック機能はUNDOデータに依存します。UNDOデータは、個々のトランザクションの結果のレコードです。たとえば、ユーザーが給与を1000から1100に変更するUPDATE
文を実行すると、Oracle DatabaseによってUNDOデータに値1000が格納されます。
UNDOデータは永続的であり、データベース停止時にも失われません。これが保持されるのは、undo_retention
に指定された期間か、自動UNDO管理(AUM)が存在する場合はチューニングされたUNDO保存期間までです。フラッシュバック機能を使用すると、UNDOデータを使用して過去のデータを問い合せたり、論理的な損害をリカバリしたりすることができます。UNDOデータは、フラッシュバック機能以外でも、Oracle Databaseによって次の処理に使用されます。
アクティブなトランザクションのロールバック
データベースまたはプロセス・リカバリを使用した終了済トランザクションのリカバリ
SQL問合せに対する読取り一貫性の提供
注意: CREATE TABLE 文の実行後、トランザクションをコミットするために少なくとも15秒待機して、Oracle Flashback機能(特にOracle Flashback Version Query)にそのトランザクションが反映されるようにします。 |
内容は次のとおりです。
フラッシュバック機能のその他の概要は、『Oracle Database概要』を参照してください。
アプリケーション開発では、次のフラッシュバック機能を使用して、履歴データに関するレポートを作成したり、誤った変更を元に戻すことができます。(この機能は、データベース・ユーザーまたは管理者として対話形式でも使用できます。)
Oracle Flashback Query
この機能を使用して、SELECT
文のAS
OF
句で指定した過去のある時点のデータを取得できます。詳細は、16.3項「Oracle Flashback Query (SELECT AS OF)の使用」を参照してください。
Oracle Flashback Version Query
この機能を使用して、特定の時間間隔内のメタデータおよび履歴データを取得します(たとえば、ある表の、特定の時間間隔内に存在していたすべての行を表示します)。各行バージョンに関するメタデータには、開始時間と終了時間、変更処理のタイプおよび行バージョンを作成したトランザクションの識別情報が含まれます。Oracle Flashback Version Queryを作成するには、SELECT
文でVERSIONS
BETWEEN
句を使用します。詳細は、16.4項「Oracle Flashback Version Queryの使用」を参照してください。
Oracle Flashback Transaction Query
この機能を使用して、特定の時間間隔内における特定のトランザクションまたはすべてのトランザクションのメタデータおよび履歴データを取得できます。Oracle Flashback Transaction Queryを実行するには、静的データ・ディクショナリ・ビューFLASHBACK_TRANSACTION_QUERY
から選択します。詳細は、16.5項「Oracle Flashback Transaction Queryの使用」を参照してください。
通常、Oracle Flashback Transaction Queryは、対象となる行のトランザクションIDを戻すOracle Flashback Version Queryと併用します(16.6項「Oracle Flashback Transaction QueryとOracle Flashback Version Queryの併用」を参照してください)。
DBMS_FLASHBACKパッケージ
この機能は、ある時点の最新データを検査できるよう、Oracle Database内部の時計を過去のある時点まで戻す場合、あるいはデータベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックする場合に使用できます(「フラッシュバック・トランザクション」を参照してください)。詳細は、16.7項「DBMS_FLASHBACKパッケージの使用」を参照してください。
フラッシュバック・トランザクション
フラッシュバック・トランザクションは、データベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックする場合に使用します。このリカバリ操作では、UNDOデータを使用して対応する補正トランザクションを作成および実行します。このトランザクションによって影響のあったデータが元の状態に戻ります(フラッシュバック・トランザクションは、DBMS_FLASHBACK
パッケージの一部です)。詳細は、16.7項「DBMS_FLASHBACKパッケージの使用」を参照してください。
フラッシュバック・データ・アーカイブ
フラッシュバック・データ・アーカイブを使用して、フラッシュバック・アーカイブが有効化された表に対する変更バージョンの履歴を自動的に追跡およびアーカイブすると、スナップショットが古すぎるというエラーが発生することなくデータベース・オブジェクトの各バージョンへのSQLレベルのアクセスが保証されます。詳細は、16.9項「フラッシュバック・データ・アーカイブの使用」を参照してください。
次のフラッシュバック機能は、主としてデータ・リカバリ用です。通常、この機能は、データベース管理者としてのみ使用します。
この章では、16.1.1項「アプリケーション開発機能」に重点を置いています。データベース管理機能の詳細は、『Oracle Database管理者ガイド』および『Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド』を参照してください。
Oracle Flashback Table
表の状態を以前の特定の時点までリカバリする場合に、この機能を使用します。データベースがオンラインの間は表のリストアが可能であり、指定した表に対する変更のみ元に戻すことができます。
Oracle Flashback Drop
削除された表をリカバリする場合に、この機能を使用します。この機能によって、DROP
TABLE
文の影響が無効になります。
Oracle Flashback Database
リカバリ領域を使用してデータベースをその時点まで迅速に戻す場合に、この機能を使用します。データベースのバックアップをリストアする必要がないため、処理が高速です。
アプリケーションでフラッシュバック機能を使用するには、まず、ユーザーまたはデータベース管理者は次の各項で説明する構成タスクを実行する必要があります。
自動UNDO管理(AUM)に関してデータベースを構成するには、ユーザーまたはデータベース管理者は次を実行する必要があります。
フラッシュバック操作に必要なデータを保持するために十分な領域を持つUNDO表領域を作成します。
データの更新回数が増加するほど、より多くの領域が必要になります。データベース管理者は通常、必要な領域を計算します。
『Oracle Database管理者ガイド』の説明に従ってAUMを有効にします。次のデータベース初期化パラメータを設定します。
UNDO_MANAGEMENT
UNDO_TABLESPACE
UNDO_RETENTION
固定サイズのUNDO表領域の場合、Oracle Databaseでは自動的にシステムを調整して、UNDO表領域に最適なUNDOを保持します。
自動的に拡張可能なUNDO領域の場合、Oracle Databaseでは、最長の問合せ期間よりも長いUNDOデータ、およびUNDO_RETENTION
パラメータで指定されたUNDO保持の低いしきい値が保持されます。
注意: V$UNDOSTAT .TUNED_UNDORETENTION を問い合せて、現在のUNDO表領域に対してUNDOが保持される期間を決定できます。V$UNDOSTAT の詳細は、『Oracle Databaseリファレンス』を参照してください。 |
UNDO_RETENTION
の設定は、期限切れになっていないUNDOデータが廃棄されないことを保証するものではありません。システムの領域が不十分な場合、Oracle Databaseでは期限切れになっていないUNDOが新しく生成されたUNDOによって上書きされる場合があります。
UNDO表領域に対しRETENTION
GUARANTEE
句を指定して、期限切れになっていないUNDOデータが廃棄されないようにします。
参照: UNDO表領域の作成とAUMの有効化の詳細は、『Oracle Database管理者ガイド』を参照してください。 |
Oracle Flashback Transaction Query機能についてデータベースを構成するには、ユーザーまたはデータベース管理者は次を実行する必要があります。
Oracle Databaseがバージョン10.0と互換性があることを確認します。
サプリメンタル・ロギングを有効にします。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
フラッシュバック・トランザクション機能についてデータベースを構成するには、ユーザーまたはデータベース管理者は次を実行する必要があります。
データベースがマウントされているが、開かれていない状態で、ARCHIVELOG
を有効にします。
ALTER DATABASE ARCHIVELOG;
1つ以上のアーカイブ・ログを開きます。
ALTER SYSTEM ARCHIVE LOG CURRENT;
必要最低限の主キーのサプリメンタル・ロギングが有効になっていない場合、これを有効にします。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
外部キーの依存性を追跡する場合は、外部キーのサプリメンタル・ロギングを有効にします。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS;
注意: 外部キーの制約が非常に多い場合、外部キーのサプリメンタル・ロギングを有効にしても、パフォーマンス・ペナルティに見合う効果は得られない可能性があります。 |
表の特定のLOB列に対するフラッシュバック操作を可能にするには、ALTER
TABLE
文をRETENTION
オプションとともに使用します。
LOB列のUNDOデータは膨大になる場合があるため、フラッシュバック操作で使用するLOB列を定義する必要があります。
参照: LOB記憶域およびRETENTION パラメータの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。 |
ユーザーまたはデータベース管理者は、次のフラッシュバック機能を使用する必要があるユーザー、ロールまたはアプリケーションに対して権限を付与する必要があります。GRANT
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
Oracle Flashback QueryおよびOracle Flashback Version Query
問合せ中に特定のオブジェクトへのアクセスを許可するには、そのオブジェクトに関するFLASHBACK
権限と、READ
またはSELECT
権限を付与します。
すべての表に対する問合せを許可するには、FLASHBACK
ANY
TABLE
権限を付与します。
Oracle Flashback Transaction Query
SELECT
ANY
TRANSACTION
権限を付与します。
Oracle Flashback Transaction Queryによって取得したUNDO SQLコードの実行を許可するには、特定の表に対するSELECT
、UPDATE
、DELETE
およびINSERT
権限を付与します。
DBMS_FLASHBACKパッケージ
DBMS_FLASHBACK
パッケージの機能にアクセスできるようにするには、DBMS_FLASHBACK
に対するEXECUTE
権限を付与します。
フラッシュバック・データ・アーカイブ
特定のユーザーが特定のフラッシュバック・データ・アーカイブを使用してデータ・アーカイブを表にフラッシュバックできるようにするには、フラッシュバック・データ・アーカイブに対するFLASHBACK
ARCHIVE
オブジェクト権限をそのユーザーに付与します。FLASHBACK
ARCHIVE
オブジェクト権限を付与するには、SYSDBA
としてログオンしているか、FLASHBACK
ARCHIVE
ADMINISTER
システム権限が必要です。
次の文の実行を許可するには、FLASHBACK
ARCHIVE
ADMINISTER
システム権限を付与します。
CREATE
FLASHBACK
ARCHIVE
ALTER
FLASHBACK
ARCHIVE
DROP
FLASHBACK
ARCHIVE
FLASHBACK
ARCHIVE
ADMINISTER
システム権限を付与するには、SYSDBA
としてログオンしている必要があります。
CREATE
FLASHBACK
ARCHIVE
文またはALTER
FLASHBACK
ARCHIVE
文を使用して、デフォルトのフラッシュバック・データ・アーカイブを作成するには、SYSDBA
としてログオンしている必要があります。
フラッシュバック・データ・アーカイブで有効にされている表のフラッシュバック・データ・アーカイブを無効にするには、SYSDBA
としてログオンしているか、FLASHBACK
ARCHIVE
ADMINISTER
システム権限が必要です。
Oracle Flashback Queryを使用するには、SELECT
文でAS
OF
句を使用します。Oracle Flashback Queryにより、過去のある時点で存在していたデータを取得できます。問合せでは、タイムスタンプまたはシステム変更番号(SCN)を使用することで、過去の時点が明示的に参照されます。その時点で最新であったコミット済データが戻されます。
Oracle Flashback Queryは、次のような場合に使用します。
失われたデータをリカバリしたり、コミット済の不適切な変更を取り消す場合。
たとえば、誤って行を削除または更新し、コミットしていても、すぐに誤りを元に戻すことができます。
現在のデータを過去の特定の時点の対応するデータと比較する場合。
たとえば、前日からのデータの変更を示す日報を作成できます。表データの個々の行の比較、または行セットの共通部分や結合の検索が可能です。
特定の時点でのトランザクション・データの状態を確認する場合。
たとえば、特定の日の預金残高を確認できます。
特定の時点、またはユーザー定義の有効期間内に有効なデータを選択します。
たとえば、特定のタイムスタンプの時点、または指定された有効期間内で指定の開始時刻から終了時刻の間の、有効な従業員情報を持つ従業員を見つけることができます。(詳細は、1.9.4項「時間的な有効性のサポート」を参照してください。)
アプリケーションの設計を簡略化する場合。一時データの類を格納する必要性をなくすことにより簡略化します。
Oracle Flashback Queryにより、データベースから直接過去のデータを取得できます。
レポート生成ツールなどのパッケージ・アプリケーションを過去のデータに適用します。
アプリケーションにセルフサービス・エラー修正を提供し、ユーザーが自分のエラーを元に戻して修正できるようにする場合。
内容は次のとおりです。
SELECT
AS
OF
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
たとえば、午後12時30分に従業員Chungの行がemployee
表から削除されていることに気付き、午前9時30分にはこのデータがデータベース内に正しく格納されていたことを知っているとします。この場合、Oracle Flashback Queryを使用して午前9時30分の表の内容を調べ、失われたデータを見つけることができます。必要に応じて失われたデータをリストアできます。
例16-1では、2004年4月4日午前9時30分におけるChung
のレコードの状態が取得されます。
例16-1 Oracle Flashback Queryを使用した失われた行の取得
SELECT * FROM employees AS OF TIMESTAMP TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS') WHERE last_name = 'Chung';
例16-2では、Chungの情報がemployees
表にリストアされます。
各表に対してAS
OF
句を指定または省略できます。また、異なる表に異なる時間を指定できます。
注意: 表がフラッシュバック・データ・アーカイブである場合、この表の作成日時よりも過去の日時を指定すると、問合せはこの表に対して、エラーではなく、0行を返します。(フラッシュバック・データ・アーカイブの詳細は、16.9項「フラッシュバック・データ・アーカイブの使用」を参照してください。) |
問合せでAS
OF
句を使用すると、Oracle Flashback Queryと同じセッションで表の作成、切捨てなどのデータ定義言語(DDL)操作、またはINSERT
、DELETE
などのデータ操作言語(DML)操作を実行できます。
Oracle Flashback Queryの結果を、データベースの現在の状態に影響するDDL文またはDML文内で使用するには、INSERT
文またはCREATE
TABLE
AS
SELECT
文内でAS
OF
句を使用します。
3秒の違い(最大)がアプリケーションにおけるOracle Flashback Queryで重要となる場合、タイムスタンプではなくSCNを使用します。16.10項「Oracle Flashback Technologyの一般ガイドライン」を参照してください。
ビューを定義するSELECT
文のAS
OF
句を使用して、過去のデータを参照するビューを作成できます。
データベース・ホストの現在の時間から引いて相対時間を指定すると、過去の時間が各問合せで再計算されます。次に例を示します。
CREATE VIEW hour_ago AS SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE);
SYSTIMESTAMP
は、データベース・ホスト環境のタイムゾーンを参照します。
自己結合または集合演算(INTERSECT
、MINUS
など)のAS
OF
句は、2つの異なる時間のデータを抽出または比較するために使用できます。
Oracle Flashback Queryの前にCREATE
TABLE
AS
SELECT
文またはINSERT
INTO
TABLE
SELECT
文を使用すると、結果を格納できます。たとえば、次の問合せでは、1時間前に存在していた行がemployees
表に再挿入されます。
INSERT INTO employees (SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE) MINUS SELECT * FROM employees;
SYSTIMESTAMP
は、データベース・ホスト環境のタイムゾーンを参照します。
問合せにAS
OF
句を使用して、特定の時点に有効であったデータをチェックできます。1.9.4項「時間的な有効性のサポート」を参照してください。
特定の時間間隔内に存在していた、特定の行の様々なバージョンを取得するには、Oracle Flashback Version Queryを使用します。COMMIT
文が実行されると、そのたびに行バージョンが作成されます。
注意: CREATE TABLE 文の実行後、トランザクションをコミットするために少なくとも15秒待機して、Oracle Flashback Version Queryにそのトランザクションが反映されるようにします。 |
SELECT
文でVERSIONS
BETWEEN
句を使用して、Oracle Flashback Version Queryを指定します。構文は次のいずれかになります。
VERSIONS BETWEEN { SCN | TIMESTAMP }start
ANDend
ここで、start
およびend
はそれぞれ、問合せ対象の時間間隔の開始点と終了点を表す式です。時間間隔にはstart
およびend
が含まれます。
または
VERSIONS PERIOD FOR user_valid_time [ BETWEEN TIMESTAMPstart
ANDend
]
ここで、user_valid_time
はユーザー指定の有効時間を示しています。これについては1.9.4項「時間的な有効性のサポート」で説明しています。
Oracle Flashback Version Queryでは、特定の行について、指定した時間間隔内に存在していたすべてのバージョンの各1行を含む表が戻されます。表の各行には、行バージョンに関するメタデータの疑似列が含まれます。これらの列には、データベースに対して特定の変更(誤りの可能性がある)がいつどのように行われたかが示されます。
表16-1は、行バージョンに関するメタデータの擬似列を示しています。VERSIONS_*
擬似列には、トランザクション時間のFlashback Version Query (BETWEEN
TIMESTAMP
start
AND
end
句による問合せ)のみに関する値が含まれます。
表16-1 Oracle Flashback Version Queryにおける行データ疑似列
疑似列名 | 説明 |
---|---|
行バージョンが作成されたときの開始システム変更番号(SCN)または この疑似列が |
|
行バージョンが期限切れとなったときのSCNまたは この疑似列が |
|
その行バージョンが作成されたトランザクションの識別子。 |
|
トランザクションにより実行された操作。 ユーザーによる索引キーの更新の場合、Oracle Flashback Version Queryでは、 |
指定された行バージョンは、VERSIONS_START*
の時間からVERSIONS_END*
の時間(ただしこの時間は含まれない)まで有効です。つまり、VERSIONS_START*
<= t < VERSIONS_END*
である場合、時間tではいつでも有効です。たとえば、次の出力は、2002年9月9日(この日付を含む)から2003年11月25日(この日付は含まない)まで、給与が10243であったことを示します。
VERSIONS_START_TIME VERSIONS_END_TIME SALARY ------------------- ----------------- ------ 09-SEP-2003 25-NOV-2003 10243
次に、Oracle Flashback Version Queryの一般的な使用方法を示します。
SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, last_name, salary FROM employees VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2008-12-18 14:00:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2008-12-18 17:00:00', 'YYYY-MM-DD HH24:MI:SS') WHERE first_name = 'John';
Oracle Flashback Transaction QueryでVERSIONS_XID
を使用して、行の変更を元に戻すために必要なSQLおよびその変更の担当ユーザーなど、このトランザクションのメタデータを検索できます。16.5項「Oracle Flashback Transaction Queryの使用」を参照してください。
フラッシュバック・バージョン問合せでは、IOT(索引構成表)のみを使用した索引専用アクセスが可能ですが、高速全索引スキャンは使用できません。
参照: Oracle Flashback Version Queryの疑似列、およびVERSIONS 句の構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
Oracle Flashback Transaction Queryを使用して、特定の時間間隔内における特定のトランザクションまたはすべてのトランザクションのメタデータおよび履歴データを取得できます。Oracle Flashback Transaction Queryは、静的データ・ディクショナリ・ビューFLASHBACK_TRANSACTION_QUERY
の問合せを行います。この表の列の詳細は、『Oracle Databaseリファレンス』を参照してください。
列UNDO_SQL
には、トランザクションで実行されたDML操作の論理的に逆の操作となるSQLコードがあります。通常、このコードを使用して、トランザクション中に実行された論理手順を元に戻すことができます。ただし、SQL_UNDO
のコードが、元のトランザクションの厳密な逆操作ではない場合があります。たとえば、SQL_UNDO
INSERT
操作で表に行を戻す場合、その行が削除された行と同じROWID
ではないことがあります。
次の文では、トランザクションID、操作、操作の開始SCNおよび終了SCN、操作の担当ユーザー、および操作の論理的な逆操作を示すSQLコードなどのトランザクション情報について、FLASHBACK_TRANSACTION_QUERY
ビューを問い合せています。
SELECT xid, operation, start_scn, commit_scn, logon_user, undo_sql FROM flashback_transaction_query WHERE xid = HEXTORAW('000200030000002D');
次の文では、Oracle Flashback Version Queryを副問合せとして使用し、各行バージョンを、行データの変更を担当するLOGON_USER
に関連付けています。
SELECT xid, logon_user FROM flashback_transaction_query WHERE xid IN ( SELECT versions_xid FROM employees VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2003-07-18 14:00:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2003-07-18 17:00:00', 'YYYY-MM-DD HH24:MI:SS') );
注意: XID をWHERE 句に指定せずにFLASHBACK_TRANSACTION_QUERY を問い合せると、問合せによって多数の無関係の行がスキャンされるため、パフォーマンスが低下します。 |
参照:
|
この例では、データベース管理者は次のコマンドを実行します。
DROP TABLE emp; CREATE TABLE emp ( empno NUMBER PRIMARY KEY, empname VARCHAR2(16), salary NUMBER ); INSERT INTO emp (empno, empname, salary) VALUES (111, 'Mike', 555); COMMIT; DROP TABLE dept; CREATE TABLE dept ( deptno NUMBER, deptname VARCHAR2(32) ); INSERT INTO dept (deptno, deptname) VALUES (10, 'Accounting'); COMMIT;
この時点で、emp
およびdept
にはそれぞれ1行があります。行バージョンに関しては、各表に1つのバージョンを示す1行が含まれます。誤ったトランザクションにより、empno
111
が表emp
から削除されたとします。
UPDATE emp SET salary = salary + 100 WHERE empno = 111; INSERT INTO dept (deptno, deptname) VALUES (20, 'Finance'); DELETE FROM emp WHERE empno = 111; COMMIT;
次に、トランザクションにより、新規従業員名とともにempno
111
が表emp
に再挿入されます。
INSERT INTO emp (empno, empname, salary) VALUES (111, 'Tom', 777); UPDATE emp SET salary = salary + 100 WHERE empno = 111; UPDATE emp SET salary = salary + 50 WHERE empno = 111; COMMIT;
データベース管理者はアプリケーション・エラーを検出したため、問題を診断する必要があります。データベース管理者は次の問合せを発行し、empno 111
に対応するemp
表の行のバージョンを取得します。この問合せでは、Oracle Flashback Version Queryの疑似列が使用されます。
SELECT versions_xid XID, versions_startscn START_SCN, versions_endscn END_SCN, versions_operation OPERATION, empname, salary FROM emp VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE WHERE empno = 111;
次に類似した結果が得られます。
XID START_SCN END_SCN O EMPNAME SALARY ---------------- ---------- ---------- - ---------------- ---------- 09001100B2200000 10093466 I Tom 927 030002002B210000 10093459 D Mike 555 0800120096200000 10093375 10093459 I Mike 555 3 rows selected.
結果表の行は降順の時系列で示しています。3行目は、表が作成されたときに表に挿入された、表emp
の行のバージョンに対応しています。2行目は、誤ったトランザクションにより削除されたemp
の行に対応します。1行目は、新規従業員名とともに再挿入されたemp
の行のバージョンに対応します。
データベース管理者は、トランザクション030002002B210000
を誤ったトランザクションとして識別し、Oracle Flashback Transaction Queryを使用して、このトランザクションによるすべての変更を監査します。
SELECT xid, start_scn, commit_scn, operation, logon_user, undo_sql
FROM flashback_transaction_query
WHERE xid = HEXTORAW('000200030000002D');
次に類似した結果が得られます。
XID START_SCN COMMIT_SCN OPERATION LOGON_USER ---------------- ---------- ---------- --------- ------------------------------ UNDO_SQL -------------------------------------------------------------------------------- 030002002B210000 10093452 10093459 DELETE HR insert into "HR"."EMP"("EMPNO","EMPNAME","SALARY") values ('111','Mike','655'); 030002002B210000 10093452 10093459 INSERT HR delete from "HR"."DEPT" where ROWID = 'AAATjuAAEAAAAJrAAB'; 030002002B210000 10093452 10093459 UPDATE HR update "HR"."EMP" set "SALARY" = '555' where ROWID = 'AAATjsAAEAAAAJ7AAA'; 030002002B210000 10093452 10093459 BEGIN HR 4 rows selected.
次に行われる問合せの結果を読みやすくするために、データベース管理者は次のSQL*Plusコマンドを使用します。
COLUMN operation FORMAT A9 COLUMN table_name FORMAT A10 COLUMN table_owner FORMAT A11
誤ったトランザクションおよびそれ以降のすべてのトランザクションを確認するには、データベース管理者は次の問合せを実行します。
SELECT xid, start_scn, commit_scn, operation, table_name, table_owner FROM flashback_transaction_query WHERE table_owner = 'HR' AND start_timestamp >= TO_TIMESTAMP ('2002-04-16 11:00:00','YYYY-MM-DD HH:MI:SS');
次に類似した結果が得られます。
XID START_SCN COMMIT_SCN OPERATION TABLE_NAME TABLE_OWNER ---------------- ---------- ---------- --------- ---------- ----------- 02000E0074200000 10093435 10093446 INSERT DEPT HR 030002002B210000 10093452 10093459 DELETE EMP HR 030002002B210000 10093452 10093459 INSERT DEPT HR 030002002B210000 10093452 10093459 UPDATE EMP HR 0800120096200000 10093374 10093375 INSERT EMP HR 09001100B2200000 10093462 10093466 UPDATE EMP HR 09001100B2200000 10093462 10093466 UPDATE EMP HR 09001100B2200000 10093462 10093466 INSERT EMP HR 8 rows selected.
注意: この問合せではXID がWHERE 句に指定されていないため、多数の無関係の行をスキャンし、パフォーマンスが低下します。 |
DBMS_FLASHBACK
パッケージでもOracle Flashback Queryと同じ機能が提供されますが、Oracle Flashback Queryのほうが便利な場合があります。
DBMS_FLASHBACK
パッケージはタイムマシンのように機能します。つまり、時計を特定の時点に戻して、過去のその時点にいるかのように通常の問合せを実行し、その後現在に戻ることができます。DBMS_FLASHBACK
パッケージを使用して、AS
OF
やVERSIONS
BETWEEN
などの特別な句を使用せずに過去のデータに問合せを実行できるため、既存のPL/SQLコードを再使用して、過去の時点のデータベースを問い合せることができます。
DBMS_FLASHBACK
パッケージのEXECUTE
権限が必要です。
PL/SQLコードでDBMS_FLASHBACK
パッケージを使用する手順は、次のとおりです。
DBMS_FLASHBACK
.ENABLE_AT_TIME
またはDBMS_FLASHBACK
.ENABLE_AT_SYSTEM_CHANGE_NUMBER
を起動して、過去の時間を指定します。
通常の問合せ(AS
OF
など、特別なフラッシュバック機能の構文を使用しない)を実行します。DDL操作やDML操作は実行しません。
指定された過去の時間におけるデータベースに対し、問合せが行われます。
DBMS_FLASHBACK.DISABLE
を起動して現在に戻ります。
再度DBMS_FLASHBACK
.ENABLE_AT_TIME
またはDBMS_FLASHBACK
.ENABLE_AT_SYSTEM_CHANGE_NUMBER
を起動する前に、DBMS_FLASHBACK
.DISABLE
を起動する必要があります。ENABLE/DISABLEのペアはネストできません。
カーソルを使用して問合せの結果を格納するには、カーソルをオープンしてからDBMS_FLASHBACK
.DISABLE
を起動します。結果を格納し、DBMS_FLASHBACK
.DISABLE
を起動した後、次のことができます。
INSERT
またはUPDATE
操作を実行し、過去のデータベースの格納結果を使用して現在のデータベースの状態を変更します。
現在のデータを過去のデータと比較します。DBMS_FLASHBACK
.DISABLE
を起動した後、2番目のカーソルをオープンします。過去のデータを取得するには最初のカーソルからフェッチし、現在のデータを取得するには2番目のカーソルからフェッチします。過去のデータを一時表に格納し、その後MINUS
やUNION
などの集合演算子を使用して、過去のデータと現在のデータを比較または結合できます。
DBMS_FLASHBACK
.GET_SYSTEM_CHANGE_NUMBER
を起動して、いつでも現在のシステム変更番号(SCN)を取得できます。事前のDBMS_FLASHBACK
.ENABLE
の起動とは関係なく、DBMS_FLASHBACK
.GET_SYSTEM_CHANGE_NUMBER
では、現在のSCNが戻されます。
参照:
|
DBMS_FLASHBACK
.TRANSACTION_BACKOUT
プロシージャでは、データベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックします。このリカバリ操作では、UNDOデータを使用して対応する補正トランザクションを作成および実行します。このトランザクションによって影響のあったデータが元の状態に戻ります。
ロールバック中のトランザクションは、次の制約を受けます。
トランザクションは、データベース表の論理構造を変更するDDL操作を実行できません。
次のラージ・オブジェクト(LOB)データ型を使用できません。
BFILE
BLOB
CLOB
NCLOB
LogMinerがサポートしていない機能を使用できません。
LogMinerがサポートする機能は、トランザクションをロールバックしているデータベースのCOMPATIBLE
初期化パラメータの値によって異なります。デフォルト値は、最新メジャー・リリースのリリース番号です。
トランザクションのフラッシュバックは、LogMinerからSQLデータ型サポートを継承します。したがって、トランザクションにサポートされていないSQLデータ型が含まれていたことが原因でLogMinerで障害が発生した場合、トランザクションのフラッシュバックでも障害が発生します。
一部のデータ型は、LogMinerではサポートされていますが、このような型の列を修正する操作の一端として、Undo情報を生成しません。したがって、トランザクションのフラッシュバックは、このようなデータ型を含む表をサポートしません。これには、BLOB型、CLOB型、およびXML型を含む表が該当します。
参照:
|
内容は次のとおりです。
TRANSACTION_BACKOUT
プロシージャのパラメータは次のとおりです。
バックアウトするトランザクションの数
名前またはXIDで識別されたバックアウトするトランザクションのリスト
時間ヒント(名前でトランザクションを識別する場合)
任意のトランザクションの開始時間より早い時間を指定します。
表16-2のバックアウト・オプション
TRANSACTION_BACKOUT
プロシージャの構文およびパラメータの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
表16-2 フラッシュバックTRANSACTION_BACKOUTオプション
オプション | 説明 |
---|---|
|
後行順で指定トランザクションおよびすべての依存トランザクションをバックアウトします(つまり、親がバックアウトされる前に子がバックアウトされます)。
|
|
デフォルト。依存トランザクションを持たないと予想される指定トランザクションをバックアウトします。最初の依存トランザクションによってエラーが発生し、 |
|
依存トランザクションを無視して、指定トランザクションをバックアウトします。サーバーでは、コミット時間とは逆の順序で指定トランザクションのUNDO SQL文を実行します。 制約に違反せず、その結果に満足している場合は、変更をコミットできます。それ以外の場合は、ロールバックできます。 |
|
指定トランザクションの競合しない行に変更をバックアウトします。データベースの一貫性は保たれますが、トランザクションは完全に失われます。 |
TRANSACTION_BACKOUT
ではトランザクションの依存性を分析してDML操作を実行し、レポートを生成します。TRANSACTION_BACKOUT
ではトランザクション・バックアウトの一環として実行されるDML操作はコミットしませんが、正しい形式で行および表に対する必要なロックを保持し、他の依存関係がシステムに介入しないようにします。トランザクション・バックアウトを永続的なものにするには、明示的にトランザクションをコミットする必要があります。
TRANSACTION_BACKOUT
によって生成されたレポートを参照するには、静的データ・ディクショナリ・ビュー*_FLASHBACK_TXN_STATE
および*_FLASHBACK_TXN_REPORT
を問い合せます。
静的データ・ディクショナリ・ビュー*_FLASHBACK_TXN_STATE
では、トランザクションがアクティブであるか、またはバックアウトされているかが示されます。このビューにトランザクションが表示される場合は、バックアウトされています。
*_FLASHBACK_TXN_STATE
は、補正トランザクションに対してアトミックにメンテナンスされます。補正トランザクションがバックアウトされている場合、加えられたすべての変更もバックアウトされ、*_FLASHBACK_TXN_STATE
にこれが反映されます。たとえば、補正トランザクションct
がトランザクションt1
およびt2
をバックアウトする場合、t1
およびt2
は*_FLASHBACK_TXN_STATE
に表示されます。ct
自身が後でバックアウトされる場合、t1
およびt2
による影響は元に戻され、t1
およびt2
は*_FLASHBACK_TXN_STATE
に表示されなくなります。
参照: *_FLASHBACK_TXN_STATE の詳細は、『Oracle Databaseリファレンス』を参照してください。 |
静的データ・ディクショナリ・ビュー*_FLASHBACK_TXN_REPORT
では、各バックアウト・トランザクションの詳細レポートを生成します。
参照: *_FLASHBACK_TXN_REPORT の詳細は、『Oracle Databaseリファレンス』を参照してください。 |
フラッシュバック・データ・アーカイブにより、その存続期間中、表に対するすべてのトランザクションによる変更を追跡および格納できます。フラッシュバック・データ・アーカイブは、レコード・ステージ・ポリシーと監査レポートのコンプライアンスに役立ちます。
フラッシュバック・データ・アーカイブは、1つ以上の表領域またはその部品で構成されます。フラッシュバック・データ・アーカイブは複数所有できます。SYSDBA
としてログオンしている場合は、システムに対してデフォルトのフラッシュバック・データ・アーカイブを指定できます。フラッシュバック・データ・アーカイブは、保有時間を使用して構成されます。フラッシュバック・データ・アーカイブにアーカイブされたデータは、フラッシュバック・データ・アーカイブ作成時に指定した保有時間まで保持されます。
デフォルトでは、すべての表についてフラッシュバック・データ・アーカイブは有効になっていません。次のすべてに該当する場合は表のフラッシュバック・データ・アーカイブを有効にすることができます。
表に対して使用するフラッシュ・データ・アーカイブに対するFLASHBACK
ARCHIVE
オブジェクト権限がある。
表が、ネスト表、一時表、リモート表または外部表でない。
表にLONG
列またはネストされた列が含まれない。
表で、次のいずれかのフラッシュバック・データ・アーカイブ予約語が列名として使用されていない。
STARTSCN
ENDSCN
RID
XID
OP
OPERATION
ネスト表、一時表、外部表、マテリアライズド・ビュー、AQ (Advanced Query)表または表以外のオブジェクトで、フラッシュバック・データ・アーカイブを有効にすることはできません。
表に対してフラッシュバック・データ・アーカイブを有効にした後は、FLASHBACK
ARCHIVE
ADMINISTER
システム権限がある場合、またはSYSDBA
としてログオンしている場合のみ、これを無効にできます。
特定の表に対してフラッシュバック・データ・アーカイブを選択する場合は、その表のデータ保有要件およびFLASHBACK
ARCHIVE
オブジェクト権限のあるフラッシュバック・データ・アーカイブの保有時間を考慮してください。
Oracle Database 12cリリース1 (12.1.0.1)以降、フラッシュバック・データ・アーカイブは拡張されており、次のものを備えています。
ユーザー・コンテキストのトラッキング。トランザクションのトラッキングに関するメタデータ情報は、ユーザー・コンテキストを含むことができます(機能が有効になっている場合)。これによって、どのユーザーが何の変更を表に加えたかを確認しやすくなります。
ユーザー・コンテキスト・レベル(保存するユーザー・コンテキストの量を決定)を設定するには、DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVEL
プロシージャを使用します。コンテキスト情報にアクセスするには、DBMS_FLASHBACK_ARCHIVE.GET_SYS_CONTEXT
ファンクションを使用します。(DBMS_FLASHBACK_ARCHIVE
パッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。)
データベース強化。この機能によって、アプリケーション内で一連の表を関連付けて、それらすべての表に対して1つのコマンドでフラッシュバック・データ・アーカイブを有効にすることができます。また、データベース強化により、すべての表を1つのコマンドでロックできます。後でロック解除するまでは、それらの表に対するDMLを防ぐことができます。データベース強化は、アプリケーション内のセキュリティ上の重要な表を、フラッシュバック・データ・アーカイブで容易に追跡および保護することを目的としています。
データベース強化のためにアプリケーションを登録するには、DBMS_FLASHBACK_ARCHIVE.REGISTER_APPLICATION
プロシージャを使用します。この詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
内容は次のとおりです。
次を指定し、CREATE
FLASHBACK
ARCHIVE
文を使用してフラッシュバック・データ・アーカイブを作成します。
フラッシュバック・データ・アーカイブの名前
フラッシュバック・データ・アーカイブの最初の表領域の名前
(オプション)フラッシュバック・データ・アーカイブが最初の表領域で使用できる最大領域量
デフォルトは無制限です。最初の表領域の領域割当て制限も無制限でないかぎりは、この値を指定する必要があります。指定しない場合、ORA-55621のエラーが発生します。
保有時間(表のフラッシュバック・データ・アーカイブのデータの格納が保証されている日数)
(オプション)[NO]
OPTIMIZE
DATA
を使用して、フラッシュバック・データ・アーカイブで管理する履歴表のデータの記憶域を最適化するかどうか。
デフォルトはNO
OPTIMIZE
DATA
です。
SYSDBA
としてログオンしている場合は、システムに対してこれをデフォルトのフラッシュバック・データ・アーカイブとして指定できます。このオプションを省略しても、後でこのフラッシュバック・データ・アーカイブをデフォルトにできます(16.9.4項「デフォルト・フラッシュバック・データ・アーカイブの指定」を参照)。
フラッシュバック・データ・アーカイブを使用する必要があるすべてのユーザーに対しては、フラッシュバック・データ・アーカイブ表領域の割当て制限を無制限にすることをお薦めします。このようにできない場合は、それらのユーザーに対して十分な表領域の割当て制限を与える必要があります。
例
デフォルトのフラッシュバック・データ・アーカイブfla1
を作成します。これは最大10GBの表領域tbs1
を使用し、そのデータは1年間保持されます。
CREATE FLASHBACK ARCHIVE DEFAULT fla1 TABLESPACE tbs1 QUOTA 10G RETENTION 1 YEAR;
フラッシュバック・データ・アーカイブfla2
を作成します。これは表領域tbs2
を使用し、そのデータは2年間保持されます。
CREATE FLASHBACK ARCHIVE fla2 TABLESPACE tbs2 RETENTION 2 YEAR;
CREATE
FLASHBACK
ARCHIVE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
ALTER
FLASHBACK
ARCHIVE
文を使用して、次を実行できます。
フラッシュバック・データ・アーカイブの保有時間を変更します。
データの一部またはすべてをパージします。
表領域を追加、変更、削除します。
注意: フラッシュバック・データ・アーカイブのすべての表領域を削除すると、エラーが発生します。 |
SYSDBA
としてログオンしている場合は、ALTER
FLASHBACK
ARCHIVE
文を使用して、特定のファイルをシステムに対するデフォルトのフラッシュバック・データ・アーカイブにすることもできます。
例
フラッシュバック・データ・アーカイブfla1
を、デフォルトのフラッシュバック・データ・アーカイブにします。
ALTER FLASHBACK ARCHIVE fla1 SET DEFAULT;
フラッシュバック・データ・アーカイブfla1
に対して、最大5GBの表領域tbs3
を追加します。
ALTER FLASHBACK ARCHIVE fla1 ADD TABLESPACE tbs3 QUOTA 5G;
フラッシュバック・データ・アーカイブfla1
に対して、必要に応じてtbs4
と同じサイズの表領域を追加します。
ALTER FLASHBACK ARCHIVE fla1 ADD TABLESPACE tbs4;
フラッシュバック・データ・アーカイブfla1
が表領域tbs3
で使用できる最大領域を20GBに変更します。
ALTER FLASHBACK ARCHIVE fla1 MODIFY TABLESPACE tbs3 QUOTA 20G;
フラッシュバック・データ・アーカイブfla1
に対して、必要に応じてtbs1
と同じサイズの表領域を使用できるようにします。
ALTER FLASHBACK ARCHIVE fla1 MODIFY TABLESPACE tbs1;
フラッシュバック・データ・アーカイブfla1
の保有時間を2年に変更します。
ALTER FLASHBACK ARCHIVE fla1 MODIFY RETENTION 2 YEAR;
フラッシュバック・データ・アーカイブfla1
から表領域tbs2
を削除します。
ALTER FLASHBACK ARCHIVE fla1 REMOVE TABLESPACE tbs2;
(表領域tbs2
は削除されません。)
フラッシュバック・データ・アーカイブfla1
からすべての履歴データをパージします。
ALTER FLASHBACK ARCHIVE fla1 PURGE ALL;
フラッシュバック・データ・アーカイブfla1
から1日以上経過したすべての履歴データをパージします。
ALTER FLASHBACK ARCHIVE fla1 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
フラッシュバック・データ・アーカイブfla1
からSCN 728969より古いすべての履歴データをパージします。
ALTER FLASHBACK ARCHIVE fla1 PURGE BEFORE SCN 728969;
ALTER
FLASHBACK
ARCHIVE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
DROP
FLASHBACK
ARCHIVE
文を使用してフラッシュバック・データ・アーカイブを削除します。フラッシュバック・データ・アーカイブを削除するとその履歴データは削除されますが、その表領域は削除されません。
例
表領域を削除せず、フラッシュバック・データ・アーカイブfla1
およびその履歴データを削除します。
DROP FLASHBACK ARCHIVE fla1;
DROP
FLASHBACK
ARCHIVE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
デフォルトでは、システムにはデフォルト・フラッシュバック・データ・アーカイブがありません。SYSDBA
としてログオンしている場合は、次のいずれかの方法でデフォルト・フラッシュバック・データ・アーカイブを指定できます。
ALTER
FLASHBACK
ARCHIVE
文のSET
DEFAULT
句を使用して、既存のフラッシュバック・データ・アーカイブの名前を指定します。次に例を示します。
ALTER FLASHBACK ARCHIVE fla1 SET DEFAULT;
fla1
がない場合は、エラーが発生します。
フラッシュバック・データ・アーカイブを作成する際、CREATE
FLASHBACK
ARCHIVE
文にDEFAULT
を含めます。次に例を示します。
CREATE FLASHBACK ARCHIVE DEFAULT fla2 TABLESPACE tbs1 QUOTA 10G RETENTION 1 YEAR;
システムのデフォルト・フラッシュバック・データ・アーカイブは、自分自身のデフォルト・フラッシュバック・データ・アーカイブを持たないすべてのユーザーに対するデフォルト・フラッシュバック・データ・アーカイブです。
参照:
|
デフォルトでは、表に対してフラッシュバック・データ・アーカイブは無効になっています。その表に対して使用するフラッシュバック・データ・アーカイブのFLASHBACK
ARCHIVE
オブジェクト権限がある場合は、表のフラッシュバック・データ・アーカイブを有効にできます。
表に対してフラッシュバック・データ・アーカイブを有効にするには、CREATE
TABLE
文またはALTER
TABLE
文にFLASHBACK
ARCHIVE
句を含めます。FLASHBACK
ARCHIVE
句には、その表の履歴データを格納するフラッシュバック・データ・アーカイブを指定できます。デフォルトは、システムに対してデフォルトのフラッシュバック・データ・アーカイブです。存在しないフラッシュバック・データ・アーカイブを指定すると、エラーが発生します。
表に対してフラッシュバック・データ・アーカイブを有効にしても、AUMが無効な場合は、表を変更しようとするとエラーORA-55614が発生します。
表でフラッシュバック・データ・アーカイブが有効になっている場合は、別のフラッシュバック・データ・アーカイブを再度有効にしようとするとエラーが発生します。
表に対してフラッシュバック・データ・アーカイブを有効にした後は、FLASHBACK
ARCHIVE
ADMINISTER
システム権限がある場合、またはSYSDBA
としてログオンしている場合のみ、これを無効にできます。表に対してフラッシュバック・データ・アーカイブを無効にするには、ALTER
TABLE
文にNO
FLASHBACK
ARCHIVE
を指定します。(CREATE
TABLE
文にNO
FLASHBACK
ARCHIVE
を指定する必要はありません。これはデフォルトです。)
表に対してフラッシュバック・データ・アーカイブを有効にした後は、表にデータを挿入するまでに20秒以上待ち、また、表にフラッシュバック問合せを使用するまでに最大5分間待つことをお薦めします。
参照: CREATE TABLE 文のFLASHBACK ARCHIVE 句の詳細(使用制限も含む)は、『Oracle Database SQL言語リファレンス』を参照してください。 |
例
表employee
を作成してデフォルトのフラッシュバック・データ・アーカイブに履歴データを格納します。
CREATE TABLE employee (EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4)) FLASHBACK ARCHIVE;
表employee
を作成してフラッシュバック・データ・アーカイブfla1
に履歴データを格納します。
CREATE TABLE employee (EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4)) FLASHBACK ARCHIVE fla1;
表employee
のフラッシュバック・データ・アーカイブを有効にして、デフォルトのフラッシュバック・データ・アーカイブに履歴データを格納します。
ALTER TABLE employee FLASHBACK ARCHIVE;
表employee
のフラッシュバック・データ・アーカイブを有効にして、フラッシュバック・データ・アーカイブfla1
に履歴データを格納します。
ALTER TABLE employee FLASHBACK ARCHIVE fla1;
表employee
のフラッシュバック・データ・アーカイブを無効にします。
ALTER TABLE employee NO FLASHBACK ARCHIVE;
フラッシュバック・データ・アーカイブは、次のDDL文のみをサポートしています。
ALTER
TABLE
文では、次のいずれかが実行されます。
列の追加、削除、名前変更、または修正
制約の追加、削除、または名前変更
パーティション、またはサブパーティション操作の削除、または切捨て
TRUNCATE
TABLE
文
表の名前を変更するRENAME
文
フラッシュバック・データ・アーカイブは、パーティションまたはサブパーティションを移動、分割、マージまたは結合したり、LONG
列をLOB
列に変換するDDL文はサポートしていません。
たとえば、フラッシュバック・データ・アーカイブを有効にした表に対して次のDDL文を使用すると、エラーORA-55610が発生します。
UPGRADE
TABLE
句を含むALTER
TABLE
文。INCLUDING
DATA
句を持つことも持たないこともあります。
パーティション、またはサブパーティション操作を移動、または交換するALTER
TABLE
文。
DROP
TABLE
文
フラッシュバック・データ・アーカイブ対応の表でサポートされていないDDL文を使用する必要がある場合は、DBMS_FLASHBACK_ARCHIVE
.DISASSOCIATE_FBA
プロシージャを使用して、そのフラッシュバック・データ・アーカイブから実表の関連付けを解除します。その後、フラッシュバック・データ・アーカイブと実表を再度関連付けするには、DBMS_FLASHBACK_ARCHIVE
.REASSOCIATE_FBA
プロシージャを使用します。また、フラッシュバック・データ・アーカイブ対応の表を削除するには、最初にALTER TABLE ... NO FLASHBACK ARCHIVE
句を使用して、表でフラッシュバック・データ・アーカイブを無効化する必要があります。
参照:
|
表16-3に静的データ・ディクショナリ・ビューを示し、簡潔に説明します。このビューに対して、フラッシュバック・データ・アーカイブ・ファイルに関する情報の問合せを実行できます。
表16-3 フラッシュバック・データ・アーカイブ・ファイルの静的データ・ディクショナリ・ビュー
ビュー | 説明 |
---|---|
|
フラッシュバック・データ・アーカイブ・ファイルに関する情報を表示します。 |
|
フラッシュバック・データ・アーカイブ・ファイルの表領域を表示します。 |
|
データ・フラッシュバック・アーカイブ・ファイルが有効になっている表に関する情報を表示します。 |
参照:
|
企業でTaxes
表に対する履歴データの変更内容を10年後に「シュレッド」(削除)するとします。Taxes
のフラッシュバック・データ・アーカイブを作成する際、10年の保有時間を指定します。
CREATE FLASHBACK ARCHIVE taxes_archive TABLESPACE tbs1 RETENTION 10 YEAR;
Taxes
のトランザクションからの履歴データは、10年を超えるとパージされます。(Taxes
の表自体、および10年未満のトランザクションからの履歴データはパージされません。)
表inventory
から年初にすべての品目の在庫を取得できるように、また、表stock_data
からその年の任意の日付の業務終了時点での自社の有価証券における、各シンボルの株価を取得できるようにするとします。
デフォルトのフラッシュバック・データ・アーカイブfla1
を作成します。これは最大10GBの表領域tbs1
を使用し、そのデータは5年間保持されます(SYSDBA
としてログオンしている必要があります)。
CREATE FLASHBACK ARCHIVE DEFAULT fla1 TABLESPACE tbs1 QUOTA 10G RETENTION 5 YEAR;
表inventory
およびstock_data
のフラッシュバック・データ・アーカイブを有効にして、デフォルトのフラッシュバック・データ・アーカイブに履歴データを格納します。
ALTER TABLE inventory FLASHBACK ARCHIVE; ALTER TABLE stock_data FLASHBACK ARCHIVE;
2007年の年初にすべての品目の在庫を取得するには、次の問合せを使用します。
SELECT product_number, product_name, count FROM inventory AS OF TIMESTAMP TO_TIMESTAMP ('2007-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');
2007年7月23日の業務の終了時に有価証券の各シンボルの株価を取得するには、次の問合せを使用します。
SELECT symbol, stock_price FROM stock_data AS OF TIMESTAMP TO_TIMESTAMP ('2007-07-23 16:00:00', 'YYYY-MM-DD HH24:MI:SS') WHERE symbol IN my_portfolio;
ユーザーが、過去5年間格納されているデータについて、表investments
からレポートを生成できるようにするとします。
デフォルトのフラッシュバック・データ・アーカイブfla2
を作成します。これは最大20GBの表領域tbs1
を使用し、そのデータは5年間保持されます(SYSDBA
としてログオンしている必要があります)。
CREATE FLASHBACK ARCHIVE DEFAULT fla2 TABLESPACE tbs1 QUOTA 20G RETENTION 5 YEAR;
表investments
のフラッシュバック・アーカイブを有効にして、デフォルトのフラッシュバック・データ・アーカイブに履歴データを格納します。
ALTER TABLE investments FLASHBACK ARCHIVE;
Lisaは、2006年12月31日の業務終了時点での投資の運用成績に関するレポートを必要としています。次の問合せを使用します。
SELECT * FROM investments AS OF TIMESTAMP TO_TIMESTAMP ('2006-12-31 16:00:00', 'YYYY-MM-DD HH24:MI:SS') WHERE name = 'LISA';
医療保険会社では、診療所を監査する必要があります。医療保険会社は表Billings
にその債権があり、デフォルトのフラッシュバック・データ・アーカイブfla4
を作成します。これは最大100GBの表領域tbs1
を使用し、そのデータは10年間保持されます。
CREATE FLASHBACK ARCHIVE DEFAULT fla4 TABLESPACE tbs1 QUOTA 100G RETENTION 10 YEAR;
この会社では表Billings
のフラッシュバック・アーカイブを有効にして、デフォルトのフラッシュバック・データ・アーカイブに履歴データを格納します。
ALTER TABLE Billings FLASHBACK ARCHIVE;
2007年5月1日に、クライアントは診断と検査について誤った金額を請求されました。2007年5月1日現在の記録を確認するには、会社は次の問合せを使用します。
SELECT date_billed, amount_billed, patient_name, claim_Id, test_costs, diagnosis FROM Billings AS OF TIMESTAMP TO_TIMESTAMP('2007-05-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');
エンドユーザーが、データベースですでにコミット済の誤ったトランザクションからリカバリします。誤ったトランザクションのUNDOデータは今後利用できなくなりますが、必要な履歴情報がフラッシュバック・データ・アーカイブにあるため、フラッシュバック問合せはシームレスに機能します。
Lisaはソフトウェア開発グループを管理しており、そのグループの製品販売が好調です。このため、2007年11月3日に、2年を超える経験を有するレベル3の全従業員に10%の昇給とレベル4への昇進を与えることを決定します。Lisaはこの変更を人事部(HR)代表のBobに依頼します。
BobはHRのWebアプリケーションを使用して、employee
表を更新し、Lisaのレベル3の部下に10%の昇給とレベル4への昇進を与えます。次に、Bobは当日の自分の業務を終了して退社しますが、トランザクション中に2年の経験という要件を省略したことに気づいていません。数日後、Bobが更新を完了したかどうかをLisaが確認した際、昇給がグループの全員に与えられたことが判明します。彼女はただちにBobに電話し、誤りを修正するよう要求します。
Bobは最初は、バックアップにアクセスしなければ従業員表を以前の状態に戻せないと考えます。次に、employee
表ではフラッシュバック・データ・アーカイブが有効になっていることを思い出します。
Bobは最初に、彼の変更後にemployee
表を変更した他のトランザクションがないことを検証します。トランザクション問合せからのコミット・タイムスタンプは、2日前のBobのトランザクションと一致します。
次に、Bobは次の文を使用してemployee
表を誤った変更以前の状態に戻します。
DELETE EMPLOYEE WHERE MANAGER = 'LISA JOHNSON'; INSERT INTO EMPLOYEE SELECT * FROM EMPLOYEE AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '2' DAY) WHERE MANAGER = 'LISA JOHNSON';
それからBobはLisaに要求された更新を再度実行します。
DBMS_FLASHBACK
.ENABLE
およびDBMS_FLASHBACK
.DISABLE
プロシージャを、制御しないSQLコード、または複数の連続した問合せに対して過去の同じ時刻を使用する場合のSQLコードの周辺で使用します。
記述するSQLコードで、簡便性のためにOracle Flashback Query、Oracle Flashback Version QueryまたはOracle Flashback Transaction Queryを使用します。たとえば、Oracle Flashback Queryは柔軟性が高く、単一の問合せで比較と結果の格納を行うことができます。
後でフラッシュバック機能で使用するためのSCNを取得するには、DBMS_FLASHBACK
.GET_SYSTEM_CHANGE_NUMBER
を使用します。
問合せで使用する過去の時間を計算または取得するには、タイムスタンプまたはSCN引数としてファンクション戻り値を使用します。たとえば、INTERVAL
値をSYSTIMESTAMP
関数の値に加算または減算します。
Oracle Flashback Query、Oracle Flashback Version QueryおよびOracle Flashback Transaction Queryをローカルまたはリモートで使用します。リモートのOracle Flashback Queryの例は次のとおりです。
SELECT * FROM employees@some_remote_host AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE);
データベースの整合性を保証するには、過去のデータを問い合せる前に、COMMIT
またはROLLBACK
操作を実行します。
すべてのフラッシュバック処理は、問合せ対象の時点に有効であった設定ではなく、各国語およびキャラクタ・セットなどの現在のセッション設定を使用することに注意してください。
表の構造を変更するいくつかのDDL(列の削除/変更、表の移動、パーティションの削除、表/パーティションの切捨て、制約の追加など)では、表に対する既存のUNDOデータは無効になります。DDL実行以前の時間のデータを取得しようとすると、ORA-01466のエラーが発生します。表の記憶域属性(PCTFREE
、INITRANS
、MAXTRANS
など)を変更するDDL操作では、UNDOデータは無効にされません。
正確な時間の過去のデータを問い合せるには、SCNを使用します。タイムスタンプを使用した場合、問合せの実際の時間は、指定した時間よりも最大3秒早くなる場合があります。内部的には、Oracle DatabaseではSCNが使用され、このSCNは、3秒の間隔でタイムスタンプにマップされます。
たとえば、SCN値1000および1005が、タイムスタンプ午前8時41分および8時46分にそれぞれマップされているとします。午前8時41分から8時45分59秒の間に行われた問合せはSCN 1000にマップされます。午前8時46分に行われたOracle Flashback QueryはSCN 1005にマップされます。したがって、表の作成などのDDL操作の直後の時点を指定した場合、Oracle DatabaseではDDL操作の直前のSCNが使用されることがあり、エラーORA-01466が発生します。
動的パフォーマンス(V$
)ビューから過去のデータは取得できません。このようなビューに問合せを実行すると、現在のデータが戻されます。
静的データ・ディクショナリ・ビュー(*_TABLES
など)では、過去のデータに問合せを実行できます。
フラッシュバック・データ・アーカイブを作成または変更するときにOPTIMIZE
DATA
を指定することで、フラッシュバック・データ・アーカイブで管理される履歴表のデータ記憶域を最適化することができます。
OPTIMIZE
DATA
を指定すると、次のいずれかの機能で履歴表のデータ記憶域が最適化されます。
高度な行圧縮
拡張LOB圧縮
拡張LOB重複除外
セグメント・レベルの圧縮層
行レベルの圧縮層
デフォルトは、履歴表のデータ記憶域は最適化されません。
注意: ユーザーが生成した履歴をインポートすると、不正確で信頼性のない結果となる可能性があります。このプロシージャを使用する場合は、事前にOracleサポートに連絡してください。 |
Oracle Flashback Queryに関連するすべての表の統計情報を生成するには、DBMS_STATS
パッケージを使用します。統計情報を最新の状態に維持します。Oracle Flashback Queryは、これらの統計情報に依存するコストベース・オプティマイザを使用します。
アクセスする必要のあるUNDOデータの量を最小限にします。問合せを使用する際に、表全体をスキャンするのでなく、索引を使用して少量の過去データを選択します。全表をスキャンする必要がある場合は、問合せにパラレル・ヒントを追加します。
I/Oのパフォーマンス・コストは、バッファ・キャッシュに存在していないデータおよびUNDOブロックにおけるページングのコストです。CPUの使用におけるパフォーマンス・コストは、影響を受けるデータ・ブロックにUNDO情報を適用する際のコストです。最近の過去における変更を操作する場合、フラッシュバック操作にはCPUの限界があります。
アーカイバのバージョン問合せがバッファ・キャッシュでUNDOデータを見つけられるように、十分なバッファ・キャッシュを設定することをお薦めします。バッファ・キャッシュのアクセスは、ディスク・アクセスよりも大幅に高速です。
追跡対象の表に非常に大きなトランザクション(1,000,000行超に影響)が実行される場合は、パラレル問合せが新たなチャンクをSGAから割り当てる必要がないように、十分な大容量のプール・サイズ(1GB以上)を設定します。大容量プール・サイズの設定の詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』の「共有プールと大容量プールのチューニング」の章を参照してください。
Oracle Flashback Version Queryの場合は、索引構造を使用します。Oracle Databaseでは、データの変更および索引変更に関するUNDOデータが保持されます。索引参照ベースのOracle Flashback Version Queryのパフォーマンスは、全表スキャン(索引を使用しない場合は必要)よりも桁違いに高速です。
Oracle Flashback Transaction Queryでは、xid
列の型がRAW(8)
です。xid
列に対して作成された索引を利用するには、HEXTORAW
変換ファンクションHEXTORAW(xid)
を使用します。
マテリアライズド・ビューに対するOracle Flashback Queryには、問合せリライト最適化の効果はありません。
次のOracle Flashback Technology機能は、マルチテナント・コンテナ・データベース(CDB)に対して使用不可です。
Oracle Database 12cリリース1 (12.1.0.1)の場合、フラッシュバック・データ・アーカイブ(FDA)はCDBでサポートされていません。
Oracle Database 12cリリース1 (12.1.0.2)では、この制限がなくなります。
トランザクションのフラッシュバック問合せはCDBではサポートされません。
トランザクションのフラッシュバックのバックアウトはCDBではサポートされません。