Oracleデータベースで誤った更新や削除を行った際、特定の処理だけを正確に特定し、迅速に復元したい場合があります。Oracle フラッシュバックトランザクション問い合わせ(FLASHBACK_TRANSACTION_QUERY)を利用すれば、過去の操作履歴から復元用SQLを自動取得し、最小限のダウンタイムでリカバリが可能です。
本記事では、FLASHBACK_TRANSACTION_QUERY の使い方から、復元に必要なサプリメンタルロギングの設定、実際のリカバリ手順までを19c環境に基づいて徹底解説します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
結論:トランザクションを復元する最短手順
- 最小サプリメンタルロギングの有効化:
UNDO_SQLを表示させるために必須の設定です。 - 対象 SCN の特定:
V$DATABASEやVERSIONS句を用いて、操作が行われた時点の SCN を特定します。 - 履歴の抽出:
FLASHBACK_TRANSACTION_QUERYビューから対象の XID(トランザクションID)とUNDO_SQLを取得します。 - 復元 SQL の実行: 取得した
UNDO_SQLを実行してCOMMITします。
背景と基礎:仕組みと用語の定義
本機能は、変更前のデータを保持する UNDOデータ を活用し、実行された DML とは逆の処理(例:INSERT なら DELETE)を SQL 形式で再構成する仕組みです。
- SCN (System Change Number): Oracleがトランザクションの順序を管理するための論理的な時刻スタンプです。
- サプリメンタルロギング: 行を一意に特定するための追加情報をログに記録するモードです。これを有効にしないと、復元用の SQL が生成されません。
手順・実装:環境準備とデータの操作
実機での検証手順です。以下の操作には SYSDBA 権限または SELECT ANY TRANSACTION 権限が必要です。
1. 最小サプリメンタルロギングの有効化
UNDO_SQL カラムに値を正しく出力させるための必須設定です。
-- 現在の設定を確認 ("NO" の場合は有効化が必要)
SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
-- 最小サプリメンタルロギングの有効化
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
-- 有効化されたことを確認 ("YES" になっていること)
SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
2. 検証用データの作成
テスト用のテーブルを作成し、初期データをコミットします。
-- テスト用テーブルの作成
CREATE TABLE test_flashback (
id NUMBER PRIMARY KEY,
name VARCHAR2(100)
);
-- 初期データの挿入
INSERT INTO test_flashback VALUES (1, 'Apple');
INSERT INTO test_flashback VALUES (2, 'Banana');
COMMIT;
3. 操作前の SCN 確認とデータの変更
後で履歴を追いやすくするため、現在の SCN を確認してからデータを更新・削除します。
-- 現在の SCN を取得
SELECT CURRENT_SCN FROM V$DATABASE;
-- データの更新
UPDATE test_flashback SET name = 'Avocado' WHERE id = 1;
COMMIT;
-- データの削除
DELETE FROM test_flashback WHERE id = 2;
COMMIT;
-- 操作後の SCN を取得
SELECT CURRENT_SCN FROM V$DATABASE;
実行例:トランザクション履歴の確認と復元
誤操作の内容を特定し、元に戻すための SQL を取得・実行します。
履歴確認 SQL の実行
FLASHBACK_TRANSACTION_QUERY ビューを検索します。テーブル名は必ず大文字で指定してください。
-- 表示用フォーマット設定
SET LINESIZE 200
COL OPERATION FOR A15
COL UNDO_SQL FOR A60
COL TABLE_NAME FOR A20
COL LOGON_USER FOR A15
-- 履歴と復元用SQLの抽出
SELECT
XID,
START_SCN,
COMMIT_SCN,
OPERATION,
TABLE_NAME,
LOGON_USER,
UNDO_SQL
FROM FLASHBACK_TRANSACTION_QUERY
WHERE TABLE_NAME = 'TEST_FLASHBACK'
ORDER BY START_SCN DESC;
- XID: トランザクションを一意に識別する ID。
- UNDO_SQL: この SQL を実行することで、当時の操作を取り消せます。
データの復元
出力された UNDO_SQL を実行し、変更を確定させます。
-- 削除されたレコード(ID:2)を復元する (INSERT文が生成される)
INSERT INTO "TEST1"."TEST_FLASHBACK"("ID","NAME") VALUES ('2','Banana');
-- 更新された名称(ID:1)を元に戻す (UPDATE文が生成される)
UPDATE "TEST1"."TEST_FLASHBACK" SET "NAME" = 'Apple' WHERE ROWID = 'AAASJTAAHAAAAGGAAA';
COMMIT;
-- データの最終確認
SELECT * FROM test_flashback;
SQL> SELECT supplemental_log_data_min FROM v$database;
SUPPLEMENTAL_LOG_DATA_MI
------------------------
NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; ★最小サプリメンタルロギングを設定
データベースが変更されました。
SQL> SELECT supplemental_log_data_min FROM v$database;
SUPPLEMENTAL_LOG_DATA_MI
------------------------
YES
SQL> alter system switch logfile;
システムが変更されました。
SQL> CREATE TABLE test_flashback (
2 id NUMBER PRIMARY KEY,
3 name VARCHAR2(100)
4 );
表が作成されました。
SQL> INSERT INTO test_flashback VALUES (1, 'Apple');
1行が作成されました。
SQL> INSERT INTO test_flashback VALUES (2, 'Banana');
1行が作成されました。
SQL> col name for a30
SQL> SELECT * FROM test_flashback;
ID NAME
---------- ------------------------------
1 Apple
2 Banana
SQL> commit;
コミットが完了しました。
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
2298362
SQL> UPDATE test_flashback SET name = 'Avocado' WHERE id = 1; ★更新
1行が更新されました。
SQL> SELECT * FROM test_flashback;
ID NAME
---------- ------------------------------
1 Avocado
2 Banana
SQL> commit;
コミットが完了しました。
SQL> DELETE FROM test_flashback WHERE id = 2; ★削除
1行が削除されました。
SQL> SELECT * FROM test_flashback;
ID NAME
---------- ------------------------------
1 Avocado
SQL> commit;
コミットが完了しました。
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
2298475
SQL> set linesize 120
SQL> col operation for a20
SQL> col undo_sql for a100
SQL> col table_name for a20
SQL> col logon_user for a20
SQL> SELECT
2 XID,
3 START_SCN,
4 COMMIT_SCN,
5 OPERATION,
6 TABLE_NAME,
7 LOGON_USER,
8 UNDO_SQL
9 FROM FLASHBACK_TRANSACTION_QUERY
10 WHERE TABLE_NAME = 'TEST_FLASHBACK'
11 ORDER BY START_SCN DESC;
XID START_SCN COMMIT_SCN OPERATION TABLE_NAME LOGON_USER
---------------- ---------- ---------- -------------------- -------------------- --------------------
UNDO_SQL
----------------------------------------------------------------------------------------------------
06001800F2030000 2298428 2298460 DELETE TEST_FLASHBACK TEST1
insert into "TEST1"."TEST_FLASHBACK"("ID","NAME") values ('2','Banana'); ★
07002000F1030000 2298377 2298408 UPDATE TEST_FLASHBACK TEST1
update "TEST1"."TEST_FLASHBACK" set "NAME" = 'Apple' where ROWID = 'AAASJTAAHAAAAGGAAA'; ★
0800160017040000 2298274 2298341 INSERT TEST_FLASHBACK TEST1
delete from "TEST1"."TEST_FLASHBACK" where ROWID = 'AAASJTAAHAAAAGGAAB';
0800160017040000 2298274 2298341 INSERT TEST_FLASHBACK TEST1
delete from "TEST1"."TEST_FLASHBACK" where ROWID = 'AAASJTAAHAAAAGGAAA';
SQL> insert into "TEST1"."TEST_FLASHBACK"("ID","NAME") values ('2','Banana'); ★
1行が作成されました。
SQL> update "TEST1"."TEST_FLASHBACK" set "NAME" = 'Apple' where ROWID = 'AAASJTAAHAAAAGGAAA'; ★
1行が更新されました。
SQL> SELECT * FROM test_flashback; ★元の状態に戻った
ID NAME
---------- ------------------------------
1 Apple
2 Banana
SQL> commit;
コミットが完了しました。
トラブルシューティング:代表的なエラー
| エラー/現象 | 原因 | 対処法 |
| UNDO_SQL が NULL | サプリメンタルログが未設定 | 設定を有効化してください。設定以降の操作が対象となります。 |
| ORA-01466 | テーブル定義変更直後の参照 | DDL(テーブル定義変更)直後はフラッシュバック参照が制限されます。 |
| 履歴が表示されない | UNDO保持期間の超過 | UNDO_RETENTION パラメータを確認。古い履歴は上書きされます。 |
運用・監視・セキュリティ上の注意
- 権限管理:
FLASHBACK_TRANSACTION_QUERYはデータベース全体のトランザクションが見えるため、権限付与は最小限に。 - UNDO期間: 履歴の保持は
UNDO_RETENTIONに依存します。大規模更新が多い環境では、履歴が早く消えるリスクがあります。 - 整合性:
UNDO_SQLの実行前に、現在のデータ状態と矛盾がないか(一意制約など)を必ず確認してください。
Oracle SQL フラッシュバックのやり方 FAQ
Q1: SCN ではなく時刻で履歴を調べることはできますか?
A: はい、VERSIONS BETWEEN TIMESTAMP 句を使用することで、日時の範囲指定で変更履歴を確認可能です。
Q2: サプリメンタルロギングを有効にする前の操作も戻せますか?
A: いいえ、設定変更後に発生したトランザクションのみが UNDO_SQL 生成の対象となります。
Q3: 削除(DROP)したテーブル自体を復旧できますか?
A: 本機能はデータ(行)の復元用です。テーブル自体の復旧は FLASHBACK TABLE ... TO BEFORE DROP(ごみ箱機能)を使用してください。
まとめ
- 必須設定: 運用開始時に
ALTER DATABASE ADD SUPPLEMENTAL LOG DATAを実行しておく。 - 調査:
FLASHBACK_TRANSACTION_QUERYでUNDO_SQLを特定する。 - 復元: 取得した SQL を実行して
COMMITする。 - 注意: UNDO の保持期間内に対応する必要がある。
本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。
[参考]
Oracle Flashback Technologyの使用


💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


コメント