SCNを使って表を過去の状態に戻す!フラッシュバック表の使い方

Oracle Master Gold

Oracleデータベースを扱う中で、「誤ってデータを削除してしまった…」という場面は誰でも一度は経験するものです。そんなときに役立つのが フラッシュバック表(FLASHBACK TABLE) 機能です。

今回は、特に SCN(System Change Number)を使ったフラッシュバック表の方法を中心に解説します。


フラッシュバック表とは?

フラッシュバック表 は、表全体のデータを過去の特定の時点に戻すことができるOracleの機能です。これにより、誤って削除や更新されたデータを手軽に復元できます。


SCN(System Change Number)とは?

SCNとは、Oracle内部で管理されている「トランザクションの順序を表す番号」です。Oracleはあらゆる変更に対してSCNを割り振っており、このSCNを指定することで ある特定の瞬間の状態 に表を戻すことができます。


フラッシュバック表の前提条件

前提条件内容
UNDO情報の保持SCNに対応する変更情報がUNDO領域に存在する必要あり(UNDO_RETENTION で設定)
ROW MOVEMENTの有効化行の物理位置変更を許可する設定。これが無効だとエラーになります
DDLの回避フラッシュバック対象の期間に TRUNCATEDROP が行われていないこと

状態遷移のイメージ図(SCNによる復元)

   現在(SCN: 1000)       SCN: 950
↓ ↓
+------------+ +----------------+
| emp表 | ←─── | emp表 |
| id | name | | id | name |
|----|-------| |----|------------|
| 1 | 佐藤 | | 1 | 鈴木 |
+------------+ +----------------+

SCNの確認方法

現在のSCNを確認するには以下のSQLを使用します:

SELECT CURRENT_SCN FROM V$DATABASE;

過去にコミットされたタイミングのSCNを確認するには、ログや監査履歴、または自分でSCNを記録しておくことが必要になります。


サンプルテーブルとデータの準備

検証用に以下のテーブルとデータを使用します。

テーブル作成と初期設定

CREATE TABLE emp (
empno NUMBER PRIMARY KEY,
ename VARCHAR2(50)
);

ALTER TABLE emp ENABLE ROW MOVEMENT;

データ操作例

-- 初期データ登録
INSERT INTO emp VALUES (1, '鈴木');
COMMIT;

-- SCNを確認(復元ポイント)
SELECT CURRENT_SCN FROM V$DATABASE;

-- DELETE操作
DELETE FROM emp;
COMMIT;

FLASHBACK TABLE の実行(SCN指定)

削除前のSCNが「950」だったと仮定した場合:

FLASHBACK TABLE emp TO SCN 950;

これにより、表empの内容はSCN950の時点に復元されます。


フラッシュバック実行後の確認

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の代わりに**TIMESTAMP(時刻)**を指定することも可能です。

FLASHBACK TABLE emp TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE);

この構文では、現在時刻から5分前の状態に戻すことができます。
ただし、Oracle内部ではこのTIMESTAMPが内部的にSCNに変換されて処理されています。


よくあるエラーと対処法

エラー内容原因と対策
ORA-08189ROW MOVEMENTが無効 → ALTER TABLE ~ ENABLE ROW MOVEMENT; を実行
ORA-01466SCNが古すぎてUNDOが存在しない → UNDO_RETENTIONが足りない可能性あり
ORA-08186指定したSCNに対応するUNDO情報が見つからない

まとめ

項目内容
機能名フラッシュバック表(FLASHBACK TABLE)
主な用途誤操作によって失われた表データの復元
使用方法FLASHBACK TABLE 表名 TO SCN 数値;
必須設定ROW MOVEMENTの有効化、UNDO情報の保持
補足機能TO TIMESTAMP による時間指定も可能

おわりに

SCNを使ったフラッシュバック表は、誤操作時にとても強力な復元手段です。本番環境で使用する際は、UNDO保持設定や操作履歴の記録といった「準備」が大切です。日頃からSCNやTIMESTAMPを記録する仕組みを取り入れておくと安心ですね。

[参考]
バックアップおよびリカバリ・ユーザーズ・ガイド

コメント

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