Oracle の通常の Flashback クエリは UNDO データを使うため、UNDO_RETENTION パラメータで指定した期間(デフォルト 15 分)を超えると過去データを参照できなくなります。
Flashback Data Archive(FBA / Oracle Total Recall)は、UNDO とは別の専用領域に変更履歴を自動的に長期保存する機能です。数年前のデータも AS OF TIMESTAMP で参照でき、コンプライアンス要件・監査・規制対応(金融・医療など)に活用されます。
この記事でわかること
- Flashback Data Archive と通常の Flashback クエリの違い
- CREATE FLASHBACK ARCHIVE でアーカイブ領域を作成する方法
- ALTER TABLE … FLASHBACK ARCHIVE でテーブルを登録する手順
- AS OF TIMESTAMP / AS OF SCN で過去データを参照する方法
- VERSIONS BETWEEN で期間内の全変更履歴を取得する方法
- DBA_FLASHBACK_ARCHIVE でアーカイブを管理する方法
通常の Flashback クエリと Flashback Data Archive の違い
| 項目 | 通常の Flashback クエリ | Flashback Data Archive |
|---|---|---|
| データソース | UNDO セグメント | 専用の Flashback Archive 領域 |
| 保存期間 | UNDO_RETENTION で設定(通常数分〜数時間) | 任意に設定(1 年・5 年なども可能) |
| 対象テーブル | データベース全体(UNDO が残っていれば) | ALTER TABLE で明示的に指定したテーブルのみ |
| DDL 変更後 | DDL 後の履歴は取得不可 | 列の追加などの DDL も履歴として記録 |
| 設定の手間 | 不要(すぐ使える) | アーカイブ作成・テーブル登録が必要 |
| ストレージ | 共有 UNDO 表領域 | 専用表領域(定期的に自動パージされる) |
| Enterprise Edition | すべてのエディション | Enterprise Edition + Advanced Compression オプション(または Oracle 12c 以降で一部無償) |
Flashback Archive を作成する
CREATE FLASHBACK ARCHIVE でアーカイブ領域を作成する
-- Flashback Archive を作成する(DBA 権限が必要)
CREATE FLASHBACK ARCHIVE fba_2years
TABLESPACE users_tbs -- アーカイブデータを格納する表領域
QUOTA 10G -- 使用する最大ストレージ(自動パージで維持)
RETENTION 2 YEAR; -- 履歴の保存期間(YEAR / MONTH / DAY で指定)
-- QUOTA と RETENTION を変更する
ALTER FLASHBACK ARCHIVE fba_2years
ADD TABLESPACE users_tbs2 QUOTA 5G;
ALTER FLASHBACK ARCHIVE fba_2years
MODIFY RETENTION 3 YEAR;
-- デフォルト Flashback Archive を設定する(テーブル指定を省略したときに使われる)
ALTER FLASHBACK ARCHIVE fba_2years SET DEFAULT;
-- Flashback Archive の一覧を確認する
SELECT
flashback_archive_name,
flashback_archive#,
retention_in_days,
status -- DEFAULT または NULL
FROM DBA_FLASHBACK_ARCHIVE
ORDER BY flashback_archive_name;
-- 表領域の使用状況を確認する
SELECT
tablespace_name,
quota_in_mb,
flashback_size
FROM DBA_FLASHBACK_ARCHIVE_TS
WHERE flashback_archive_name = 'FBA_2YEARS';
テーブルを Flashback Archive に登録する
ALTER TABLE … FLASHBACK ARCHIVE でテーブルを登録する
-- テーブルを Flashback Archive に登録する(アーカイブ名を指定)
ALTER TABLE hr.employees FLASHBACK ARCHIVE fba_2years;
-- デフォルト Flashback Archive に登録する(アーカイブ名を省略)
ALTER TABLE hr.orders FLASHBACK ARCHIVE;
-- Flashback Archive を無効化する(履歴は削除されない)
ALTER TABLE hr.employees NO FLASHBACK ARCHIVE;
-- 登録済みテーブルを確認する
SELECT
owner_name,
table_name,
flashback_archive_name,
status
FROM DBA_FLASHBACK_ARCHIVE_TABLES
ORDER BY owner_name, table_name;
-- STATUS: ENABLED / DISABLED
Flashback Archive 有効化後の DDL 制約
Flashback Archive が有効なテーブルへの一部の DDL 操作は制限されます。たとえば
Flashback Archive が有効なテーブルへの一部の DDL 操作は制限されます。たとえば
DROP COLUMN・TRUNCATE TABLE・DROP TABLE は実行時に ORA-55610(DDL_STATEMENT_ON_FDA_TABLE)エラーが発生することがあります。DDL を実行する前に一時的に NO FLASHBACK ARCHIVE にするか、DBA が Flashback Archive を管理・purge してから実行する必要があります。
AS OF TIMESTAMP / AS OF SCN で過去データを参照する
Flashback Archive が有効なテーブルは、登録日時まで遡って任意の時点のデータを参照できます。クエリの構文は通常の Flashback クエリと同じ AS OF TIMESTAMP / AS OF SCN 句を使います。
AS OF TIMESTAMP で 1 年前のデータを参照する
-- 1 年前の時点でのテーブルの状態を参照する SELECT employee_id, last_name, salary, department_id FROM hr.employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' YEAR) ORDER BY employee_id; -- 特定の日時を指定する(TIMESTAMP リテラル) SELECT * FROM hr.employees AS OF TIMESTAMP TIMESTAMP '2025-01-01 00:00:00' WHERE department_id = 50; -- AS OF SCN(SCN 番号)で指定する(より精密な時点指定) -- 現在の SCN を取得する SELECT CURRENT_SCN FROM V$DATABASE; -- 特定の SCN 時点のデータを参照する SELECT * FROM hr.orders AS OF SCN 98765432 WHERE order_id = 1001;
VERSIONS BETWEEN で期間内の変更履歴を取得する
VERSIONS BETWEEN 句を使うと、指定した期間内のある行の全バージョン(変更履歴)を一覧取得できます。誰が何をいつ変更したかを追跡できます。
VERSIONS BETWEEN で特定行の変更履歴を取得する
-- 特定の employee_id の変更履歴をすべて取得する
SELECT
versions_starttime AS start_time, -- このバージョンが有効になった時刻
versions_endtime AS end_time, -- このバージョンが終了した時刻(NULL = 現在のバージョン)
versions_operation AS operation, -- I: INSERT / U: UPDATE / D: DELETE
versions_xid AS transaction_id, -- トランザクション ID
employee_id,
last_name,
salary
FROM hr.employees
VERSIONS BETWEEN TIMESTAMP
TIMESTAMP '2025-01-01 00:00:00'
AND SYSTIMESTAMP
WHERE employee_id = 101
ORDER BY versions_starttime;
-- 削除されたレコードの履歴を取得する
-- VERSIONS BETWEEN では DELETE されたレコードも operation='D' として現れる
SELECT
versions_starttime,
versions_endtime,
versions_operation,
employee_id,
last_name
FROM hr.employees
VERSIONS BETWEEN TIMESTAMP
SYSTIMESTAMP - INTERVAL '30' DAY
AND SYSTIMESTAMP
WHERE employee_id = 999 -- 削除済みの employee_id でも履歴が取れる
ORDER BY versions_starttime;
Flashback Archive の管理(パージ・削除)
Flashback Archive のデータを手動パージする
-- 特定の時点以前の古い履歴を手動でパージする(DBA 権限が必要)
ALTER FLASHBACK ARCHIVE fba_2years
PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '18' MONTH);
-- 特定テーブルの Flashback Archive データのみパージする
ALTER FLASHBACK ARCHIVE fba_2years
PURGE FOR TABLE hr.employees;
-- Flashback Archive 全体を削除する(登録テーブルの NO FLASHBACK ARCHIVE を先に実行)
-- テーブルの登録を解除してから削除する
ALTER TABLE hr.employees NO FLASHBACK ARCHIVE;
DROP FLASHBACK ARCHIVE fba_2years;
まとめ
- Flashback Data Archive:UNDO とは独立した専用領域に長期履歴を自動保存する。コンプライアンス・規制対応に最適
- CREATE FLASHBACK ARCHIVE:アーカイブ名・表領域・QUOTA・RETENTION を指定して作成する
- ALTER TABLE … FLASHBACK ARCHIVE:テーブルを登録するだけで自動的に変更履歴が記録される
- AS OF TIMESTAMP / SCN:通常の Flashback クエリと同じ構文で、保存期間内であれば何年前でも参照できる
- VERSIONS BETWEEN:INSERT / UPDATE / DELETE の全バージョンを取得できる。削除済みレコードの変更追跡に便利
- DDL 制約:FBA 有効テーブルへの DROP COLUMN / TRUNCATE には制限がある。事前に確認する
通常の Flashback クエリ(UNDO ベース)については Flashback完全ガイドを参照してください。PRAGMA AUTONOMOUS_TRANSACTION を使った監査ログの実装は PRAGMA AUTONOMOUS_TRANSACTION完全ガイドも参照してください。