この章では、データベース・アプリケーションにおける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データを使用して過去のデータを問い合せたり、論理的な損害をリカバリしたりすることができます。UNDOデータは、フラッシュバック機能以外でも、Oracle Databaseによって次の処理に使用されます。
アクティブなトランザクションのロールバック
データベースまたはプロセス・リカバリを使用した終了済トランザクションのリカバリ
SQL問合せに対する読取り一貫性の提供
内容は次のとおりです。
フラッシュバック機能の詳細は、『Oracle Database概要』を参照してください。
アプリケーション開発では、次のフラッシュバック機能を使用して、履歴データに関するレポートを作成したり、誤った変更を元に戻すことができます。(この機能は、データベース・ユーザーまたは管理者として対話形式でも使用できます。)
Oracle Flashback Query
この機能を使用して、SELECT文のAS OF句で指定した過去のある時点のデータを取得できます。詳細は、「Oracle Flashback Query(SELECT AS OF)の使用」を参照してください。
Oracle Flashback Version Query
この機能を使用して、特定の時間間隔内のメタデータおよび履歴データを取得します(たとえば、ある表の、特定の時間間隔内に存在していたすべての行を表示します)。各行バージョンに関するメタデータには、開始時間と終了時間、変更処理のタイプおよび行バージョンを作成したトランザクションの識別情報が含まれます。Oracle Flashback Version Queryを作成するには、SELECT文でVERSIONS BETWEEN句を使用します。詳細は、「Oracle Flashback Version Queryの使用」を参照してください。
フラッシュバック・トランザクション問合せ
この機能を使用して、特定の時間間隔内における特定のトランザクションまたはすべてのトランザクションのメタデータおよび履歴データを取得できます。Oracle Flashback Transaction Queryを実行するには、静的データ・ディクショナリ・ビューFLASHBACK_TRANSACTION_QUERYから選択します。詳細は、「Oracle Flashback Transaction Queryの使用」を参照してください。
通常、Oracle Flashback Transaction Queryは、対象となる行のトランザクションIDを戻すOracle Flashback Version Queryと併用します(「Oracle Flashback Transaction QueryとOracle Flashback Version Queryの併用」を参照してください)。
DBMS_FLASHBACKパッケージ
この機能は、ある時点の最新データを検査できるよう、Oracle Database内部の時計を過去のある時点まで戻す場合、あるいはデータベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックする場合に使用できます(「フラッシュバック・トランザクション」を参照してください)。詳細は、「DBMS_FLASHBACKパッケージの使用」を参照してください。
フラッシュバック・トランザクション
フラッシュバック・トランザクションは、データベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックする場合に使用します。このリカバリ操作では、UNDOデータを使用して対応する補正トランザクションを作成および実行します。このトランザクションによって影響のあったデータが元の状態に戻ります。(フラッシュバック・トランザクションは、DBMS_FLASHBACKパッケージの一部です。)詳細は、「DBMS_FLASHBACKパッケージの使用」を参照してください。
フラッシュバック・データ・アーカイブ(Oracle Total Recall)
フラッシュバック・データ・アーカイブを使用して、通常の問合せとOracle Flashback Queryを自動的に追跡およびアーカイブし、スナップショットが古すぎるというエラーが発生することなくデータベース・オブジェクトの各バージョンへのSQLレベルのアクセスを保証します。詳細は、「フラッシュバック・データ・アーカイブの使用(Oracle Total Recall)」を参照してください。
次のフラッシュバック機能は、主としてデータ・リカバリ用です。通常、この機能は、データベース管理者としてのみ使用します。
この章では、アプリケーション開発機能に重点を置いています。データベース管理機能の詳細は、『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が保持される期間を決定できます。 |
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;
表の特定のLOB列に対するフラッシュバック操作を可能にするには、ALTER TABLE文をRETENTIONオプションとともに使用します。
LOB列のUNDOデータは膨大になる場合があるため、フラッシュバック操作で使用するLOB列を定義する必要があります。
|
関連項目: LOB記憶域およびRETENTIONパラメータの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。 |
ユーザーまたはデータベース管理者は、次のフラッシュバック機能を使用する必要があるユーザー、ロールまたはアプリケーションに対して権限を付与する必要があります。GRANT文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
Oracle Flashback QueryおよびOracle Flashback Version Query
次のいずれかを実行します。
問合せ中に特定のオブジェクトへのアクセスを許可するには、そのオブジェクトに関するFLASHBACKおよび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権限を付与します。
フラッシュバック・データ・アーカイブ(Oracle Total Recall)
特定のユーザーが特定のフラッシュバック・データ・アーカイブを使用してデータ・アーカイブを表にフラッシュバックできるようにするには、フラッシュバック・データ・アーカイブに対する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は、次のような場合に使用します。
失われたデータをリカバリしたり、コミット済の不適切な変更を取り消す場合。
たとえば、誤って行を削除または更新し、コミットしていても、すぐに誤りを元に戻すことができます。
現在のデータを過去の特定の時点の対応するデータと比較する場合。
たとえば、前日からのデータの変更を示す日報を作成できます。表データの個々の行の比較、または行セットの共通部分や結合の検索が可能です。
特定の時点でのトランザクション・データの状態を確認する場合。
たとえば、特定の日の預金残高を確認できます。
アプリケーションの設計を簡略化する場合。一時データの類を格納する必要性をなくすことにより簡略化します。
Oracle Flashback Queryにより、データベースから直接過去のデータを取得できます。
レポート作成ツールなどのパッケージ・アプリケーションを過去のデータに適用する場合。
アプリケーションにセルフサービス・エラー修正を提供し、ユーザーが自分のエラーを元に戻して修正できるようにする場合。
内容は次のとおりです。
SELECT AS OF文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
たとえば、午後12時30分に従業員Chungの行がemployee表から削除されていることに気付き、午前9時30分にはこのデータがデータベース内に正しく格納されていたことを知っているとします。この場合、Oracle Flashback Queryを使用して午前9時30分の表の内容を調べ、失われたデータを見つけることができます。必要に応じて失われたデータをリストアできます。
例13-1では、2004年4月4日午前9時30分におけるChungのレコードの状態が取得されます。
例13-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';
例13-2では、Chungの情報がemployees表にリストアされます。
各表に対してAS OF句を指定または省略できます。また、異なる表に異なる時間を指定できます。
問合せでAS OF句を使用すると、Oracle Flashback Queryと同じセッションで表の作成、切捨てなどのDDL操作または挿入、削除などの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は、データベース・ホスト環境のタイムゾーンを参照します。
自己結合または集合演算(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は、データベース・ホスト環境のタイムゾーンを参照します。
特定の時間間隔内に存在していた、特定の行の様々なバージョンを取得するには、Oracle Flashback Version Queryを使用します。COMMIT文が実行されると、そのたびに新しい行バージョンが作成されます。
SELECT文でVERSIONS BETWEEN句を使用して、Oracle Flashback Version Queryを指定します。構文は次のとおりです。
VERSIONS {BETWEEN {SCN | TIMESTAMP} start AND end}
ここで、startおよびendはそれぞれ、問合せ対象の時間間隔の開始点と終了点を表す式です。時間間隔にはstartおよびendが含まれます。
Oracle Flashback Version Queryでは、特定の行について、指定した時間間隔内に存在していたすべてのバージョンの各1行を含む表が戻されます。表の各行には、行バージョンに関するメタデータの疑似列が含まれます。これについては表13-1で説明しています。この情報により、特定の変更(誤った変更など)がデータベースにいつ、どのように加えられたかがわかります。
表13-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,
name, salary
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')
WHERE name = 'JOE';
Oracle Flashback Transaction QueryでVERSIONS_XIDを使用して、行の変更を元に戻すために必要なSQLおよびその変更の担当ユーザーなど、このトランザクションのメタデータを検索できます。「Oracle Flashback Transaction Queryの使用」を参照してください。
|
関連項目: 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')
);
|
関連項目:
|
この例では、サンプルのHRスキーマにおけるemployeesおよびdepartments表の単純なバージョンを使用しています。
この例では、データベース管理者はSQL*Plusを使用して次のコマンドを実行します。
CREATE TABLE emp
(empno NUMBER PRIMARY KEY,
empname VARCHAR2(16)
salary NUMBER);
INSERT INTO emp VALUES (111, 'Mike', 555);
COMMIT;
CREATE TABLE dept
(deptno NUMBER,
deptname VARCHAR2(32));
INSERT INTO dept VALUES (10, 'Accounting');
COMMIT;
この時点で、empおよびdeptにはそれぞれ1行があります。行バージョンに関しては、各表に1つのバージョンを示す1行が含まれます。誤ったトランザクションにより、empno 111が表empから削除されたとします。
UPDATE emp SET salary = salary + 100 WHERE empno = 111; INSERT INTO dept VALUES (20, 'Finance'); DELETE FROM emp WHERE empno = 111; COMMIT;
次に、トランザクションにより、新規従業員名とともにempno 111が表empに再挿入されます。
INSERT INTO emp 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 hr.emp VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE where empno = 111; XID START_SCN END_SCN OPERATION EMPNAME SALARY ---------------- ---------- --------- ---------- ---------- ---------- 0004000700000058 113855 I Tom 927 000200030000002D 113564 D Mike 555 000200030000002E 112670 113564 I Mike 555 3 rows selected
結果表の行は降順の時系列で示しています。3行目は、表が作成されたときに表に挿入された、表empの行のバージョンに対応しています。2行目は、誤ったトランザクションにより削除されたempの行に対応します。1行目は、新規従業員名とともに再挿入されたempの行のバージョンに対応します。
データベース管理者は、トランザクション000200030000002Dを誤ったトランザクションとして識別し、Oracle Flashback Transaction Queryを使用して、このトランザクションによるすべての変更を監査します。
SELECT xid, start_scn START, commit_scn COMMIT, operation OP,
logon_user USER, undo_sql
FROM flashback_transaction_query
WHERE xid = HEXTORAW('000200030000002D');
XID START COMMIT OP USER UNDO_SQL
---------------- ----- ------ -- ---- ---------------------------
000200030000002D 195243 195244 DELETE HR insert into "HR"."EMP"
("EMPNO","EMPNAME","SALARY") values ('111','Mike','655');
000200030000002D 195243 195244 INSERT HR delete from "HR"."DEPT"
where ROWID = 'AAAKD4AABAAAJ3BAAB';
000200030000002D 195243 195244 UPDATE HR update "HR"."EMP"
set "SALARY" = '555' where ROWID = 'AAAKD2AABAAAJ29AAA';
000200030000002D 195243 113565 BEGIN HR
4 rows selected
誤ったトランザクションおよびそれ以降のすべてのトランザクションを確認するには、データベース管理者は次の問合せを実行します。
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
---------------- --------- ---------- --------- ---------- -----------
0004000700000058 195245 195246 UPDATE EMP HR
0004000700000058 195245 195246 UPDATE EMP HR
0004000700000058 195245 195246 INSERT EMP HR
000200030000002D 195243 195244 DELETE EMP HR
000200030000002D 195243 195244 INSERT DEPT HR
000200030000002D 195243 195244 UPDATE EMP HR
6 rows selected
ORA_ROWSCNは、固定されていない、または外部表ではない表の疑似列です。これは、指定された行に対する最新の変更のSCNを表します。つまり、その行に対する最新のCOMMIT操作です。次に例を示します。
SELECT ora_rowscn, last_name, salary
FROM employees
WHERE employee_id = 7788;
ORA_ROWSCN NAME SALARY
---------- ---- ------
202553 Fudd 3000
その行に対する最新のCOMMIT操作は、SCNが202553ほどのところで発生しています。SCNを対応するTIMESTAMP値に変換するには、SCN_TO_TIMESTAMPファンクションを使用します。
ORA_ROWSCNは、最新コミット時間の堅実な上限値であり、実際のコミットSCNはこれより若干前になる場合があります。行に依存する表(CREATE TABLEをROWDEPENDENCIES句と併用して作成)では、ORA_ROWSCNはより正確になります(実際のコミットSCNに近づきます)。
アプリケーション開発におけるORA_ROWSCNの使用には、同時実行性制御およびクライアント・キャッシュの無効化があります。
内容は次のとおりです。
アプリケーションでデータ行が検査され、対応するORA_ROWSCNが202553として記録されます。その後、このアプリケーションでは、行が変更されていない場合のみ、行を更新する必要があります。この操作は、ORA_ROWSCNがまだ202553であることが条件となります。同等の対話型文を示します。
UPDATE employees SET salary = salary + 100 WHERE employee_id = 7788 AND ora_rowscn = 202553; 0 rows updated.
この場合、ORA_ROWSCNがすでに202553ではないため、条件付きの更新に失敗します。したがって、行はユーザーまたは他のアプリケーションによって、記録されているORA_ROWSCNよりも最近に変更され、COMMITが実行されています。
アプリケーションでは、新しい行データおよびORA_ROWSCNを取得するため、再度問合せが実行されます。ORA_ROWSCNが現在415639であるとします。アプリケーションでは、新しいORA_ROWSCNにより、再度条件付き更新が試行されます。今回は更新に成功し、コミットされました。同等の対話型文を示します。
SQL> UPDATE employees SET salary = salary + 100
WHERE empno = 7788 AND ora_rowscn = 415639;
1 row updated.
SQL> COMMIT;
Commit complete.
SQL> SELECT ora_rowscn, name, salary FROM employees WHERE empno = 7788;
ORA_ROWSCN NAME SALARY
---------- ---- ------
465461 Fudd 3100
新しいCOMMITに対応するSCNは、465461です。
UPDATE文のWHERE句でORA_ROWSCNを使用するだけでなく、DELETE文のWHERE句またはOracle Flashback QueryのAS OF句で使用できます。
VPDポリシーを表に追加すると、ORA_ROWSCN擬似列を選択できなくなります。ただし、ORA_ROWSCNがポリシー・ファンクション内で使用可能な場合は、次の操作を実行できます。
例13-3のように、行SCNを返すファンクションを作成します。
ポリシー述語ファンクションに、ファンクションが行を処理するときに使用するコンテキストで行SCNを格納する述語を追加します。次に例を示します。
||' AND f_ora_rowscn('||object_name||'.ora_rowscn) = 1'
ファンクションを使用して行をフェッチします。次に例を示します。
SELECT t.*, get_rowscn(t.rowid) "ORA_ROWSCN" FROM test_table t;
例13-3 VPDの表から行SCNを返すファンクション
-- Create context that function will use while processing rows:
CREATE OR REPLACE FUNCTION f_ora_rowscn
(rowscn IN NUMBER)
RETURN NUMBER
AS
BEGIN
DBMS_SESSION.SET_CONTEXT('STORE_ROWSCN','ROWSCN',rowscn);
RETURN 1;
END;
/
CREATE CONTEXT store_rowscn USING f_ora_rowscn;
-- Create function that returns row SCN for each row:
CREATE OR REPLACE FUNCTION get_rowscn
(row IN ROWID)
RETURN VARCHAR2
AS
BEGIN
RETURN sys_context('STORE_ROWSCN','ROWSCN');
END;
/
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プロシージャ(TRANSACTION_BACKOUT)では、データベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックします。このリカバリ操作では、UNDOデータを使用して対応する補正トランザクションを作成および実行します。このトランザクションによって影響のあったデータが元の状態に戻ります。
内容は次のとおりです。
TRANSACTION_BACKOUTプロシージャのパラメータは次のとおりです。
バックアウトするトランザクションの数
名前またはXIDで識別されたバックアウトするトランザクションのリスト
時間ヒント(名前でトランザクションを識別する場合)
任意のトランザクションの開始時間より早い時間を指定します。
表13-2のバックアウト・オプション
TRANSACTION_BACKOUTプロシージャの構文およびパラメータの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
表13-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リファレンス』を参照してください。 |
フラッシュバック・データ・アーカイブ(Oracle Total Recall)により、その存続期間中、表に対するすべてのトランザクションによる変更を追跡および格納できます。今後、アプリケーションにこのインテリジェンスを組み込む必要はありません。フラッシュバック・データ・アーカイブは、レコード・ステージ・ポリシーと監査レポートのコンプライアンスに役立ちます。
フラッシュバック・データ・アーカイブは、1つ以上の表領域またはその部品で構成されます。フラッシュバック・データ・アーカイブは複数所有できます。SYSDBAとしてログオンしている場合は、システムに対してデフォルトのフラッシュバック・データ・アーカイブを指定できます。フラッシュバック・データ・アーカイブは、保有時間を使用して構成されます。フラッシュバック・データ・アーカイブにアーカイブされたデータは、保有時間中は保持されます。
デフォルトでは、表に対してフラッシュバック・アーカイブは無効になっています。次のすべてに該当する場合は表のフラッシュバック・アーカイブを有効にすることができます。
表に対して使用するフラッシュ・データ・アーカイブに対するFLASHBACK ARCHIVEオブジェクト権限がある。
表が、ネスト表、クラスタ表、一時表、リモート表または外部表でない。
表にLONG列またはネストされた列が含まれない。
表に対してフラッシュバック・アーカイブを有効にした後は、FLASHBACK ARCHIVE ADMINISTERシステム権限がある場合、またはSYSDBAとしてログオンしている場合のみ、これを無効にできます。フラッシュバック・アーカイブは表に対して有効ですが、一部のDDL文はその表に対して許可されていません。
特定の表に対してフラッシュバック・データ・アーカイブを選択する場合は、その表のデータ保有要件およびFLASHBACK ARCHIVEオブジェクト権限のあるフラッシュバック・データ・アーカイブの保有時間を考慮してください。
内容は次のとおりです。
次を指定し、CREATE FLASHBACK ARCHIVE文を使用してフラッシュバック・データ・アーカイブを作成します。
フラッシュバック・データ・アーカイブの名前
フラッシュバック・データ・アーカイブの最初の表領域の名前
(オプション)フラッシュバック・データ・アーカイブが最初の表領域で使用できる最大領域量
デフォルトは無制限です。最初の表領域の領域割当て制限も無制限でないかぎりは、この値を指定する必要があります。指定しない場合、ORA-55621のエラーが発生します。
保有時間(表のフラッシュバック・データ・アーカイブのデータの格納が保証されている日数)
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言語リファレンス』を参照してください。
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を指定する必要はありません。これはデフォルトです。)
|
関連項目: 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文を使用すると、エラーORA-55610が発生します。
ALTER TABLE文では、次のいずれかが実行されます。
列の削除、名前変更、または変更
パーティション操作またはサブパーティション操作
LONG列のLOB列への変換
INCLUDING DATA句ありまたはなしでのUPGRADE TABLE句の挿入
DROP TABLE文
RENAME TABLE文
TRUNCATE TABLE文
|
関連項目: このようなDDL文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
表13-3に静的データ・ディクショナリ・ビューを示し、簡潔に説明します。このビューに対して、フラッシュバック・データ・アーカイブ・ファイルに関する情報の問合せを実行できます。
表13-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
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が確認した際、昇給がグループの全員に与えられたことが判明します。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-1466のエラーが発生します。表の記憶域属性(PCTFREE、INITRANS、MAXTRANSなど)を変更するDDL操作では、UNDOデータは無効にされません。
正確な時間の過去のデータを問い合せるには、SCNを使用します。タイムスタンプを使用した場合、問合せの実際の時間は、指定した時間よりも最大3秒早くなる場合があります。内部的には、Oracle DatabaseではSCNが使用され、このSCNは、3秒の間隔でタイムスタンプにマップされます。
たとえば、SCN値1000および1005が、タイムスタンプ午前8時41分および8時46分にそれぞれマップされているとします。午前8時41分00秒と8時45分59秒の間の時間に対する問合せは、SCN 1000にマップされ、午前8時46分に対するOracle Flashback Queryは、SCN 1005にマップされます。
このような時間とSCN値のマッピングによって、表の作成などのDDL操作の直後の時点を指定した場合、Oracle DatabaseではDDL操作の直前のSCNが使用されることがあり、エラーORA-1466が発生します。
動的パフォーマンス(V$)ビューから過去のデータは取得できません。このようなビューに問合せを実行すると、常に現在のデータが戻されます。
静的データ・ディクショナリ・ビュー(*_TABLESなど)では、過去のデータに問合せを実行できます。
Oracle Flashback Queryに関連するすべての表の統計情報を生成するには、DBMS_STATSパッケージを使用します。統計情報を最新の状態に維持します。Oracle Flashback Queryは、これらの統計情報に依存するコストベース・オプティマイザを使用します。
アクセスする必要のあるUNDOデータの量を最小限にします。問合せを使用する際に、表全体をスキャンするのでなく、索引を使用して少量の過去データを選択します。全表をスキャンする必要がある場合は、問合せにパラレル・ヒントを追加します。
I/Oのパフォーマンス・コストは、バッファ・キャッシュにすでに存在していないデータおよびUNDOブロックにおけるページングのコストです。CPUの使用におけるパフォーマンス・コストは、影響を受けるデータ・ブロックにUNDO情報を適用する際のコストです。最近の過去における変更を操作する場合、フラッシュバック操作にはCPUの限界があります。
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には、クエリー・リライト最適化の効果はありません。