人為的誤操作やシステム障害への対策として、RACやData Guardに加え、Oracleのフラッシュバック機能が有効な手段です。この技術はUNDO領域や専用ログを活用し、データの過去状態を復元可能にします。
主な機能分類:
- UNDO領域依存型:クエリ/バージョンクエリ/トランザクションクエリ/テーブル復元
- リサイクルビン利用型:ドロップ復元
- フラッシュバックログ依存型:データベース全体復元
Oracle 11g以降では、FBDAプロセスによる長期履歴追跡機能も追加され、稼働中のデータベースでフラッシュバック機能を有効化可能になりました。
UNDO領域の確認
復元処理前に領域容量を確認します:
SELECT ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS undo_gb
FROM dba_data_files
WHERE tablespace_name = 'UNDOTBS';
UNDO領域はトランザクションのロールバックや一貫性読み取りに使用されます。自動管理モードではUNDO表領域が使用され、手動モードではロールバックセグメントが参照されます。
特定時刻のデータ復元
誤更新対応の例:
CREATE TABLE hist_user_data NOLOGGING AS
SELECT * FROM app_schema.user_profiles
AS OF TIMESTAMP TO_TIMESTAMP('2023-08-15 22:30:00', 'YYYY-MM-DD HH24:MI:SS');
実行前の確認ポイント:
- DML影響範囲の事前評価
- 大規模スクリプトはDBAによるレビュー
- 本番環境前の十分なテスト
関連テーブルの同時復元
顧客情報と契約情報の関連復元:
CREATE TABLE cust_hist AS
SELECT * FROM app_schema.customers
AS OF TIMESTAMP TO_TIMESTAMP('2023-08-15 22:30:00', 'YYYY-MM-DD HH24:MI:SS')
WHERE customer_id = 'CUST100';
CREATE TABLE subs_hist AS
SELECT * FROM app_schema.subscriptions
AS OF TIMESTAMP TO_TIMESTAMP('2023-08-15 22:30:00', 'YYYY-MM-DD HH24:MI:SS')
WHERE customer_id = 'CUST100';
Data Pumpによるエクスポート:
expdp system/password@prod DIRECTORY=backup_dir
DUMPFILE=cust_data.dmp LOGFILE=export.log
SCHEMAS=app_schema FLASHBACK_TIME="TO_TIMESTAMP('2023-08-15 22:30:00', 'YYYY-MM-DD HH24:MI:SS')";
主要フラッシュバック機能
バージョン履歴の取得:
SELECT versions_starttime, versions_operation, customer_name
FROM app_schema.customers
VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL '1' HOUR AND SYSTIMESTAMP
WHERE customer_id = 'CUST100';
テーブル削除の復元:
FLASHBACK TABLE app_schema.deleted_table TO BEFORE DROP
RENAME TO restored_table;
データベース全体の復元フロー:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2023-08-15 22:30:00', 'YYYY-MM-DD HH24:MI:SS');
ALTER DATABASE OPEN RESETLOGS;