【Oracle】Flashback Data Archive完全ガイド|Total Recall で長期変更履歴を保存して AS OF TIMESTAMP で過去データを参照する方法まで解説

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 操作は制限されます。たとえば DROP COLUMNTRUNCATE TABLEDROP 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完全ガイドも参照してください。