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 |
Step1 | SCN/時刻を事前に記録 |
Step2 | DBをMOUNTで起動 |
Step3 | RMANでフラッシュバック実行 |
Step4 | RESETLOGSでオープン |
Step5 | テーブル復旧を確認 |
🔚 おわりに
Oracleのフラッシュバック・データベース機能は、「やってしまった!」をなかったことにできる非常に心強い機能です。
特に、SCNや時刻を正確に記録しておくことが成功のカギとなります。
次回は、フラッシュバックの実行履歴の確認方法や、巻き戻せる最大時点の監視方法について紹介予定です!
[参考]
バックアップおよびリカバリ・ユーザーズ・ガイド
コメント