SCNで時間を巻き戻す!Oracleフラッシュバック表(FLASHBACK TABLE)活用ガイド

Oracle Master Gold

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の制限復元したい時点から現在までに、DROPTRUNCATE などの構造変更が行われていないこと。

実践: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-08189ROW MOVEMENTが無効ALTER TABLE emp ENABLE ROW MOVEMENT; を実行してください。
ORA-01466データが古すぎる/DDL実行済み指定したSCN以降に表構造の変更がないか確認してください。
ORA-08186UNDO情報が見つからない保持期間(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の使用

フラッシュバック・データベースの構築手順と運用の極意
Oracle Databaseを運用する上で、最も強力な「保険」の一つがフラッシュバック・データベース(Flashback Database)です。 ユーザーが誤って大規模な更新を行ったり、アプリケーションのバグでデータが壊れたりした際、デ…
Oracle フラッシュバックテクノロジーとは?
〜誤操作からの救世主、Oracleの強力な巻き戻し機能を解説〜Oracle Databaseには、時間を巻き戻す魔法のような機能「フラッシュバックテクノロジー(Flashback Technology)」が備わっています。ユーザーが誤ってデ…

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

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

コメント

タイトルとURLをコピーしました