22 Oracle Flashback Technologyの使用
この章では、データベース・アプリケーションにおけるOracle Flashback Technologyの使用について説明します。
トピック:
22.1 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概要』を参照してください。
22.1.1 アプリケーション開発機能
アプリケーション開発では、次のフラッシュバック機能を使用して、履歴データに関するレポートを作成したり、誤った変更を元に戻すことができます。(この機能は、データベース・ユーザーまたは管理者として対話形式でも使用できます。)
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レベルのアクセスが保証されます。
関連項目:
22.1.2 データベース管理機能
次のフラッシュバック機能は、主としてデータ・リカバリ用です。通常、この機能は、データベース管理者としてのみ使用します。
この章では、「アプリケーション開発機能」に重点を置いています。
Oracle Flashback Table
表の状態を以前の特定の時点までリカバリする場合に、この機能を使用します。データベースがオンラインの間は表のリストアが可能であり、指定した表に対する変更のみ元に戻すことができます。
Oracle Flashback Drop
削除された表をリカバリする場合に、この機能を使用します。この機能によって、DROP
TABLE
文の影響が無効になります。
Oracle Flashback Database
リカバリ領域を使用してデータベースをその時点まで迅速に戻す場合に、この機能を使用します。データベースのバックアップをリストアする必要がないため、処理が高速です。
22.2 Oracle Flashback Technologyに関するデータベースの構成
アプリケーションでフラッシュバック機能を使用するには、まず、ユーザーまたはデータベース管理者は次の各項で説明する構成タスクを実行する必要があります。
22.2.1 自動UNDO管理に関するデータベースの構成
自動UNDO管理(AUM)に関してデータベースを構成するには、ユーザーまたはデータベース管理者は次を実行する必要があります。
-
フラッシュバック操作に必要なデータを保持するために十分な領域を持つUNDO表領域を作成します。
データの更新回数が増加するほど、より多くの領域が必要になります。データベース管理者は通常、必要な領域を計算します。
-
『Oracle Database管理者ガイド』の説明に従ってAUMを有効にします。次のデータベース初期化パラメータを設定します。
-
UNDO_MANAGEMENT
-
UNDO_TABLESPACE
ノート:
-
UNDO_RETENTION
パラメータの追加構成は、Oracle Flashback操作またはActive Data Guardを使用する場合にのみ必要です。関連項目:
UNDO_RETENTION
パラメータの詳細は、『Oracle Database管理者ガイド』の最小UNDO保存期間の設定を参照してください -
Oracle Databaseリリース19cバージョン19.9以降では、CDBでの
UNDO_RETENTION
の値は継承されません。関連項目:
UNDO_RETENTION
パラメータの詳細は、『Oracle Databaseリファレンス』の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データが廃棄されないようにします。
関連項目:
-
UNDO表領域の作成とAUMの有効化の詳細は、『Oracle Database管理者ガイド』を参照してください。
-
V$UNDOSTAT
の詳細は、『Oracle Databaseリファレンス』を参照してください。
22.2.2 Oracle Flashback Transaction Queryに関するデータベースの構成
Oracle Flashback Transaction Query機能についてデータベースを構成するには、ユーザーまたはデータベース管理者は次を実行する必要があります。
-
Oracle Databaseがバージョン10.0と互換性があることを確認します。
-
サプリメンタル・ロギングを有効化します。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
22.2.3 フラッシュバック・トランザクションに関するデータベースの構成
フラッシュバック・トランザクション機能についてデータベースを構成するには、ユーザーまたはデータベース管理者は次を実行する必要があります。
-
データベースがマウントされているが、開かれていない状態で、
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;
ノート:
外部キーの制約が非常に多い場合、外部キーのサプリメンタル・ロギングを有効にしても、パフォーマンス・ペナルティに見合う効果は得られない可能性があります。
22.2.4 特定のLOB列に対するOracle Flashback操作の有効化
表の特定のLOB列に対するフラッシュバック操作を可能にするには、ALTER
TABLE
文をRETENTION
オプションとともに使用します。
LOB列のUNDOデータは膨大になる場合があるため、フラッシュバック操作で使用するLOB列を定義する必要があります。
関連項目:
LOB記憶域およびRETENTION
パラメータについて学習するには、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。
22.2.5 必要な権限の付与
ユーザーまたはデータベース管理者は、次のフラッシュバック機能を使用する必要があるユーザー、ロールまたはアプリケーションに対して権限を付与する必要があります。
関連項目:
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
システム権限が必要です。
22.3 Oracle Flashback Query(SELECT AS OF)の使用
Oracle Flashback Queryを使用するには、SELECT
文でAS
OF
句を使用します。Oracle Flashback Queryにより、過去のある時点で存在していたデータを取得できます。問合せでは、タイムスタンプまたはシステム変更番号(SCN)を使用することで、過去の時点が明示的に参照されます。その時点で最新であったコミット済データが戻されます。
Oracle Flashback Queryは、次のような場合に使用します。
-
失われたデータのリカバリや、誤ったコミット済の変更の取消しを行います。
たとえば、誤って行を削除または更新し、コミットしていても、すぐに誤りを元に戻すことができます。
-
現在のデータを過去の特定の時点の対応するデータと比較する場合。
たとえば、前日からのデータの変更を示す日報を作成できます。表データの個々の行の比較、または行セットの共通部分や結合の検索が可能です。
-
特定の時点での定義(DDL)データまたはスキーマの状態を確認する場合。
たとえば、表とそのスキーマに対してフラッシュバック問合せを発行して、表に対して行われたDDL変更の履歴を表示できます。
-
特定の時点でのトランザクション・データの状態を確認する場合。
たとえば、特定の日の預金残高を確認できます。
-
特定の時点、またはユーザー定義の有効期間内に有効なデータを選択します。
たとえば、特定のタイムスタンプの時点、または指定された有効期間内で指定の開始時刻から終了時刻の間の、有効な従業員情報を持つ従業員を見つけることができます。(詳細は、「時間的な有効性のサポート」を参照してください。)
-
アプリケーションの設計を簡略化する場合。一時データの類を格納する必要性をなくすことにより簡略化します。
Oracle Flashback Queryにより、データベースから直接過去のデータを取得できます。
-
レポート生成ツールなどのパッケージ・アプリケーションを過去のデータに適用します。
-
アプリケーションにセルフサービス・エラー修正を提供し、ユーザーが自分のエラーを元に戻して修正できるようにする場合。
トピック:
関連項目:
SELECT
AS
OF
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
22.3.1 例: 過去のデータの検査およびリストア
たとえば、午後12時30分に従業員Chungの行がemployee
表から削除されていることに気付き、午前9時30分にはこのデータがデータベース内に正しく格納されていたことを知っているとします。この場合、Oracle Flashback Queryを使用して午前9時30分の表の内容を調べ、失われたデータを見つけることができます。必要に応じて失われたデータをリストアできます。
例22-1では、2004年4月4日午前9時30分におけるChung
のレコードの状態が取得されます。
例22-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';
例22-2では、Chungの情報がemployees
表にリストアされます。
例22-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' );
22.3.2 Oracle Flashback Queryのガイドライン
-
各表に対して
AS
OF
句を指定または省略できます。また、異なる表に異なる時間を指定できます。ノート:
表がフラッシュバック・タイム・トラベルであり、この表の作成日時よりも過去の日時を指定すると、問合せはこの表に対して、エラーではなく0行を返します。
-
問合せで
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を使用します。「Oracle Flashback Technologyの一般ガイドライン」を参照してください。
-
ビューを定義する
SELECT
文のAS
OF
句を使用して、過去のデータを参照するビューを作成できます。データベース・ホストの現在の時間から引いて相対時間を指定すると、過去の時間が各問合せで再計算されます。たとえば:
CREATE VIEW hour_ago AS SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE);
SYSTIMESTAMP
は小数秒を含む現在の日付を返します。SYSTIMESTAMP
はTIME_AT_DBTIMEZONE
初期化パラメータの設定に応じて、データベース・ホスト・システムまたはデータベースのタイムゾーンを使用します。詳細は、『Oracle Databaseリファレンス』の「TIME_AT_DBTIMEZONE」を参照してください。 -
自己結合または集合演算(
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
は小数秒を含む現在の日付を返します。SYSTIMESTAMP
はTIME_AT_DBTIMEZONE
初期化パラメータの設定に応じて、データベース・ホスト・システムまたはデータベースのタイムゾーンを使用します。詳細は、『Oracle Databaseリファレンス』の「TIME_AT_DBTIMEZONE」を参照してください。 -
問合せに
AS
OF
句を使用して、特定の時点に有効であったデータをチェックできます。
関連項目:
-
フラッシュバック時間移動の使用(フラッシュバック時間移動の詳細)
22.4 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
ANDend
ここで、start
およびend
はそれぞれ、問合せ対象の時間間隔の開始点と終了点を表す式です。時間間隔にはstart
およびend
が含まれます。
または
VERSIONS PERIOD FOR user_valid_time [ BETWEEN TIMESTAMPstart
ANDend
]
ここで、user_valid_time
はユーザー指定の有効時間を示しています。これについては「時間的な有効性のサポート」で説明しています。
Oracle Flashback Version Queryでは、特定の行について、指定した時間間隔内に存在していたすべてのバージョンの各1行を含む表が戻されます。表の各行には、行バージョンに関するメタデータの疑似列が含まれます。これらの列には、データベースに対して特定の変更(誤りの可能性がある)がいつどのように行われたかが示されます。
表22-1は、行バージョンに関するメタデータの擬似列を示しています。VERSIONS_*
擬似列には、トランザクション時間のFlashback Version Query (BETWEEN
TIMESTAMP
start
AND
end
句による問合せ)のみに関する値が含まれます。
表22-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、およびその変更の担当ユーザーなど、このトランザクションのメタデータを検索できます。
フラッシュバック・バージョン問合せでは、IOT(索引構成表)のみを使用した索引専用アクセスが可能ですが、高速全索引スキャンは使用できません。
関連項目:
-
Oracle Flashback Version Queryの疑似列、および
VERSIONS
句の構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
22.5 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') );
ノート:
XID
をWHERE
句に指定せずにFLASHBACK_TRANSACTION_QUERY
を問い合せると、問合せによって多数の無関係の行がスキャンされるため、パフォーマンスが低下します。
関連項目:
-
データベース管理者がフラッシュバック表を使用して、個々の行ではなく表全体をリストアする方法の詳細は、『Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド』を参照してください。
-
データベース管理者がフラッシュバック表を使用して、個々の行ではなく表全体をリストアする方法の詳細は、『Oracle Database管理者ガイド』を参照してください。
22.6 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.
ノート:
この問合せではXID
がWHERE
句に指定されていないため、多数の無関係の行をスキャンし、パフォーマンスが低下します。
22.7 DBMS_FLASHBACKパッケージの使用
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
.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
パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
22.7.1 DBMS_FLASHBACKでのフラッシュバック・バージョン問合せの使用
DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER
またはDBMS_FLASHBACK.ENABLE_AT_TIME
プロシージャを使用して、セッションに対してDBMS_FLASHBACK
を有効にできます。ENABLE_AT_SYSTEM_CHANGE_NUMBER
およびENABLE_AT_TIME
プロシージャは、システム変更番号(SCN)に基づいています。Oracle Flashback Version Query (バージョン問合せ)を使用して、時間間隔に関するコミットされた行バージョンを取得できます。バージョン問合せ(VERSIONS BETWEEN
句を使用)を使用するには、特定のSCN
値を使用するか、MINVALUE
およびMAXVALUE
キーワードを使用して、SCN
の下限と上限を指定する必要があります。
バージョン問合せをDBMS_FLASHBACK
とともに使用すると、バージョン問合せのMAXVALUE
キーワードまたはSCN
の上限に影響します。つまり、バージョン問合せの上限のSCN
制限(MAXVALUE
キーワードまたは指定された値を使用)がDBMS_FLASHBACK
SCN
を超えると、バージョン問合せはDBMS_FLASHBACK
SCN
を上限として使用します。たとえば、SCN
パラメータをSCN_X
に設定したENABLE_AT_SYSTEM_CHANGE_NUMBER
プロシージャを使用して、セッションレベルのフラッシュバックを有効にするとします。VERSIONS BETWEEN
句を使用したバージョン問合せは、SCN_A
およびSCN_B
として最小制限と最大制限で後で渡されます。バージョン問合せを実行すると、SCN
は次のように処理されます:
-
バージョン問合せで(特定の
SCN_B
ではなく)MAXVALUE
句が指定されている場合、SCN_X
は最大制限として扱われます。 -
バージョン問合せに2つの
SCN
(SCN_A
およびSCN_B
)があり、SCN_B
がSCN_X
より小さい場合、バージョン問合せのSCN
は変更なしで保持されます。 -
バージョン問合せに2つの
SCN
(SCN_C
およびSCN_D
)があり、SCN_D
がSCN_X
より大きい場合、SCN_X
は最大制限として扱われます。
次のコード・サンプルは、セッションでDBMS_FLASHBACK
を有効にした後にバージョン問合せを使用する方法を示しています。
DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(123);
…
…
SELECT * FROM <table_name> VERSIONS BETWEEN SCN 120 and 125;
…
DBMS_FLASHBACK.DISABLE();
ここでは、バージョン問合せのSCN
の上限125は、バージョン問合せの上限SCN
がDBMS_FLASHABCK
SCN
より大きいため、DBMS_FLASHABCK
SCN
の値123に置き換えられます。その結果、次のバージョン問合せが生成されます:
SELECT * FROM <table_name> VERSIONS BETWEEN SCN 120 and 123;
関連項目:
-
DBMS_FLASHBACK
パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください -
Oracle Flashback Version Queryの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
22.8 フラッシュバック・トランザクションの使用
DBMS_FLASHBACK
.TRANSACTION_BACKOUT
プロシージャでは、データベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックします。このリカバリ操作では、UNDOデータを使用して対応する補正トランザクションを作成および実行します。このトランザクションによって影響のあったデータが元の状態に戻ります。
ロールバック中のトランザクションは、次の制約を受けます。
-
トランザクションは、データベース表の論理構造を変更するDDL操作を実行できません。
-
次のラージ・オブジェクト(LOB)データ型を使用できません。
-
BFILE
-
BLOB
-
CLOB
-
NCLOB
-
-
LogMinerがサポートしていない機能を使用できません。
LogMinerがサポートする機能は、トランザクションをロールバックしているデータベースの
COMPATIBLE
初期化パラメータの値によって異なります。デフォルト値は、最新メジャー・リリースのリリース番号です。トランザクションのフラッシュバックは、LogMinerからSQLデータ型サポートを継承します。したがって、トランザクションにサポートされていないSQLデータ型が含まれていたことが原因でLogMinerで障害が発生した場合、トランザクションのフラッシュバックでも障害が発生します。
一部のデータ型は、LogMinerではサポートされていますが、このような型の列を修正する操作の一端として、Undo情報を生成しません。したがって、トランザクションのフラッシュバックは、このようなデータ型を含む表をサポートしません。これには、BLOB型、CLOB型、およびXML型を含む表が該当します。
関連項目:
-
ロジカル・スタンバイ・データベースでのデータ型およびDDLサポートに関する詳細は、『Oracle Data Guard概要および管理』を参照してください。
-
LOBデータ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
-
LogMinerの詳細は、『Oracle Databaseユーティリティ』を参照してください。
-
COMPATIBLE
初期化パラメータの詳細は、『Oracle Database管理者ガイド』を参照してください。
トピック:
22.8.1 依存トランザクション
トランザクションのフラッシュバックのコンテキストでは、トランザクション2は、次のいずれかの方法で、トランザクション1に依存します。
-
Write-after-Write依存性
トランザクション1は表の行を変更し、後からトランザクション2が同じ行を変更します。
-
主キーの依存性
ある表の列cには主キー制約が含まれます。この表のある行の列cには値vが入っています。トランザクション1はこの行を削除し、その後、トランザクション2は同じ表に行を1つ挿入し、値vを列cに割り当てます。
-
外部キーの依存性
表bの列b1には、表aの列a1にある外部キー制約が含まれます。トランザクション1はa1の値を変更し、後に、トランザクション2がb1の値を変更します。
22.8.2 TRANSACTION_BACKOUTパラメータ
TRANSACTION_BACKOUT
プロシージャのパラメータは次のとおりです。
-
バックアウトするトランザクションの数
-
名前またはXIDで識別されたバックアウトするトランザクションのリスト
-
時間ヒント(名前でトランザクションを識別する場合)
任意のトランザクションの開始時間より早い時間を指定します。
-
表22-2のバックアウト・オプション
表22-2 フラッシュバックTRANSACTION_BACKOUTオプション
オプション | 説明: |
---|---|
|
後行順で指定トランザクションおよびすべての依存トランザクションをバックアウトします(つまり、親がバックアウトされる前に子がバックアウトされます)。
|
|
デフォルトです。依存トランザクションを持たないと予想される指定トランザクションをバックアウトします。最初の依存トランザクションによってエラーが発生し、 |
|
依存トランザクションを無視して、指定トランザクションをバックアウトします。サーバーでは、コミット時間とは逆の順序で指定トランザクションのUNDO SQL文を実行します。 制約に違反せず、その結果に満足している場合は、変更をコミットできます。それ以外の場合は、ロールバックできます。 |
|
指定トランザクションの競合しない行に変更をバックアウトします。データベースの一貫性は保たれますが、トランザクションは完全に失われます。 |
TRANSACTION_BACKOUT
ではトランザクションの依存性を分析してDML操作を実行し、レポートを生成します。TRANSACTION_BACKOUT
ではトランザクション・バックアウトの一環として実行されるDML操作はコミットしませんが、正しい形式で行および表に対する必要なロックを保持し、他の依存関係がシステムに介入しないようにします。トランザクション・バックアウトを永続的なものにするには、明示的にトランザクションをコミットする必要があります。
関連項目:
TRANSACTION_BACKOUT
プロシージャの構文、およびパラメータの詳細な説明は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
22.8.3 TRANSACTION_BACKOUTレポート
TRANSACTION_BACKOUT
によって生成されたレポートを参照するには、静的データ・ディクショナリ・ビュー*_FLASHBACK_TXN_STATE
および*_FLASHBACK_TXN_REPORT
を問い合せます。
22.8.3.1 *_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リファレンス』を参照してください。
22.8.3.2 *_FLASHBACK_TXN_REPORT
静的データ・ディクショナリ・ビュー*_FLASHBACK_TXN_REPORT
では、各バックアウト・トランザクションの詳細レポートを生成します。
関連項目:
*_FLASHBACK_TXN_REPORT
の詳細は、『Oracle Databaseリファレンス』を参照してください。
22.9 フラッシュバック・タイム・トラベルの使用
フラッシュバック・タイム・トラベルにより、その存続期間中、表に対する定義(スキーマを含む)およびトランザクションによる変更を追跡および格納できます。
フラッシュバック・タイム・トラベルを使用すると、追跡されている表(追跡対象の表とも呼ばれる)に対するDML (INSERT
やDELETE
など)およびDDL操作(表の作成や切捨てなど)の追跡が可能になります。その後、フラッシュバック・データ・アーカイブ(フラッシュバック・アーカイブとも呼ばれる)を使用して、追跡対象の表の行に加えられた変更を履歴表にアーカイブできます。フラッシュバック・タイム・トラベルでは、表スキーマの進化の履歴も保持されます。表およびスキーマの履歴が保持されていると、表とそのスキーマに対してフラッシュバック問合せ(AS OF
およびVERSIONS
)を発行できます。表に対して行われたDDLおよびDMLの変更の履歴も表示できます。
フラッシュバック・タイム・トラベル機能を使用すると、データベースに複数のフラッシュバック・アーカイブを作成できます。フラッシュバック・アーカイブは、一連の表領域に関連付けられている論理エンティティです。これらの表領域のアーカイブ用に予約された割当て制限と、アーカイブ・データの保存期間があります。フラッシュバック・アーカイブを使用すると、パフォーマンスが向上し、レコード・ステージ・ポリシーおよび監査レポートに準拠するのに役立ちます。
フラッシュバック・アーカイブは、1つ以上の表領域またはその一部で構成されています。フラッシュバック・アーカイブは複数所有できます。SYSDBA
としてログオンしている場合は、システムに対してデフォルトのフラッシュバック・アーカイブを指定できます。フラッシュバック・アーカイブは、保有時間を使用して構成されます。フラッシュバック・アーカイブにアーカイブされたデータは、フラッシュバック・アーカイブ作成時に指定した保有時間まで保持されます。
特定の表に対してフラッシュバック・アーカイブを選択する場合は、その表のデータ保有要件およびFLASHBACK
ARCHIVE
オブジェクト権限のあるフラッシュバック・アーカイブの保有時間を考慮してください。
フラッシュバック・アーカイブ履歴表のデータ・セキュリティを確保するために、表のフラッシュバック・アーカイブを有効にするときに、追跡対象の表がフラッシュバック・アーカイブにブロックチェーン履歴表を使用するように指定できます。
関連項目:
フラッシュバック・アーカイブでのブロックチェーン履歴表の使用の詳細は、「フラッシュバック・アーカイブ・データの保護」を参照してください
-
ユーザー・コンテキストのトラッキング。トランザクションのトラッキングに関するメタデータ情報は、ユーザー・コンテキストを含むことができます(機能が有効になっている場合)。これによって、どのユーザーが何の変更を表に加えたかを確認しやすくなります。
ユーザー・コンテキスト・レベル(保存するユーザー・コンテキストの量を決定)を設定するには、
DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVEL
プロシージャを使用します。コンテキスト情報にアクセスするには、DBMS_FLASHBACK_ARCHIVE.GET_SYS_CONTEXT
ファンクションを使用します。 -
データベース強化。アプリケーション内で一連の表を関連付けて、それらすべての表に対して1つのコマンドでフラッシュバック・アーカイブを有効にできます。また、データベース強化により、すべての表を1つのコマンドでロックできます。後でロック解除するまでは、それらの表に対するDMLを防ぐことができます。データベース強化は、アプリケーション内のセキュリティ上の重要な表を、フラッシュバック・タイム・トラベルで容易に追跡および保護することを目的としています。
データベース強化のためにアプリケーションを登録するには、
DBMS_FLASHBACK_ARCHIVE.REGISTER_APPLICATION
プロシージャを使用します。この詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
フラッシュバック・タイム・トラベルは、デジタル・シュレッディングの実施、履歴データへのアクセス、選択的データ・リカバリ、監査などの様々なシナリオでも使用できます。
フラッシュバック・タイム・トラベルの制限
-
LONG
データ型またはネストした表の列を含む表に対してはフラッシュバック・アーカイブを有効にできません。 -
ネストした表、一時表、外部表、マテリアライズド・ビュー、詳細な問合せ(AQ)表、ハイブリッド・パーティション表または表以外のオブジェクトに対して、フラッシュバック・アーカイブを有効にすることはできません。
-
フラッシュバック・アーカイブは、パーティションまたはサブパーティションを移動、分割、マージまたは結合したり、表を移動したり、
LONG
列をLOB列に変換するDDL文はサポートしていません。 -
フラッシュバック・アーカイブが有効になっている表に対する制約(外部キー制約を含む)の追加または有効化は、ORA-55610で失敗します。フラッシュバック・アーカイブが有効になっている表に対する制約(外部キー制約を含む)の削除または無効化はサポートされています。
-
表に対してフラッシュバック・アーカイブを有効にした後は、まず表にデータを挿入するまでに20秒以上待ち、また、表にフラッシュバック問合せを使用するまでに最大5分間待つことをお薦めします。
-
フラッシュバック・アーカイブの実表を削除するには、まず実表のフラッシュバック・アーカイブを無効にする必要があり、その後、実表を削除できます。フラッシュバック・アーカイブを無効にすると履歴データは削除されますが、フラッシュバック・アーカイブの関連付けを解除しても履歴データは保持されます。さらに、実表の切捨てもサポートされており、この場合、履歴データはフラッシュバック・アーカイブで引き続き使用できます。
-
表に対してフラッシュバック・アーカイブを有効にしても、自動UNDO管理(AUM)が無効になっている場合は、表を変更しようとするとエラーORA-55614が発生します。
-
表で
STARTSCN
、ENDSCN
、RID
、XID
、OP
、OPERATION
のいずれかのフラッシュバック・タイム・トラベル予約語が列名として使用されている場合は、フラッシュバック・アーカイブを有効にできません。 -
関連付けられている使用可能な各表領域について領域使用率が最大領域の90%を超えると、フラッシュバック・アーカイブ操作の速度が低下するか、応答しなくなることが予想されます。フラッシュバック・アーカイブの使用率が関連するすべての表領域で90%のしきい値に近づいた場合、フラッシュバック・アーカイブで使用できる最大領域を増やす必要があります。
-
標準モード(
MAX_COLUMNS = STANDARD
)では、フラッシュバック・アーカイブに対して有効化されている表では、アーカイブされていない表に最大1024個の列が許可される点とは異なり、最大991個の列が許可されます。 - 拡張モード(
MAX_COLUMNS = EXTENDED
)では、フラッシュバック・アーカイブに対して有効化されている表では、アーカイブされていない表に最大4096個の列が許可される点とは異なり、最大4087個の列が許可されます。
トピック:
関連項目:
DBMS_FLASHBACK_ARCHIVE
パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
22.9.1 フラッシュバック・アーカイブが有効な表に対する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
句を使用して、表でフラッシュバック・アーカイブを無効にする必要があります。
関連項目:
-
ALTER
TABLE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 -
TRUNCATE
TABLE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 -
RENAME
文の詳細は、Oracle Database SQLリファレンスを参照 -
DROP
TABLE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 -
DBMS_FLASHBACK_ARCHIVE
パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
22.9.2 フラッシュバック・アーカイブの作成
フラッシュバック・アーカイブは、CREATE
FLASHBACK
ARCHIVE
文を使用して作成できます。
次を指定し、CREATE
FLASHBACK
ARCHIVE
文を使用して、フラッシュバック・アーカイブを作成します。
-
フラッシュバック・アーカイブの名前
-
フラッシュバック・アーカイブの最初の表領域の名前
-
(オプション)フラッシュバック・アーカイブが最初の表領域で使用できる最大領域量
デフォルトは無制限。最初の表領域の領域割当て制限も無制限でないかぎりは、この値を指定する必要があります。指定しない場合、ORA-55621のエラーが発生します。
ノート:
フラッシュバック・アーカイブの最大領域として十分な領域を確保してください。使用可能な各フラッシュバック・アーカイブ表領域について使用済領域が最大領域の90%を超えると、フラッシュバック・アーカイブ操作の速度が低下するか、応答しなくなる可能性があります。
-
保有時間(表のフラッシュバック・アーカイブのデータの格納が保証されている日数)
-
(オプション)フラッシュバック・アーカイブで管理する履歴表のデータの記憶域を最適化するかどうか(
[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;
関連項目:
-
CREATE
FLASHBACK
ARCHIVE
文の構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
22.9.3 フラッシュバック・アーカイブの変更
フラッシュバック・アーカイブを変更するには、ALTER
FLASHBACK
ARCHIVE
文を使用します。
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言語リファレンス』を参照してください。
22.9.4 フラッシュバック・アーカイブの削除
フラッシュバック・アーカイブを削除するには、DROP
FLASHBACK
ARCHIVE
文を使用します。
フラッシュバック・アーカイブを削除するとその履歴データは削除されますが、その表領域は削除されません。
例
表領域を削除せず、フラッシュバック・アーカイブfla1
およびそのすべての履歴データを削除します。
DROP FLASHBACK ARCHIVE fla1;
DROP
FLASHBACK
ARCHIVE
文の構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
22.9.5 デフォルトのフラッシュバック・アーカイブの指定
デフォルトのフラッシュバック・アーカイブを指定するには、CREATE
またはALTER
FLASHBACK
ARCHIVE
文を使用します。
システムのデフォルト・フラッシュバック・アーカイブは、自分自身のデフォルト・フラッシュバック・アーカイブを持たないすべてのユーザーに対するデフォルト・フラッシュバック・アーカイブです。
デフォルトでは、システムにはデフォルト・フラッシュバック・アーカイブがありません。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;
関連項目:
-
CREATE
FLASHBACK
ARCHIVE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 -
ALTER
DATABASE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
22.9.6 フラッシュバック・アーカイブの有効化および無効化
デフォルトでは、フラッシュバック・アーカイブはすべての表に対して無効になっています。その表に対して使用するフラッシュバック・アーカイブのFLASHBACK
ARCHIVE
オブジェクト権限がある場合は、表のフラッシュバック・アーカイブを有効にできます。
表に対してフラッシュバック・アーカイブを有効にするには、CREATE
TABLE
文またはALTER
TABLE
文にFLASHBACK
ARCHIVE
句を含めます。FLASHBACK
ARCHIVE
句には、その表の履歴データを格納するフラッシュバック・アーカイブを指定できます。デフォルトは、システムのデフォルト・フラッシュバック・アーカイブです。存在しないフラッシュバック・アーカイブを指定すると、エラーが発生します。
表でフラッシュバック・アーカイブが有効になっている場合は、別のフラッシュバック・アーカイブを再度有効にしようとするとエラーが発生します。
表に対してフラッシュバック・アーカイブを有効にした後は、FLASHBACK
ARCHIVE
ADMINISTER
システム権限がある場合、またはSYSDBA
としてログオンしている場合のみ、これを無効にできます。表に対してフラッシュバック・アーカイブを無効にするには、ALTER
TABLE
文にNO
FLASHBACK
ARCHIVE
を指定します。(CREATE
TABLE
文にNO
FLASHBACK
ARCHIVE
を指定する必要はありません。これはデフォルトです。)
関連項目:
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;
22.9.7 フラッシュバック・アーカイブ・データの表示
フラッシュバック・アーカイブ・ファイルに関する情報は、静的データ・ディクショナリ・ビューで表示できます。
表22-3 フラッシュバック・アーカイブ・ファイルの静的データ・ディクショナリ・ビュー
ビュー | 説明: |
---|---|
|
フラッシュバック・アーカイブ・ファイルに関する情報を表示します |
|
フラッシュバック・アーカイブ・ファイルの表領域を表示します |
|
フラッシュバック・アーカイブが有効な表に関する情報を表示します |
関連項目:
-
*_FLASHBACK_ARCHIVE
の詳細は、『Oracle Databaseリファレンス』を参照してください。 -
*_FLASHBACK_ARCHIVE_TS
の詳細は、『Oracle Databaseリファレンス』を参照してください。 -
*_FLASHBACK_ARCHIVE_TABLES
の詳細は、『Oracle Databaseリファレンス』を参照してください。
22.9.8 データベース間でのフラッシュバック・アーカイブ・データの転送
フラッシュバック・アーカイブの実表とその履歴を別のデータベースにエクスポートおよびインポートするには、FLASHBACK_ARCHIVE_MIGRATE
パッケージおよびOracleトランスポータブル表領域機能を使用します。
DBMS_FLASHBACK_ARCHIVE_MIGRATEを使用すると、パッケージが存在する任意のリリースのデータベースからフラッシュバック・タイム・トラベルをサポートする任意のリリースのデータベースに、フラッシュバック・アーカイブが有効な表を移行できます。
関連項目:
DBMS_FLASHBACK_ARCHIVE_MIGRATEパッケージの使用方法の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください
22.9.9 フラッシュバック時間移動のシナリオ
22.9.9.1 シナリオ: フラッシュバック・タイム・トラベルを使用したデジタル・シュレッディングの実行
企業でTaxes
表に対する履歴データの変更内容を10年後に「シュレッド」(削除)するとします。Taxes
のフラッシュバック・アーカイブを作成する際、10年の保有時間を指定します。
CREATE FLASHBACK ARCHIVE taxes_archive TABLESPACE tbs1 RETENTION 10 YEAR;
Taxes
のトランザクションからの履歴データは、10年を超えるとパージされます。(Taxes
の表自体、および10年未満のトランザクションからの履歴データはパージされません。)
22.9.9.2 シナリオ: フラッシュバック・タイム・トラベルを使用した履歴データへのアクセス
表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;
22.9.9.3 シナリオ: フラッシュバック・タイム・トラベルを使用したレポートの生成
ユーザーが、過去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';
22.9.9.4 シナリオ: フラッシュバック・タイム・トラベルの監査への使用
医療保険会社では、診療所を監査する必要があります。医療保険会社は表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');
22.9.9.5 シナリオ: フラッシュバック・タイム・トラベルを使用したデータのリカバリ
エンドユーザーが、データベースですでにコミット済の誤ったトランザクションからリカバリします。誤ったトランザクションの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に要求された更新を再度実行します。
22.9.10 フラッシュバック・アーカイブ・データの保護
追跡対象の表(変更の追跡が必要なユーザー表)のフラッシュバック・アーカイブ(FBA)データを保護することを選択できます。そのためには、表(非ブロックチェーン表、不変表)を作成するときに、オプションのBLOCKCHAIN
キーワードをFLASHBACK ARCHIVE
句とともに使用します。アーカイブ・データは、Oracle管理のブロックチェーン・ログ履歴表に格納されます。
次のコード例では、CREATE TABLE
コマンドでBLOCKCHAIN FLASHBACK ARCHIVE
句を使用して、ブロックチェーンベースのFBAを使用して追跡される表を作成します。
CREATE TABLE tab1 (
id NUMBER,
description VARCHAR2(50),
CONSTRAINT tab_1_pk PRIMARY KEY (id)
) BLOCKCHAIN FLASHBACK ARCHIVE fba_1year;
ノート:
表を作成する前に、指定したFBAがすでに存在していることを確認してください。
関連項目:
表をFBAの追跡対象の表として指定する方法の詳細は、『Oracle Database SQL言語リファレンス』のCREATE TABLE flashback_archive_clauseおよびCREATE FLASHBACK ARCHIVEを参照してください
ブロックチェーン表としてFBA履歴表を使用すると、(追跡対象の)通常のユーザー表に加えられた変更の履歴を、暗号的にセキュアで検証可能な方法で記録できます。FBA履歴表を問い合せて、追跡対象の表の内容が改ざんされているかどうかを確認できます。
ブロックチェーン・ログ履歴表の概要
ブロックチェーン・ログ履歴表は、他のブロックチェーン表と同様に、行を多数のチェーンにまとめる追加専用の表であり、チェーン内の(最初の行を除く)各行は、暗号化ハッシュを使用してチェーンの前の行に連鎖されます。追跡対象の表内の各変更は、ブロックチェーン表に作成および維持される暗号化ハッシュ・チェーン内の個別の行として、ブロックチェーン表に追加されます。
関連項目:
ブロックチェーン表の詳細は、『Oracle Database管理者ガイド』の「BlockchainTablesの管理」を参照してください
次に、ブロックチェーン・ログ履歴表(ブロックチェーン履歴表)の概要を示します。
-
ブロックチェーン・ログ履歴表は、Oracle定義のスキーマ定義を含むOracle管理の追加専用表です。
-
ブロックチェーン履歴表は、ユーザー表の変更を追跡し、変更が改ざんされていないことを確認するために使用されます。
-
ブロックチェーン履歴表のデータおよびチェーンの整合性は、標準のブロックチェーン表APIを使用して検証できます。
-
ブロックチェーン表には、表レベルおよび行レベルの保存期間が関連付けられています。ブロックチェーン履歴表に使用する行の保存期間を決定するために、使用されるFBA履歴表およびブロックチェーン表の行の保存期間が長くなります。同様に、表の保存期間を決定するには、使用するFBA履歴表およびブロックチェーン表の保存期間が長くなります。
-
ブロックチェーン履歴履歴表での行の削除は、チェーンの接頭辞に対してのみ許可されます。
-
ブロックチェーン履歴表の所有者は、FBA履歴表の所有者と同じです。
FBAデータの保存方法の理解
追跡対象の表の行は、トランザクションが行に変更をコミットするたびに存続期間が作成され、その一連の存続期間が遷移します。(行を変更した最後のトランザクションによって作成された)最新の存続期間は「現在の存続期間」と呼ばれ、それまでのすべての存続期間は「履歴存続期間」と呼ばれます。
履歴存続期間には、開始システム変更番号(SCN)と終了SCNがあり、表内の特定の行バージョンの存続期間の開始時間と終了時間を示します。現在の存続期間には開始SCNがありますが、終了SCNは無限です。新しく作成された履歴存続期間の終了SCNは、行に影響を与えた最新のトランザクションのコミットSCNに設定されます。
フラッシュバック・タイム・トラベルでは、次の内部表を使用して追跡対象の各表から存続期間を記録します:
-
履歴存続期間を記録するブロックチェーン履歴表(
SYS_FBA_HIST_<objno>
) -
現在の存続期間を記録する一時表(
SYS_FBA_TCRV_<objno>
またはtcrv
表)
表に対してFBAを有効にすると、フラッシュバック・タイム・トラベルによって、対応する履歴表および一時表(tcrv
)が内部的に作成されます。ブロックチェーン履歴表には、追跡対象の表の行で変更が行われるたびに、履歴行バージョンがすべて保存されます。tcrv
表(ブロックチェーン表ではない)には、最新の行変更が記録されます。
関連項目:
追跡対象の表に対するDML更新をブロックチェーン表および一時表に記録する方法の詳細は、付録: 追跡対象の表に対するDML変更の記録(付録)を参照してください
FBAデータの保護とその整合性の検証
FBA履歴表に対してブロックチェーン表を使用すると、FBAからセキュアな履歴をリプレイして、追跡対象の表に改ざんがあったかどうかを判断できます。
ブロックチェーンは、データの暗号化ダイジェスト(ブロックチェーン・ダイジェスト)を計算して保存することで機能します。ブロックチェーン・ダイジェストは、表所有者のプライベート・キーを使用してOracleインスタンスによってデジタル署名されたブロックチェーン表を明確に定義したサマリーです。ブロックチェーン・ダイジェストを計算すると、特定の時点におけるブロックチェーン表で各チェーンの最後の行に関するメタデータとデータのスナップショットが提供されます。このダイジェストは、改ざんを検出するためにデータベースの外部に保存できます。追跡するデータが変更された場合、新しいデータのブロックチェーン・ダイジェストは、以前に格納されたダイジェストとは異なります。
関連項目:
『Oracle Database管理者ガイド』の「署名ダイジェストの形式」のブロックチェーン表ダイジェストのデータ形式の説明
ブロックチェーン表は、新しい行を暗号化して既存の行に自動的に連鎖するため、非常に安全です。BLOCKCHAIN
キーワードを使用して追跡される表の場合、行が追加されると、新しい行と前の行のダイジェストに対して暗号化ダイジェストが計算されます。行チェーン内のデータを変更すると、暗号化チェーンが破損します。ブロックチェーンを検証するには、データベースからDBMS_BLOCKCHAIN_TABLE.VERIFY_ROWS
などの標準のブロックチェーン検証プロシージャを使用するか、データベース外でブロックチェーンを個別に検証します。
ブロックチェーン履歴表に挿入されたすべての履歴の存続期間は、ブロックチェーンのセマンティクスを使用して保護されるため、改ざんがないか検証できます。DBMS_BLOCKCHAIN_TABLE.GET_SIGNED_BLOCKCHAIN_DIGEST
などのブロックチェーン・ファンクションを使用して、指定したブロックチェーン表に署名済ブロックチェーン・ダイジェストを生成し、行変更によるデータの整合性を検証できます。
現在の存続期間については、関連するメタデータがtcrv
表(SYS_FBA_TCRV_<objno>
)に記録されます。DBMS_FLASHBACK_ARCHIVE.GET_CURRENT_LIFESPAN_DIGEST
ファンクションを使用すると、追跡対象の表内で指定された行の現在の存続期間ダイジェストを生成できます。このAPIは、tcrv
表の関連メタデータを使用して、追跡対象の表の特定の行で現在の存続期間ダイジェストを計算します。このダイジェストを記録して、行データの破損を検出できます。
また、DBMS_FLASHBACK_ARCHIVE.VERIFY_BLOCKCHAIN_LIFESPAN
プロシージャを使用して、現在の存続期間、履歴存続期間またはすべての存続期間を確認できます。
関連項目:
-
ブロックチェーン表に使用されるブロックチェーン・ダイジェスト・ファンクションおよび検証プロシージャの詳細は、『Oracle Database PL/SQL言語リファレンス』のDBMS_BLOCKCHAIN_TABLEを参照してください
-
現在の存続期間に使用されるブロックチェーン・ダイジェスト・ファンクションおよび検証プロシージャの詳細は、『Oracle Database PL/SQL言語リファレンス』のDBMS_FLASHBACK_ARCHIVEを参照してください
22.10 Oracle Flashback Technologyの一般ガイドライン
フラッシュバック・テクノロジを使用する場合は、これらのベスト・プラクティスを考慮してください。
- 表でフラッシュバック・アーカイブが有効になるまでは、表に対してフラッシュバック問合せを発行しないようにしてください。または、表に対してDML操作を実行する前にフラッシュバック・アーカイブを有効にします。
この例では、一連のアクションによりa=1の行が返されます。これは正しくない結果のように見える可能性があり、これを回避するには、行を挿入する前にフラッシュバック・アーカイブを有効にする必要があります。
CREATE TABLE foo (a NUMBER); VAR scn1 NUMBER; BEGIN SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMEBR INTO :scn FROM DUAL; END; INSERT INTO foo VALUES (1); COMMIT; ALTER TABLE foo FLASHBACK ARCHIVE; UPDATE foo SET a=2 WHERE a=1; COMMIT; SELECT * FROM foo AS OF SCN :scn;
-
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
など)では、過去のデータに問合せを実行できます。ノート:
静的データ・ディクショナリ・ビューを使用して過去のデータを取得できない場合は、対応する実表を問い合せてデータを取得できます。ただし、実表は正規化され、ほとんどのデータは暗号化形式で格納されるため、Oracleでは直接使用しないことをお薦めします。 -
フラッシュバック・アーカイブを作成または変更するときに
OPTIMIZE
DATA
を指定することで、フラッシュバック・アーカイブで管理される履歴表のデータ記憶域を最適化できますOPTIMIZE
DATA
を指定すると、次のいずれかの機能で履歴表のデータ記憶域が最適化されます。-
高度な行圧縮
-
高度なLOB圧縮
-
高度なLOB重複除外
-
セグメント・レベルの圧縮層
-
行レベルの圧縮層
デフォルトは、履歴表のデータ記憶域は最適化されません。
-
-
VPDポリシーを作成した後、フラッシュバック・アーカイブ履歴表に相当するポリシーを作成することを検討してください。
仮想プライベート・データベース・ポリシーおよびフラッシュバック・タイム・トラベルの詳細は、Oracle Databaseセキュリティ・ガイドを参照してください
注意:
ユーザーが生成した履歴をインポートすると、不正確で信頼性のない結果となる可能性があります。このプロシージャを使用する場合は、事前にOracleサポートに連絡してください。
22.11 Oracle Virtual Private DatabaseポリシーとOracle Flashback Time Travel
Oracle Virtual Private Databaseポリシーは、Oracle Flashback Time Travelでは自動的に機能しません。
表のOracle Virtual Private Database (VPD)ポリシーを作成したら、フラッシュバック・アーカイブ履歴表に相当するポリシーを作成することを検討してください。次の例は、その方法を示しています。
例22-3 フラッシュバック・アーカイブ履歴表に相当するポリシーの作成
- 一時VPD管理ユーザーを作成します。
CREATE USER sysadmin_vpd IDENTIFIED BY password CONTAINER = CURRENT; GRANT CREATE SESSION, CREATE ANY CONTEXT, CREATE PROCEDURE TO sysadmin_vpd; GRANT EXECUTE ON DBMS_SESSION TO sysadmin_vpd; GRANT EXECUTE ON DBMS_FLASHBACK, DBMS_FLASHBACK_ARCHIVE TO sysadmin_vpd; GRANT EXECUTE ON DBMS_RLS TO sysadmin_vpd; GRANT UPDATE ON SCOTT.EMP TO sysadmin_vpd;
sysadmin_vpd
ユーザーとしてPDBに接続します。connect sysadmin_vpd@pdb_name Enter password: password Connected.
- VPD関数を作成します。
たとえば、次の関数は、部門番号(
deptno
) 30の行のみをユーザーSCOTT
以外のユーザーに表示します。CREATE OR REPLACE FUNCTION emp_policy_func ( v_schema IN VARCHAR2, v_objname IN VARCHAR2) RETURN VARCHAR2 AS condition VARCHAR2 (200); BEGIN condition := 'deptno=30'; IF sys_context('userenv', 'session_user') IN ('SCOTT') THEN RETURN NULL; ELSE RETURN (condition); END IF; END emp_policy_func; /
-
次のVPDプロシージャを作成して、
emp_policy_func
関数をSCOTT.EMP
表に付加します。BEGIN DBMS_RLS.ADD_POLICY ( object_schema => 'scott', object_name => 'emp', policy_name => 'emp_policy', function_schema => 'sysadmin_vpd', policy_function => 'emp_policy_func', policy_type => dbms_rls.dynamic); END; /
-
次の
test
ユーザーを作成し、フラッシュバック・アーカイブに関連するものを含む権限を付与します。CREATE USER test IDENTIFIED BY password; GRANT CREATE SESSION TO test; GRANT CONNECT, RESOURCE TO test; GRANT SELECT ON SCOTT.EMP TO test; GRANT FLASHBACK ARCHIVE ON ftest TO test; GRANT EXECUTE ON DBMS_FLASHBACK_ARCHIVE TO test; GRANT EXECUTE ON DBMS_FLASHBACK TO test; GRANT FLASHBACK ANY TABLE TO PUBLIC; GRANT EXECUTE ON emp_policy_func TO PUBLIC;
-
フラッシュバック・アーカイブおよびトランザクションの
SCOTT.EMP
表を有効にします。ALTER TABLE SCOTT.EMP FLASHBACK ARCHIVE;
-
SCOTT.EMP
表の更新を実行します。UPDATE SCOTT.EMP SET SAL=SAL+1; COMMIT;
-
前述の手順を60秒間スリープにします。
EXEC DBMS_LOCK.SLEEP(60);
-
ユーザー
test
として接続します。connect test@pdb_name Enter password: password Connected.
-
VPDポリシーごとに
deptno=30
を持つ行のみを表示するには、次の問合せを実行します。SELECT EMPNO,DEPTNO,SAL FROM SCOTT.EMP;
VPDポリシーは、すべての行が表示されるため機能していません。
SELECT EMPNO,DEPTNO,SAL FROM SCOTT.EMP AS OF TIMESTAMP SYSDATE-1;
-
ユーザー
sysadmin_vpd
で接続します。connect sysadmin_vpd@pdb_name Enter password: password Connected.
-
EMP
表のオブジェクトIDを検索します。SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OBJECT_NAME='EMP';
-
SYS_FBA_HIST_object_id_of_EMP_table
表に同様のVPDポリシーを定義します。この表はフラッシュバック・アーカイブによって内部的に作成されます。BEGIN DBMS_RLS.ADD_POLICY ( object_schema => 'scott', object_name => 'sys_fba_hist_object_id_of_EMP_table', policy_name => 'emp_hist_policy', function_schema => 'sysadmin_vpd, policy_function => 'emp_policy_func', policy_type => dbms_rls.dynamic); END; /
test
ユーザーとして接続します。connect test@pdb_name Enter password: password Connected.
- ポリシーを再度テストします。
SELECT EMPNO,DEPTNO,SAL FROM SCOTT.EMP AS OF TIMESTAMP SYSDATE-1;
VPDポリシーが機能するようになりました。これは、問合せで
deptno=30
を含む行のみが表示されるためです。 - ユーザー・アカウントを削除できるユーザーとして接続します。
たとえば:
connect sec_admin@pdb_name Enter password: password Connected.
sysadmin_vpd
ユーザーとそのオブジェクトを次のように削除します。DROP USER sysadmin_vpd CASCADE;
22.12 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パフォーマンス・チューニング・ガイド』を参照してください。