DBMS_BACKUP_RESTORE 是 Oracle 內建的底層備份恢復 PL/SQL 介面,RMAN 底層即呼叫此套件。在無法使用 RMAN(如極端環境、自動化腳本嵌入)時,直接呼叫此套件可實現控制檔、資料檔的手動恢復。本文記錄一次 NOMOUNT 階段恢復控制檔的完整實戰流程。
D:\databak\ACT_TESTDB_13G292QT_35C:\Oracle\oradata\testdb\control01.ctlSTARTUP NOMOUNT;
DECLARE
v_dev_type VARCHAR2(256);
v_done BOOLEAN;
BEGIN
-- 1. 分配磁碟裝置通道,識別碼 'T1'
v_dev_type := SYS.DBMS_BACKUP_RESTORE.DEVICEALLOCATE(
TYPE => 'DISK',
IDENT => 'T1'
);
-- 2. 宣告要恢復的是控制檔(非資料檔)
SYS.DBMS_BACKUP_RESTORE.RESTORESETCONTROLFILE;
-- 3. 指定恢復目標控制檔完整路徑
SYS.DBMS_BACKUP_RESTORE.RESTORECONTROLFILETO(
CFNAME => 'C:\Oracle\oradata\testdb\control01.ctl'
);
-- 4. 讀取備份片並恢復內容
SYS.DBMS_BACKUP_RESTORE.RESTOREBACKUPPIECE(
DONE => v_done,
HANDLE => 'D:\databak\ACT_TESTDB_13G292QT_35',
PARAMS => NULL
);
-- 5. 釋放裝置通道
SYS.DBMS_BACKUP_RESTORE.DEVICEDEALLOCATE;
END;
/
-- 6. 掛載資料庫驗證控制檔有效性
ALTER DATABASE MOUNT;
| 程序/函數 | 用途 | 關鍵參數 |
|---|---|---|
| DEVICEALLOCATE | 分配備份裝置通道 | TYPE (DISK/SBT_TAPE), IDENT (通道名) |
| RESTORESETCONTROLFILE | 設定恢復模式為控制檔 | 無 |
| RESTORECONTROLFILETO | 指定目標控制檔路徑 | CFNAME |
| RESTOREBACKUPPIECE | 讀取備份片內容並寫入目標 | HANDLE (備份片全路徑), DONE (OUT BOOLEAN) |
| DEVICEDEALLOCATE | 釋放通道資源 | 無 |
| RESTORESETDATAFILE | 設定恢復模式為資料檔(恢復資料檔時使用) | 無 |
DECLARE
v_done BOOLEAN;
BEGIN
SYS.DBMS_BACKUP_RESTORE.DEVICEALLOCATE(TYPE => 'DISK', IDENT => 'T1');
SYS.DBMS_BACKUP_RESTORE.RESTORESETDATAFILE; -- 切換到資料檔模式
SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(
DFNUMBER => 5, -- 文件號
TONAME => '/u01/app/oracle/oradata/testdb/users01.dbf'
);
SYS.DBMS_BACKUP_RESTORE.RESTOREBACKUPPIECE(
DONE => v_done,
HANDLE => '/backup/datafile_5.bkp',
PARAMS => NULL
);
SYS.DBMS_BACKUP_RESTORE.DEVICEDEALLOCATE;
END;
/
SYS 或具備 SYSDBA 權限的用戶執行。RESTOREBACKUPPIECE 並處理 DONE 旗標。RESTORE CONTROLFILE FROM '...'),僅在無法使用 RMAN 時採用此底層 API。DBMS_BACKUP_RESTORE.VERIFYBACKUPPIECE 檢查備份片完整性。DBMS_BACKUP_RESTORE 提供了繞過 RMAN 的最底層恢復能力,適合極端災難恢復或自動化嵌入場景。掌握「分配通道 → 設定恢復類型 → 指定目標 → 讀取備份片 → 釋放通道」五步驟核心流程,即可在控制檔全遺失時完成自救。