Oracle Databaseを運用していると、「誤って大事なレコードを削除してコミットしてしまった…」という事態に遭遇することがあります。バックアップからのリストアは大掛かりですが、フラッシュバック表(FLASHBACK TABLE)機能を使えば、表単位でサクッと過去の状態へ戻せます。
今回は、Oracle内部のタイムスタンプとも言えるSCN(システム変更番号)を利用した復元方法を徹底解説します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
フラッシュバック表とは?
フラッシュバック表は、表全体を特定の過去の時点(SCNや時刻)まで「巻き戻す」機能です。
バックグラウンドでは、UNDO領域に格納された「変更前のデータ」を元に逆操作(DELETEならINSERT、UPDATEなら逆方向のUPDATE)を自動実行することで、整合性を保ちながら復元を行います。
鍵となる「SCN(System Change Number)」とは?
SCNは、Oracle Database内の「時計」のようなものです。
コミットが発生するたびにカウントアップされる一意の番号で、データベースの論理的な順序を厳密に管理しています。時刻(TIMESTAMP)指定よりも精度が高いため、確実に特定のトランザクション直後に戻したい場合に有効です。
フラッシュバック実行の前提条件
実行前に、以下の3つのポイントを必ず確認してください。
| 項目 | 内容・条件 |
| ROW MOVEMENTの有効化 | 行の物理位置(ROWID)が変わるため、許可設定が必要。 |
| UNDO情報の保持 | 指定したSCN時点の変更情報がUNDO領域に残っていること(UNDO_RETENTION設定に依存)。 |
| DDLの制限 | 復元したい時点から現在までに、DROP や TRUNCATE などの構造変更が行われていないこと。 |
実践:SCNを指定したフラッシュバック手順
それでは、実際にテーブルを作成し、データを削除してから復元するまでの流れを見ていきましょう。
1. 事前準備(テーブル作成と設定)
フラッシュバックを許可するために ROW MOVEMENT を有効化するのが最大のポイントです。
-- テーブル作成
CREATE TABLE emp (
empno NUMBER PRIMARY KEY,
ename VARCHAR2(50)
);
-- 行移動を有効化(必須設定)
ALTER TABLE emp ENABLE ROW MOVEMENT;
2. データ投入と「復元ポイント」の記録
現在の状態をSCNで確認し、メモしておきます。
-- 初期データ登録
INSERT INTO emp VALUES (1, '鈴木');
COMMIT;
-- 現在のSCNを確認(この番号を控えておく)
SELECT CURRENT_SCN FROM V$DATABASE;
-- 例:2275956 と表示されたとする
3. 誤操作のシミュレーション
データを削除してコミットします。通常のロールバックではもう戻せません。
-- 誤操作:全削除
DELETE FROM emp;
COMMIT;
-- 確認(データは消えている)
SELECT * FROM emp;
4. FLASHBACK TABLEの実行
先ほど控えたSCN(2275956)を指定して実行します。
-- SCN 2275956 の時点まで表を戻す
FLASHBACK TABLE emp TO SCN 2275956;
-- 確認
SELECT * FROM emp;
-- 削除された '鈴木' さんが復活!
SQL> CREATE TABLE emp (
2 empno NUMBER PRIMARY KEY,
3 ename VARCHAR2(50)
4 );
表が作成されました。
SQL> ALTER TABLE emp ENABLE ROW MOVEMENT;
表が変更されました。
SQL> INSERT INTO emp VALUES (1, '鈴木');
1行が作成されました。
SQL> col ename for a30
SQL> SELECT * FROM emp;
EMPNO ENAME
---------- ------------------------------
1 鈴木
SQL> commit;
コミットが完了しました。
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
2275956 ★
SQL> DELETE FROM emp;
1行が削除されました。
SQL> SELECT * FROM emp;
レコードが選択されませんでした。
SQL> commit;
コミットが完了しました。
SQL> FLASHBACK TABLE emp TO SCN 2275956; ★削除前のSCNを指定
フラッシュバックが完了しました。
SQL> SELECT * FROM emp;
EMPNO ENAME
---------- ------------------------------
1 鈴木
応用:TIMESTAMP(時刻)による指定
SCNが不明な場合は、時刻を指定して戻すことも可能です。
-- 5分前の状態に戻す
FLASHBACK TABLE emp TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE);
※内部的にはTIMESTAMPをSCNに変換して処理されています。
トラブルシューティング:よくあるエラー
| エラーコード | 原因 | 対処法 |
| ORA-08189 | ROW MOVEMENTが無効 | ALTER TABLE emp ENABLE ROW MOVEMENT; を実行してください。 |
| ORA-01466 | データが古すぎる/DDL実行済み | 指定したSCN以降に表構造の変更がないか確認してください。 |
| ORA-08186 | UNDO情報が見つからない | 保持期間(UNDO_RETENTION)を超えているため復元不可能です。 |
FAQ
Q:フラッシュバック表を実行中、他のユーザーはその表にアクセスできますか?
A:実行中は対象表に対して排他的なロックがかかるため、他のDML操作は待機状態になります。
Q:インデックスやトリガーはどうなりますか?
A:インデックスは自動的にメンテナンスされます。トリガーはデフォルトで無効化されますが、オプションで動作させることも可能です。
Q:特定の「行」だけを戻せますか?
A:FLASHBACK TABLEは表全体を戻します。特定の行だけなら「フラッシュバック・クエリ」を使用して、INSERT INTO ... SELECT * FROM emp AS OF SCN ... のように抽出するのが一般的です。
まとめ
- フラッシュバック表は、誤操作からデータを救う「タイムマシン」機能。
- 実行には
ALTER TABLE ... ENABLE ROW MOVEMENT;が不可欠。 - SCN を利用することで、非常に高い精度で特定の時点へ復元できる。
- UNDO領域 の保持期間内に実行する必要があるため、トラブル時は迅速な対応が鍵。
誤操作は未然に防ぐのが一番ですが、万が一に備えてSCNの確認方法とフラッシュバックの手順をマスターしておきましょう。
本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。
[参考]
Oracle Flashback Technologyの使用


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


コメント