フラッシュバック・データベースで誤操作からテーブルを復旧する手順

Oracle Master Gold

Oracleの「フラッシュバック・データベース」機能を使えば、うっかり削除してしまったテーブルも巻き戻して復旧できます。
本記事では、テーブル作成→誤操作(DROP)→フラッシュバックによる復旧という一連の流れを、SCN指定・時刻指定の両方で解説します。


🎯 想定シナリオ

1. ユーザーSCOTTが SALES テーブルを作成してデータ登録
2. 誤って SALES テーブルを DROP
3. フラッシュバック・データベースで直前の状態に復旧したい

🧪 Step0:準備(テーブル作成と誤操作)

✅ ① テーブル作成

-- SCOTTユーザーで接続
CONN scott/tiger

-- SALESテーブル作成
CREATE TABLE sales (
id NUMBER PRIMARY KEY,
item VARCHAR2(50),
amount NUMBER
);

-- データ挿入
INSERT INTO sales VALUES (1, 'ノートPC', 150000);
INSERT INTO sales VALUES (2, 'マウス', 2000);
COMMIT;

✅ ② DROP直前にSCNと時刻を取得【重要!】

-- SYSDBAで接続しておく
CONN / AS SYSDBA

-- 現在のSCNを記録(DROP前)
SELECT CURRENT_SCN FROM V$DATABASE;

-- 現在時刻も記録(フラッシュバック TO TIME 用)
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS CURRENT_TIME FROM DUAL;

📝 これで、「戻したい時点」の情報を取得完了です。SCNでも時刻でもOK。


✅ ③ テーブルを誤ってDROP

-- SCOTTユーザーに戻る
CONN scott/tiger

-- テーブルを誤って削除
DROP TABLE sales;

ここで大慌て……でも大丈夫、フラッシュバックで戻せます。


🔁 フラッシュバックでの復旧ステップ(図)

┌────────────────────────────┐
│ Step1:インスタンスをMOUNT状態にする │
└────────────┬────────────┘

┌────────────────────────────┐
│ Step2:RMANでフラッシュバックを実行 │ ← SCNまたは時刻で指定可能
└────────────┬────────────┘

┌────────────────────────────┐
│ Step3:RESETLOGSでオープンする │ ← 忘れず実行!
└────────────────────────────┘

🛠 Step1:データベースをMOUNTモードで起動

SHUTDOWN IMMEDIATE
STARTUP MOUNT

🛠 Step2:RMANでフラッシュバックを実行

rman target /

▶ SCNを指定する場合(例:123456789)

FLASHBACK DATABASE TO SCN 123456789;

▶ 時刻を指定する場合(例:2025-03-29 10:10:00)

FLASHBACK DATABASE TO TIME "TO_DATE('2025-03-29 10:10:00', 'YYYY-MM-DD HH24:MI:SS')";

📝 SCN・時刻どちらでもOKです。
戻す対象に応じて、誤操作「前」の値を使用してください。


🛠 Step3:RESETLOGSでデータベースをオープン

-- SQL*Plusで
ALTER DATABASE OPEN RESETLOGS;

RESETLOGS必須のステップです。忘れると以後の操作ができません。


✅ 復旧確認(SCOTTユーザー)

CONN scott/tiger

SELECT * FROM sales;

-- 結果例
-- ID | ITEM | AMOUNT
-- 1 | ノートPC | 150000
-- 2 | マウス | 2000

👏 無事にテーブルが復元されました!

SQL> show user
ユーザーは"SCOTT"です。
SQL> CREATE TABLE sales (
2 id NUMBER PRIMARY KEY,
3 item VARCHAR2(50),
4 amount NUMBER
5 );

表が作成されました。

SQL> INSERT INTO sales VALUES (1, 'ノートPC', 150000);

1行が作成されました。

SQL> INSERT INTO sales VALUES (2, 'マウス', 2000);

1行が作成されました。

SQL> col item for a10
SQL> SELECT * FROM sales;

ID ITEM AMOUNT
---------- ---------- ----------
1 ノートPC 150000
2 マウス 2000

SQL> COMMIT;

コミットが完了しました。

SQL> CONN / AS SYSDBA
接続されました。
SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN
-----------
2276462 ★SCNを確認

SQL> CONN scott/tiger
接続されました。
SQL> DROP TABLE sales; ★表を削除

表が削除されました。

SQL> CONN / AS SYSDBA
接続されました。
SQL> SHUTDOWN IMMEDIATE
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> STARTUP MOUNT
ORACLEインスタンスが起動しました。

Total System Global Area 1543500120 bytes
Fixed Size 8925528 bytes
Variable Size 889192448 bytes
Database Buffers 637534208 bytes
Redo Buffers 7847936 bytes
データベースがマウントされました。
SQL> exit
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0との接続が切断されました。
[oracle@v19single ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on 土 3月 29 16:47:51 2025
Version 19.21.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

ターゲット・データベース: V19 (DBID=2957249400、未オープン)に接続されました

RMAN> FLASHBACK DATABASE TO SCN 2276462; ★表を削除する以前のSCNを指定

flashbackを25-03-29で開始しています
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=44 デバイス・タイプ=DISK


メディア・リカバリを開始しています
メディア・リカバリが完了しました。経過時間: 00:00:03

flashbackを25-03-29で終了しました

RMAN> ALTER DATABASE OPEN RESETLOGS;

文が処理されました

RMAN> exit


Recovery Managerが完了しました。
[oracle@v19single ~]$ sqlplus scott/tiger

SQL*Plus: Release 19.0.0.0.0 - Production on 土 3月 29 16:49:10 2025
Version 19.21.0.0.0

Copyright (c) 1982, 2022, Oracle. All rights reserved.

最終正常ログイン時間: 土 3月 29 2025 16:41:23 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
に接続されました。
SQL> col item for a10
SQL> SELECT * FROM sales; ★表が元に戻っている

ID ITEM AMOUNT
---------- ---------- ----------
1 ノートPC 150000
2 マウス 2000

⚠ 補足:時刻とSCNのどちらを使うべきか?

指定方法特徴利点注意点
SCN正確に戻せるDROP直前のピンポイント復旧が可能事前に取得が必要
時刻分かりやすい時系列で考えやすい秒単位の誤差でDROP直後に戻るリスクあり

⚠ 注意点まとめ

注意点内容
DROP前にSCN・時刻を記録しておくことフラッシュバックは「いつに戻すか」が命
RESETLOGSを忘れない忘れるとデータベースがオープンできない
FRAに十分な空きがあるか要確認ログが保持されていないと戻せない
バックアップも必ず併用フラッシュバックでは復旧できないケースもある

✅ まとめ

ステップ内容
Step0テーブル作成・誤ってDROP
Step1SCN/時刻を事前に記録
Step2DBをMOUNTで起動
Step3RMANでフラッシュバック実行
Step4RESETLOGSでオープン
Step5テーブル復旧を確認

🔚 おわりに

Oracleのフラッシュバック・データベース機能は、「やってしまった!」をなかったことにできる非常に心強い機能です。
特に、SCNや時刻を正確に記録しておくことが成功のカギとなります。

次回は、フラッシュバックの実行履歴の確認方法や、巻き戻せる最大時点の監視方法について紹介予定です!

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

コメント

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