前言
前幾天在處理一個生產環境的數據庫恢復任務,2TB 的 Oracle 數據庫需要從備份中完整恢復。按照慣例,晚上啟動 RMAN 恢復任務,準備讓它跑一整夜。
結果第二天早上一看,磁盤空間不夠,RMAN 恢復中斷了。怎么辦,重來嗎?
本文記錄一下處理過程,方便后續查看。
問題現象
查看 RMAN 恢復日志:
channel c2: reading from backup piece /backup/db_full_xxx_1_1_1_20250825.bak
channel c1: ORA-19870: error while restoring backup piece /data/backup/db_full_xxx_1_1_1_20250825.bak
ORA-19502: write error on file "/data/database/tbs_data04.dbf", block number 3145984 (block size=8192)
ORA-27072: File I/O error
Linux-x86_64 Error: 28: No space left on device
Additional information: 4
Additional information: 3145984
Additional information: -1
channel c2: ORA-19870: error while restoring backup piece /data/backup/db_full_xxx_1_1_1_20250825.bak
ORA-19502: write error on file "/data/database/tbs_data.327.1170146731", block number 37184 (block size=8192)
ORA-27072: File I/O error
Additional information: 4
Additional information: 37184
Additional information: 217088
channel c3: ORA-19870: error while restoring backup piece /data/backup/db_full_xxx_1_1_1_20250825.bak
ORA-19502: write error on file "/data/database/tbs_data.311.1147251363", block number 3219328 (block size=8192)
ORA-27072: File I/O error
Linux-x86_64 Error: 28: No space left on device
failover to previous backup
creating datafile file number=16 name=/data/database/tbs_data.dbf
creating datafile file number=36 name=/data/database/tbs_data04.dbf
creating datafile file number=37 name=/data/database/tbs_data05.dbf
[部分數據文件創建日志省略...]
Finished restore at 02-SEP-25
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of switch command at 09/02/2025 21:19:55
ORA-19563: header validation failed for file
Recovery Manager complete.
從報錯 Linux-x86_64 Error: 28: No space left on device 明顯可以看到是磁盤空間不足導致恢復中斷。
磁盤擴容
首先需要解決磁盤空間問題,虛擬化增加了一塊 2T 盤,執行以下 LVM 擴容操作:
# 創建物理卷
pvcreate /dev/sdc
# 擴展卷組
vgextend data /dev/sdc
# 擴展邏輯卷(使用全部可用空間)
lvextend -l +100%FREE /dev/data/data_lv
# 調整文件系統大小
resize2fs /dev/data/data_lv

擴容完成后,確認磁盤空間充足后準備重新啟動恢復任務。
RMAN 斷點續傳機制
一個關鍵問題:RMAN 是否支持從中斷點繼續恢復,還是需要重新開始?
啟動恢復腳本進行驗證:
[oracle@dbserver:/home/oracle]$ sh restore.sh & [1] 16640 [oracle@dbserver:/home/oracle]$ tail -200f restore_2025-09-03.log
觀察日志輸出,可以清楚看到 RMAN 的智能恢復機制:
Starting restore at 03-SEP-25
datafile 1 is already restored to file /data/database/system.260.1056479481
datafile 2 is already restored to file /data/database/sysaux.261.1056479483
datafile 3 is already restored to file /data/database/undotbs1.262.1056479483
datafile 4 is already restored to file /data/database/undotbs2.264.1056479487
datafile 5 is already restored to file /data/database/users.265.1056479487
datafile 6 is already restored to file /data/database/tbs_trans
datafile 7 is already restored to file /data/database/tbs_workflow_ex
datafile 8 is already restored to file /data/database/tbs_hist
datafile 9 is already restored to file /data/database/tbs_main
[已恢復數據文件列表省略...]
# 從未完成的數據文件開始恢復
channel c1: starting datafile backup set restore
channel c1: specifying datafile(s) to restore from backup set
channel c1: restoring datafile 00036 to /data/database/tbs_data04.dbf
channel c1: restoring datafile 00046 to /data/database/tbs_data.310.1147251361
channel c1: restoring datafile 00061 to /data/database/tbs_data.325.1165308233
channel c1: restoring datafile 00083 to /data/database/tbs_data.347.1189929603
channel c1: reading from backup piece /backup/db_full_xxx_1_1_1_20250901.bak
監控恢復進度
使用以下 SQL 查詢實時監控恢復進度:
SQL> set line2222 pages1000
SQL> SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK,
ROUND(SOFAR/TOTALWORK*100,2) "% Complete",
TIME_REMAINING/60 "Minutes Remaining"
FROM V$SESSION_LONGOPS
WHERE OPNAME LIKE 'RMAN%'
AND TOTALWORK != 0
AND SOFAR != TOTALWORK;
SID SERIAL# CONTEXT SOFAR TOTALWORK % Complete Minutes Remaining
---------- ---------- ---------- ---------- ---------- ---------- -----------------
1423 14 1 1063783 15990656 6.65 66.4166667
1992 7 1 809302 12312064 6.57 67.2833333
853 607 3 2569277 262981344 .98 413.866667
1707 7 1 1091712 15990656 6.83 64.6
寫在最后
通過這個案例,想跟大家分享一個很多人可能不太了解的 RMAN 特性。很多 DBA 朋友遇到恢復中斷時,第一反應是重新開始,其實完全沒必要。
RMAN 的斷點續傳機制相當可靠,這個功能從 Oracle 9i 開始就有了,但真正用過的人不多。原理很簡單:RMAN 會檢查目標文件的 header 信息和備份集的元數據,判斷哪些數據文件已經完整恢復。
對于剛接觸 Oracle 的朋友,遇到大型數據庫恢復中斷不要慌。RMAN 比你想象中聰明,相信它的斷點續傳能力。這個機制在企業級應用中經過了無數次驗證,穩定性和可靠性都沒問題。
當然,預防永遠比補救重要。恢復前的規劃和檢查,遠比事后的補救措施來得有效。
「喜歡這篇文章,您的關注和贊賞是給作者最好的鼓勵」
關注作者
【版權聲明】本文為墨天輪用戶原創內容,轉載時必須標注文章的來源(墨天輪),文章鏈接,文章作者等基本信息,否則作者和墨天輪有權追究責任。如果您發現墨天輪中有涉嫌抄襲或者侵權的內容,歡迎發送郵件至:contact@modb.pro進行舉報,并提供相關證據,一經查實,墨天輪將立刻刪除相關內容。




