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の回避 | フラッシュバック対象の期間に TRUNCATE や DROP が行われていないこと |
状態遷移のイメージ図(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-08189 | ROW MOVEMENT が無効 → ALTER TABLE ~ ENABLE ROW MOVEMENT; を実行 |
ORA-01466 | SCNが古すぎてUNDOが存在しない → UNDO_RETENTION が足りない可能性あり |
ORA-08186 | 指定したSCNに対応するUNDO情報が見つからない |
まとめ
項目 | 内容 |
---|---|
機能名 | フラッシュバック表(FLASHBACK TABLE) |
主な用途 | 誤操作によって失われた表データの復元 |
使用方法 | FLASHBACK TABLE 表名 TO SCN 数値; |
必須設定 | ROW MOVEMENT の有効化、UNDO情報の保持 |
補足機能 | TO TIMESTAMP による時間指定も可能 |
おわりに
SCNを使ったフラッシュバック表は、誤操作時にとても強力な復元手段です。本番環境で使用する際は、UNDO保持設定や操作履歴の記録といった「準備」が大切です。日頃からSCNやTIMESTAMPを記録する仕組みを取り入れておくと安心ですね。
[参考]
バックアップおよびリカバリ・ユーザーズ・ガイド
コメント