19 Oracle Flashback Technologyの使用

この章では、データベース・アプリケーションにおけるOracle Flashback Technologyの使用について説明します。

トピック:

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では、versions_starttime列、versions_endtime列またはscn_to_timestamp列を

VERSIONS問合せ(CTAS問合せを含む)で使用することを避けてパフォーマンスの向上を図ることをお薦めします。

トピック:

関連項目:

フラッシュバック機能の詳細は、『Oracle Database概要』を参照してください。

アプリケーション開発機能

アプリケーション開発では、次のフラッシュバック機能を使用して、履歴データに関するレポートを作成したり、誤った変更を元に戻すことができます。(この機能は、データベース・ユーザーまたは管理者として対話形式でも使用できます。)

Oracle Flashback Query

この機能を使用して、SELECT文のAS OF句で指定した過去のある時点のデータを取得できます。

Oracle Flashback Version Query

この機能を使用して、特定の時間間隔内のメタデータおよび履歴データを取得します(たとえば、ある表の、特定の時間間隔内に存在していたすべての行を表示します)。各行バージョンに関するメタデータには、開始時間と終了時間、変更処理のタイプおよび行バージョンを作成したトランザクションの識別情報が含まれます。Oracle Flashback Version Queryを作成するには、SELECT文でVERSIONS BETWEEN句を使用します。

Oracle Flashback Transaction Query

この機能を使用して、特定の時間間隔内における特定のトランザクションまたはすべてのトランザクションのメタデータおよび履歴データを取得できます。Oracle Flashback Transaction Queryを実行するには、静的データ・ディクショナリ・ビューFLASHBACK_TRANSACTION_QUERYから選択します。

通常は、Oracle Flashback Transaction QueryとOracle Flashback Version Queryを併用することで、対象となる行のトランザクションIDを提供します。

DBMS_FLASHBACKパッケージ

この機能は、ある時点の最新データを検査できるよう、Oracle Database内部の時計を過去のある時点まで戻す場合、あるいはデータベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックする場合に使用できます。

フラッシュバック・トランザクション

フラッシュバック・トランザクションは、データベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックする場合に使用します。このリカバリ操作では、UNDOデータを使用して対応する補正トランザクションを作成および実行します。(フラッシュバック・トランザクションは、DBMS_FLASHBACKパッケージの一部です)。

フラッシュバック・データ・アーカイブ

フラッシュバック・データ・アーカイブを使用して、フラッシュバック・アーカイブが有効化された表に対する変更バージョンの履歴を自動的に追跡およびアーカイブすると、スナップショットが古すぎるというエラーが発生することなくデータベース・オブジェクトの各バージョンへのSQLレベルのアクセスが保証されます。

データベース管理機能

次のフラッシュバック機能は、主としてデータ・リカバリ用です。通常、この機能は、データベース管理者としてのみ使用します。

この章では、「アプリケーション開発機能」に重点を置いています。

Oracle Flashback Table

表の状態を以前の特定の時点までリカバリする場合に、この機能を使用します。データベースがオンラインの間は表のリストアが可能であり、指定した表に対する変更のみ元に戻すことができます。

Oracle Flashback Drop

削除された表をリカバリする場合に、この機能を使用します。この機能によって、DROP TABLE文の影響が無効になります。

Oracle Flashback Database

リカバリ領域を使用してデータベースをその時点まで迅速に戻す場合に、この機能を使用します。データベースのバックアップをリストアする必要がないため、処理が高速です。

Oracle Flashback Technologyに関するデータベースの構成

アプリケーションでフラッシュバック機能を使用するには、まず、ユーザーまたはデータベース管理者は次の各項で説明する構成タスクを実行する必要があります。

自動UNDO管理に関するデータベースの構成

自動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が保持される期間を決定できます。

    UNDO_RETENTIONの設定は、期限切れになっていないUNDOデータが廃棄されないことを保証するものではありません。システムの領域が不十分な場合、Oracle Databaseでは期限切れになっていないUNDOが新しく生成されたUNDOによって上書きされる場合があります。

  • UNDO表領域に対しRETENTION GUARANTEE句を指定して、期限切れになっていないUNDOデータが廃棄されないようにします。

関連項目:

Oracle Flashback Transaction Queryに関するデータベースの構成

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列に対するOracle Flashback操作の有効化

表の特定の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コードの実行を許可するには、特定の表に対するSELECTUPDATEDELETEおよび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を使用するには、SELECT文でAS OF句を使用します。Oracle Flashback Queryにより、過去のある時点で存在していたデータを取得できます。問合せでは、タイムスタンプまたはシステム変更番号(SCN)を使用することで、過去の時点が明示的に参照されます。その時点で最新であったコミット済データが戻されます。

Oracle Flashback Queryは、次のような場合に使用します。

  • 失われたデータのリカバリや、誤ったコミット済の変更の取消しを行います。

    たとえば、誤って行を削除または更新し、コミットしていても、すぐに誤りを元に戻すことができます。

  • 現在のデータを過去の特定の時点の対応するデータと比較する場合。

    たとえば、前日からのデータの変更を示す日報を作成できます。表データの個々の行の比較、または行セットの共通部分や結合の検索が可能です。

  • 特定の時点でのトランザクション・データの状態を確認する場合。

    たとえば、特定の日の預金残高を確認できます。

  • 特定の時点、またはユーザー定義の有効期間内に有効なデータを選択します。

    たとえば、特定のタイムスタンプの時点、または指定された有効期間内で指定の開始時刻から終了時刻の間の、有効な従業員情報を持つ従業員を見つけることができます。(詳細は、「時間的な有効性のサポート」を参照してください。)

  • アプリケーションの設計を簡略化する場合。一時データの類を格納する必要性をなくすことにより簡略化します。

    Oracle Flashback Queryにより、データベースから直接過去のデータを取得できます。

  • レポート生成ツールなどのパッケージ・アプリケーションを過去のデータに適用します。

  • アプリケーションにセルフサービス・エラー修正を提供し、ユーザーが自分のエラーを元に戻して修正できるようにする場合。

トピック:

例: 過去のデータの検査およびリストア

たとえば、午後12時30分に従業員Chungの行がemployee表から削除されていることに気付き、午前9時30分にはこのデータがデータベース内に正しく格納されていたことを知っているとします。この場合、Oracle Flashback Queryを使用して午前9時30分の表の内容を調べ、失われたデータを見つけることができます。必要に応じて失われたデータをリストアできます。

例19-1では、2004年4月4日午前9時30分におけるChungのレコードの状態が取得されます。

例19-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';

例19-2では、Chungの情報がemployees表にリストアされます。

例19-2 Oracle Flashback Query後の失われた行のリストア

INSERT INTO employees (
  SELECT * FROM employees
  AS OF TIMESTAMP
  TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
  WHERE last_name = 'Chung'
);

Oracle Flashback Queryのガイドライン

  • 各表に対してAS OF句を指定または省略できます。また、異なる表に異なる時間を指定できます。

    ノート:

    表がフラッシュバック・データ・アーカイブである場合、この表の作成日時よりも過去の日時を指定すると、問合せはこの表に対して、エラーではなく、0行を返します。

  • 問合せでAS OF句を使用すると、Oracle Flashback Queryと同じセッションで表の作成、切捨てなどのデータ定義言語(DDL)操作、またはINSERTDELETEなどのデータ操作言語(DML)操作を実行できます。

  • Oracle Flashback Queryの結果を、データベースの現在の状態に影響するDDL文またはDML文内で使用するには、INSERT文またはCREATE TABLE AS SELECT文内でAS OF句を使用します。

  • 3秒の違い(最大)がアプリケーションにおけるOracle Flashback Queryで重要となる場合、タイムスタンプではなくSCNを使用します。「Oracle Flashback Technologyの一般ガイドライン」を参照してください。

  • ビューを定義するSELECT文のAS OF句を使用して、過去のデータを参照するビューを作成できます。

    データベース・ホストの現在の時間から引いて相対時間を指定すると、過去の時間が各問合せで再計算されます。例:

    CREATE VIEW hour_ago AS
      SELECT * FROM employees
        AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE);
    

    SYSTIMESTAMPは、データベース・ホスト環境のタイムゾーンを参照します。

  • 自己結合または集合演算(INTERSECTMINUSなど)の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句を使用して、特定の時点に有効であったデータをチェックできます。

関連項目:

Oracle Flashback Version Queryの使用

特定の時間間隔内に存在していた、特定の行の様々なバージョンを取得するには、Oracle Flashback Version Queryを使用します。COMMIT文が実行されると、そのたびに行バージョンが作成されます。

ノート:

CREATE TABLE文の実行後、トランザクションをコミットするために少なくとも15秒待機して、Oracle Flashback Version Queryにそのトランザクションが反映されるようにします。

SELECT文でVERSIONS BETWEEN句を使用して、Oracle Flashback Version Queryを指定します。構文は次のいずれかになります。

VERSIONS BETWEEN { SCN | TIMESTAMP } start AND end

ここで、startおよびendはそれぞれ、問合せ対象の時間間隔の開始点と終了点を表す式です。時間間隔にはstartおよびendが含まれます。

または

VERSIONS PERIOD FOR user_valid_time [ BETWEEN TIMESTAMP start AND end ]

ここで、user_valid_timeはユーザー指定の有効時間を示しています。これについては「時間的な有効性のサポート」で説明しています。

Oracle Flashback Version Queryでは、特定の行について、指定した時間間隔内に存在していたすべてのバージョンの各1行を含む表が戻されます。表の各行には、行バージョンに関するメタデータの疑似列が含まれます。これらの列には、データベースに対して特定の変更(誤りの可能性がある)がいつどのように行われたかが示されます。

表19-1は、行バージョンに関するメタデータの擬似列を示しています。VERSIONS_*擬似列には、トランザクション時間のFlashback Version Query (BETWEEN TIMESTAMP start AND end句による問合せ)のみに関する値が含まれます。

表19-1 Oracle Flashback Version Queryにおける行データ疑似列

疑似列名 説明:

VERSIONS_STARTSCN

VERSIONS_STARTTIME

行バージョンが作成されたときの開始システム変更番号(SCN)またはTIMESTAMP。この疑似列によって、データの値が最初に行バージョンに反映された時間が識別されます。この疑似列を使用して、Oracle Flashback TableまたはOracle Flashback Queryにおける過去のターゲット時間を指定できます。

この疑似列がNULLの場合、その行バージョンは、startより前に作成されています。

VERSIONS_ENDSCN

VERSIONS_ENDTIME

行バージョンが期限切れとなったときのSCNまたはTIMESTAMP

この疑似列がNULLの場合、問合せの時点で行バージョンが最新であったか、またはその行がDELETE操作に対応しています。

VERSIONS_XID

その行バージョンが作成されたトランザクションの識別子。

VERSIONS_OPERATION

トランザクションにより実行された操作。Iは挿入、Dは削除、Uは更新を表します。バージョンは、挿入、削除または更新された行のバージョンです。つまり、INSERT操作後の行、DELETE操作前の行、またはUPDATE操作の影響を受ける行です。

ユーザーによる索引キーの更新の場合、Oracle Flashback Version Queryでは、UPDATE操作がDELETEおよびINSERTの2つの操作として処理される場合があり、Dの後にIVERSIONS_OPERATIONが続く、2つのバージョンの行で表されます。

指定された行バージョンは、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、およびその変更の担当ユーザーなど、このトランザクションのメタデータを検索できます。

フラッシュバック・バージョン問合せでは、IOT(索引構成表)のみを使用した索引専用アクセスが可能ですが、高速全索引スキャンは使用できません。

関連項目:

Oracle Flashback Transaction Queryの使用

Oracle Flashback Transaction Queryを使用して、特定の時間間隔内における特定のトランザクションまたはすべてのトランザクションのメタデータおよび履歴データを取得できます。Oracle Flashback Transaction Queryは、静的データ・ディクショナリ・ビューFLASHBACK_TRANSACTION_QUERYの問合せを行います。この表の列の詳細は、『Oracle Databaseリファレンス』を参照してください。

UNDO_SQLには、トランザクションで実行されたDML操作の論理的に逆の操作となるSQLコードがあります。通常、このコードを使用して、トランザクション中に実行された論理ステップを元に戻すことができます。ただし、UNDO_SQLのコードが、元のトランザクションの厳密な逆操作ではない場合があります。たとえば、UNDO_SQL 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')
);

ノート:

XIDWHERE句に指定せずにFLASHBACK_TRANSACTION_QUERYを問い合せると、問合せによって多数の無関係の行がスキャンされるため、パフォーマンスが低下します。

関連項目:

Oracle Flashback Transaction QueryとOracle Flashback Version 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.

ノート:

この問合せではXIDWHERE句に指定されていないため、多数の無関係の行をスキャンし、パフォーマンスが低下します。

DBMS_FLASHBACKパッケージの使用

DBMS_FLASHBACKパッケージでもOracle Flashback Queryと同じ機能が提供されますが、Oracle Flashback Queryのほうが便利な場合があります。

DBMS_FLASHBACKパッケージはタイムマシンのように機能します。つまり、時計を特定の時点に戻して、過去のその時点にいるかのように通常の問合せを実行し、その後現在に戻ることができます。DBMS_FLASHBACKパッケージを使用して、AS OFVERSIONS BETWEENなどの特別な句を使用せずに過去のデータに問合せを実行できるため、既存のPL/SQLコードを再使用して、過去の時点のデータベースを問い合せることができます。

DBMS_FLASHBACKパッケージのEXECUTE権限が必要です。

PL/SQLコードでDBMS_FLASHBACKパッケージを使用するには:

  1. DBMS_FLASHBACK.ENABLE_AT_TIMEまたはDBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBERを起動して、過去の時間を指定します。
  2. 通常の問合せ(AS OFなど、特別なフラッシュバック機能の構文を使用しない)を実行します。DDL操作やDML操作は実行しません。

    指定された過去の時間におけるデータベースに対し、問合せが行われます。

  3. 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番目のカーソルからフェッチします。過去のデータを一時表に格納し、その後MINUSUNIONなどの集合演算子を使用して、過去のデータと現在のデータを比較または結合できます。

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型を含む表が該当します。

関連項目:

トピック:

依存トランザクション

トランザクションのフラッシュバックのコンテキストでは、トランザクション2は、次のいずれかの方法で、トランザクション1に依存します。

  • Write-after-Write依存性

    トランザクション1は表の行を変更し、後からトランザクション2が同じ行を変更します。

  • 主キーの依存性

    ある表の列cには主キー制約が含まれます。この表のある行の列cには値vが入っています。トランザクション1はこの行を削除し、その後、トランザクション2は同じ表に行を1つ挿入し、値vを列cに割り当てます。

  • 外部キーの依存性

    表bの列b1には、表aの列a1にある外部キー制約が含まれます。トランザクション1はa1の値を変更し、後に、トランザクション2がb1の値を変更します。

TRANSACTION_BACKOUTパラメータ

TRANSACTION_BACKOUTプロシージャのパラメータは次のとおりです。

  • バックアウトするトランザクションの数

  • 名前またはXIDで識別されたバックアウトするトランザクションのリスト

  • 時間ヒント(名前でトランザクションを識別する場合)

    任意のトランザクションの開始時間より早い時間を指定します。

  • 表19-2のバックアウト・オプション

表19-2 フラッシュバックTRANSACTION_BACKOUTオプション

オプション 説明:

CASCADE

後行順で指定トランザクションおよびすべての依存トランザクションをバックアウトします(つまり、親がバックアウトされる前に子がバックアウトされます)。

CASCADEがない場合、依存トランザクションが指定されていないとエラーが発生します。

NOCASCADE

デフォルトです。依存トランザクションを持たないと予想される指定トランザクションをバックアウトします。最初の依存トランザクションによってエラーが発生し、*_FLASHBACK_TXN_REPORTに表示されます。

NOCASCADE_FORCE

依存トランザクションを無視して、指定トランザクションをバックアウトします。サーバーでは、コミット時間とは逆の順序で指定トランザクションのUNDO SQL文を実行します。

制約に違反せず、その結果に満足している場合は、変更をコミットできます。それ以外の場合は、ロールバックできます。

NONCONFLICT_ONLY

指定トランザクションの競合しない行に変更をバックアウトします。データベースの一貫性は保たれますが、トランザクションは完全に失われます。

TRANSACTION_BACKOUTではトランザクションの依存性を分析してDML操作を実行し、レポートを生成します。TRANSACTION_BACKOUTではトランザクション・バックアウトの一環として実行されるDML操作はコミットしませんが、正しい形式で行および表に対する必要なロックを保持し、他の依存関係がシステムに介入しないようにします。トランザクション・バックアウトを永続的なものにするには、明示的にトランザクションをコミットする必要があります。

関連項目:

TRANSACTION_BACKOUTプロシージャの構文、およびパラメータの詳細な説明は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

TRANSACTION_BACKOUTレポート

TRANSACTION_BACKOUTによって生成されたレポートを参照するには、静的データ・ディクショナリ・ビュー*_FLASHBACK_TXN_STATEおよび*_FLASHBACK_TXN_REPORTを問い合せます。

*_FLASHBACK_TXN_STATE

静的データ・ディクショナリ・ビュー*_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では、各バックアウト・トランザクションの詳細レポートを生成します。

関連項目:

*_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ファンクションを使用します。

  • データベース強化。この機能によって、アプリケーション内で一連の表を関連付けて、それらすべての表に対して1つのコマンドでフラッシュバック・データ・アーカイブを有効にすることができます。また、データベース強化により、すべての表を1つのコマンドでロックできます。後でロック解除するまでは、それらの表に対するDMLを防ぐことができます。データベース強化は、アプリケーション内のセキュリティ上の重要な表を、フラッシュバック・データ・アーカイブで容易に追跡および保護することを目的としています。

    データベース強化のためにアプリケーションを登録するには、DBMS_FLASHBACK_ARCHIVE.REGISTER_APPLICATIONプロシージャを使用します。この詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

トピック:

フラッシュバック・データ・アーカイブの作成

次を指定し、CREATE FLASHBACK ARCHIVE文を使用してフラッシュバック・データ・アーカイブを作成します。

  • フラッシュバック・データ・アーカイブの名前

  • フラッシュバック・データ・アーカイブの最初の表領域の名前

  • (オプション)フラッシュバック・データ・アーカイブが最初の表領域で使用できる最大領域量

    デフォルトは無制限。最初の表領域の領域割当て制限も無制限でないかぎりは、この値を指定する必要があります。指定しない場合、ORA-55621のエラーが発生します。

  • 保有時間(表のフラッシュバック・データ・アーカイブのデータの格納が保証されている日数)

  • (オプション)[NO] OPTIMIZE DATAを使用して、フラッシュバック・データ・アーカイブで管理する履歴表のデータの記憶域を最適化するかどうか。

    デフォルトはNO OPTIMIZE DATAです。

SYSDBAとしてログオンしている場合は、システムに対してこれをデフォルトのフラッシュバック・データ・アーカイブとして指定できます。このオプションを省略した場合でも、後でこのフラッシュバック・データ・アーカイブをデフォルトにできます。

フラッシュバック・データ・アーカイブを使用する必要があるすべてのユーザーに対しては、フラッシュバック・データ・アーカイブ表領域の割当て制限を無制限にすることをお薦めします。このようにできない場合は、それらのユーザーに対して十分な表領域の割当て制限を与える必要があります。

  • デフォルトのフラッシュバック・データ・アーカイブ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;
    

関連項目:

フラッシュバック・データ・アーカイブの変更

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文

フラッシュバック・データ・アーカイブは、次の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句を使用して、表でフラッシュバック・データ・アーカイブを無効化する必要があります。

関連項目:

フラッシュバック・データ・アーカイブ・データの表示

表19-3に静的データ・ディクショナリ・ビューを示し、簡潔に説明します。このビューに対して、フラッシュバック・データ・アーカイブ・ファイルに関する情報の問合せを実行できます。

表19-3 フラッシュバック・データ・アーカイブ・ファイルの静的データ・ディクショナリ・ビュー

ビュー 説明:

*_FLASHBACK_ARCHIVE

フラッシュバック・データ・アーカイブ・ファイルに関する情報を表示します。

*_FLASHBACK_ARCHIVE_TS

フラッシュバック・データ・アーカイブ・ファイルの表領域を表示します。

*_FLASHBACK_ARCHIVE_TABLES

データ・フラッシュバック・アーカイブ・ファイルが有効になっている表に関する情報を表示します。

関連項目:

フラッシュバック・データ・アーカイブの使用例

使用例: フラッシュバック・データ・アーカイブを使用したデジタル・シュレッディングの実行

企業で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に要求された更新を再度実行します。

Oracle Flashback Technologyの一般ガイドライン

  • 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のエラーが発生します。表の記憶域属性(PCTFREEINITRANSMAXTRANSなど)を変更する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 Technologyのパフォーマンス・ガイドライン

  • Oracle Flashback Queryに関連するすべての表の統計情報を生成するには、DBMS_STATSパッケージを使用します。統計情報を最新の状態に維持します。Oracle Flashback Queryは、これらの統計情報に依存するコストベース・オプティマイザを使用します。

  • アクセスする必要のあるUNDOデータの量を最小限にします。問合せを使用する際に、表全体をスキャンするのでなく、索引を使用して少量の過去データを選択します。全表をスキャンする必要がある場合は、問合せにパラレル・ヒントを追加します。

    I/Oのパフォーマンス・コストは、バッファ・キャッシュに存在していないデータおよびUNDOブロックにおけるページングのコストです。CPUの使用におけるパフォーマンス・コストは、影響を受けるデータ・ブロックにUNDO情報を適用する際のコストです。最近の過去における変更を操作する場合、フラッシュバック操作にはCPUの限界があります。

    アーカイバのバージョン問合せがバッファ・キャッシュでUNDOデータを見つけられるように、十分なバッファ・キャッシュを設定することをお薦めします。バッファ・キャッシュのアクセスは、ディスク・アクセスよりも大幅に高速です。

  • 追跡対象の表に非常に大きなトランザクション(1,000,000行超に影響)が実行される場合は、パラレル問合せが新たなチャンクをSGAから割り当てる必要がないように、十分な大容量のプール・サイズ(1GB以上)を設定します。

  • 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 Databaseパフォーマンス・チューニング・ガイド』を参照してください。

マルチテナント・コンテナ・データベースでのOracle Flashback Technologyの制限

次のOracle Flashback Technology機能は、マルチテナント・コンテナ・データベース(CDB)に対して使用不可です。

  • Oracle Database 12cリリース1 (12.1.0.1)の場合、フラッシュバック・データ・アーカイブ(FDA)はCDBでサポートされていません。

    Oracle Database 12cリリース1 (12.1.0.2)では、この制限がなくなります。

  • トランザクションのフラッシュバック問合せはCDBではサポートされません。

  • トランザクションのフラッシュバックのバックアウトはCDBではサポートされません。