鼎新T100 ERP DB備份及還原實錄–使用ORACLE RMAN

ORACLE RMAN RESTORE ON THE BACKUP VM:新手也看得懂的 Blog 式 SOP

影片來源:ORACLE-RMAN-RESTORE-ON-THE-BACKUP-VM.mp4

讀者定位:完全沒碰過 Oracle RMAN 還原流程的新手

說明:本文依影片畫面中的實際命令、錯誤訊息、檔名與目錄結構整理而成。影片解析度有限,少數字串可能有 OCR 誤差,但整體還原流程、判斷邏輯與排錯脈絡是清楚可重建的。

這支影片在教什麼

這支影片比前一支更接近「真實環境裡的還原作業」。

它不是單純示範 RMAN 指令,而是把下面幾件事串成一個完整流程:

  1. 先把資料庫停掉,改用 pfile 啟動到 nomount
  2. 修正常見的小錯,例如 pfile 路徑打錯
  3. 視需要建立 spfile
  4. 把備份檔從遠端備份主機或 NAS 拉到本機 backup VM
  5. 還原 control file,讓資料庫進入 mount
  6. catalog 備份目錄
  7. restore database
  8. recover database
  9. 遇到 archived log 缺失或權限問題時補檔
  10. 最後用 set until sequence 做不完全恢復,再 open resetlogs

這支片真正有價值的地方是:

它讓你看到 RMAN restore 不是「打一條 restore 指令就結束」,而是一個同時牽涉到 Oracle、Linux 權限、備份主機同步、備份完整性與恢復點判斷的實戰流程。


先理解這支影片的環境角色

從畫面判斷,這次不是直接在原始正式主機上恢復,而是在一台備份用途的 VM 上操作。

這代表兩件事:

  1. 本機未必一開始就有完整的 ctlfullarchlog 備份檔
  2. 本機目錄權限、檔案 owner、備份同步狀態,都可能影響 RMAN 是否讀得到檔案

所以這支 SOP 會比上一支多一層:

除了 Oracle 內部 restore/recover,還要處理「備份檔真的有沒有在本機到位」。


新手先懂 5 個關鍵觀念

1. root 不等於可以直接跑 sqlplusrman

影片一開始就看到:

sqlplus / as sysdba
bash: sqlplus: command not found

後來切成:

su - oracle
sqlplus / as sysdba

這告訴你:

Oracle 工具通常仰賴 oracle 帳號的環境變數,例如 ORACLE_HOMEPATHORACLE_SID。你就算是 root,也不代表 shell 環境裡找得到 sqlplusrman

2. nomount 是 restore controlfile 的前置狀態

資料庫在 nomount 時,instance 已經起來,但還沒讀 control file。

為什麼重要:

如果你的目標是先把 control file 救回來,資料庫就必須先停在這個狀態。

3. catalog 的意思不是備份,而是讓 RMAN 認識檔案

RMAN 只會處理它認得的備份片。檔案即使真的躺在磁碟上,如果還沒 catalog 進來,後面的 restore/recover 也可能做不下去。

4. archived log 缺失有兩種常見原因

不是只有「真的沒有檔案」。

還可能是:

  • 檔案存在,但本機尚未同步回來
  • 檔案存在,但權限錯誤,Oracle 讀不到

5. set until sequence 是在承認「我只能恢復到這裡」

當缺少下一個 archived log 時,你不能再做完整恢復,只能把資料庫恢復到手上最後一個可用 sequence,再 open resetlogs


影片的整體流程圖

這支影片大致可以拆成以下 6 段:

  1. oracle 使用者關閉資料庫、啟動到 nomount
  2. 修正 pfile 指令與建立 spfile
  3. 由 root 用 rsync 從遠端備份主機同步備份片到 /u4/orabackup
  4. 以 RMAN restore controlfile、mount、catalog、restore database
  5. recover database 時發現 archived log 缺失與權限問題
  6. 補抓 archive logs、設定 until sequence、完成 recover 並 open resetlogs

Blog 式 SOP:一步一步做,並說明每一步為什麼要這樣做

Step 1:先切到 oracle 帳號,再操作 SQL*Plus / RMAN

影片中可辨識的動作:

sqlplus / as sysdba
bash: sqlplus: command not found

su - oracle
sqlplus / as sysdba

為什麼要這樣做:

因為 oracle 帳號的登入環境通常已載入 Oracle 軟體路徑,直接使用 root 常常找不到 sqlplusrman

這一步教你的不是權限,而是環境:

Oracle 工具能不能執行,很多時候不是看你是不是管理員,而是看 shell 環境有沒有正確載入 Oracle home。


Step 2:先把資料庫正常關掉

影片中可辨識到:

shutdown immediate;

為什麼要先 shutdown:

你要做的是 restore/recover,不是在線上資料庫上直接覆蓋檔案。先把既有 instance 收乾淨,才能避免控制檔、資料檔與恢復流程互相衝突。

對新手來說,可以先記住:

還原前要先把現場「清空到可控狀態」。


Step 3:用 pfile 啟到 nomount,但要注意路徑格式

影片中出現了兩次不同寫法:

錯誤寫法:

startup nomount pfile='/u4/inittopprd.ora/';

對應錯誤:

LRM-00109: could not open parameter file '/u4/inittopprd.ora/'
ORA-01078: failure in processing system parameters

修正後:

startup nomount pfile='/u4/inittopprd.ora';

啟動成功。

為什麼這一步值得特別寫:

因為這不是「Oracle 壞掉」,而是很單純的路徑字串錯誤。檔名後面多一個 /,Oracle 就把它當成不存在的參數檔。

這一步教會新手一件事:

不是所有 RMAN/restore 問題都很複雜,很多中斷點其實只是基本路徑與檔名錯字。

關鍵截圖:

pfile 路徑錯誤後修正成功


Step 4:由 pfile 建立 spfile

影片中可見:

先打錯:

create spfile from pfile='/u4/inittopprd';

報錯:

ORA-01078
LRM-00109

修正後:

create spfile from pfile='/u4/inittopprd.ora';

結果:

File created.

為什麼要建 spfile:

在 LAB 或重建環境中,先用 pfile 啟動很常見,因為你還在修環境。但當參數確認無誤後,建立 spfile 可以讓後續啟動更接近正式 Oracle 慣例,也能避免每次都得手動指定 pfile。

為什麼這一步重要:

它表示環境從「臨時起得來」往「可持續啟動」前進了一步。


Step 5:用 startup force nomount 再確認 instance 狀態

影片中接著做了:

startup force nomount;

為什麼要再做一次:

因為你剛剛已建立 spfile,這時再用 force nomount 重啟,相當於確認資料庫已能用比較標準的方式回到 restore 前置狀態。

這一步像是在做環境驗收:

  • pfile 可用
  • spfile 已生成
  • instance 可正常啟到 nomount

Step 6:先把備份片同步到 backup VM

影片裡這是很重要的一段。可辨識到的動作包含:

rsync -avzh iwbackup@192.168.20.117:/volume2/Backup/u4/orabackup/ctl/ /u4/orabackup/ctl/
rsync -avzh iwbackup@192.168.20.117:/volume2/Backup/u4/orabackup/archlog/ /u4/orabackup/archlog/

也看到操作者檢查:

cd /u4/orabackup
ls -la
chown -R oracle.dba ...

為什麼 restore 前要先同步備份:

因為 RMAN restore 讀的是本機檔案系統。如果 backup VM 上沒有完整的 ctlfullarchlog 備份片,RMAN 就算指令正確也沒東西可還。

為什麼還要 chown

因為檔案從別的主機 rsync 過來後,owner/group 不一定符合本機 Oracle 程序可讀取的權限。後面影片真的就出現了 archived log 檔案存在但無法開啟的情況,這一步其實是在提前消除風險。

關鍵截圖:

rsync 備份片並整理目錄權限


Step 7:確認 controlfile 備份存在,並挑最新或合適的一份

影片中列出了很多 controlfile 備份,例如:

  • control_20200620...
  • control_20200621...
  • control_20200630...
  • control_20200701...
  • control_20200702...

最後使用的是:

restore controlfile from '/u4/orabackup/ctl/control_20200702_cf_D-TOPPRD_id-2973224763_ptv4b10l.ctl';

為什麼要先看 controlfile 清單:

因為 controlfile 本身也有時間點。你選的 controlfile 越接近你要還原的備份集,後續 catalog 與 restore 的一致性通常越好。

對新手來說,這一步是在學:

controlfile 不是隨便拿一份就好,最好選與你的 full backup、archivelog 備份時間帶相近的版本。


Step 8:restore controlfile 後,把資料庫 mount 起來

影片中清楚可見:

restore controlfile from '/u4/orabackup/ctl/control_20200702_cf_D-TOPPRD_id-2973224763_ptv4b10l.ctl';
alter database mount;

畫面也顯示 controlfile 被還原到:

  • /home/oracle/oradata/topprd/control01.ctl
  • /home/oracle/oradata/topprd/control02.ctl

為什麼先 restore controlfile:

因為 controlfile 是 RMAN 後續識別資料檔、備份片、redo 與資料庫結構的核心。

為什麼接著要 mount:

只有 mount 後,Oracle 才真正載入 controlfile,RMAN 才能繼續做 restore database 與 recover database。

關鍵截圖:

restore controlfile 並 mount


Step 9:catalog 備份目錄,讓 RMAN 知道有哪些可用檔案

從畫面可推斷操作者對 /u4/orabackup 做了 catalog,並看到:

  • archlog 檔案被列出
  • controlfile 檔案被列出
  • shell script 與 log 檔被標記為 RMAN-07517: The file header is corrupted

這個訊息不用緊張。

為什麼:

因為 RMAN 是在掃整個目錄,它看到 .sh.log 這種不是備份片的檔案,當然讀不出 RMAN 備份頭,所以會說 header corrupted。

這不表示你的備份壞了,而只是表示「這些不是 RMAN 備份格式」。

這一步在教你:

shared backup directory 裡有雜檔很正常,但你要知道哪些訊息是真的問題,哪些只是掃描副作用。


Step 10:開始 restore database

影片中可見多個 datafile 依序還原到:

  • /home/oracle/oradata/topprd/...
  • 某些檔案也出現 /home/oracle/oradata/topstd/...

並且從備份片:

/u4/orabackup/full/full_TOPPRD_20200702_...

讀取資料。

為什麼這一步是 restore,不是 recover:

restore database 做的是把備份片中的資料檔重新放回磁碟。

它只是「把檔案放回去」,還沒有把資料推到交易一致點。

所以 restore 完不代表資料庫已可開啟。


Step 11:recover database 時卡在 archived log

影片中的第一波錯誤很有代表性:

ORA-19870: error while restoring backup piece /u4/orabackup/archlog/arch_TOPPRD_21481_20200703
ORA-19505: failed to identify file
ORA-27041: unable to open file
Linux-x86_64 Error: 13: Permission denied

接著 RMAN 又回報:

RMAN-06025: no backup of archived log found
RMAN-06053: unable to perform media recovery because of missing log

為什麼這段非常關鍵:

它把兩種問題疊在一起了:

  1. archived log 可能本機不完整
  2. 某些 archived log 即使已在本機,Oracle 也可能因權限不足而打不開

也就是說,RMAN 說缺 log,不一定是真的沒有;有可能是檔案在,但 Oracle 讀不到。

這正是為什麼前面要做 chown 與目錄檢查。

關鍵截圖:

recover 時遇到 archived log 權限與缺檔問題


Step 12:回到備份主機或 NAS,補抓缺的 archive logs

影片這裡切到類似 NAS 的 File Station,顯示:

  • archlog_old
  • orabackup/archlog
  • 多個 arch_TOPPRD_<sequence>_<date> 檔案

接著回到 Linux 上用 rsync 持續補抓:

rsync -avzh iwbackup@192.168.20.117:/volume2/Backup/u4/orabackup/archlog/ /u4/orabackup/archlog/

影片中還出現:

  • rsync error: unexplained error (code 255)
  • received SIGUSR1
  • 重新執行後成功抓到更多檔案

為什麼這段很實戰:

現場做 restore 時,問題常常不是 Oracle 指令,而是:

  • 備份還沒全同步完
  • 傳輸中斷
  • 第一次 rsync 失敗
  • 你需要人工去確認缺的 sequence 到底在哪個目錄

這一步教你的,是「備份檔供應鏈管理」。

也就是:

RMAN restore 的成功率,很大程度取決於備份主機和還原主機之間的檔案同步是否完整。

關鍵截圖:

本機 archlog 目錄內容確認


Step 13:recover 到最後一個可用 archived log 為止

影片後半段顯示 recover 能處理到:

  • sequence 21499
  • sequence 21500

之後出現:

unable to find archived log
archived log thread=1 sequence=21501
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 21501

這表示什麼:

目前所有能取得、也能成功讀取的 archived log,只能把資料庫推到 21500 之後的邊界,再往下一個 sequence 21501 就沒有了。

所以這時就必須面對現實:

你做不了完整恢復,只能做不完全恢復。

關鍵截圖:

recover 卡在 sequence 21501


Step 14:用 set until sequence 做不完全恢復

影片中明確可見:

run {
  set until sequence 21501 thread 1;
  recover database;
}

之後 RMAN 顯示:

media recovery complete
Finished recover

為什麼是 set until sequence 21501

這裡的邏輯不是「我有 21501」,而是「我把恢復目標鎖在 21501 前的可一致位置」。實際上是承認再往後推就缺 log 了,所以讓 RMAN 在目前可用範圍內完成恢復。

這一步對新手來說是最重要的觀念之一:

當 archived log 缺失時,目標不是硬撐到最新,而是安全地停在最後一個可閉合的一致點。


Step 15:alter database open resetlogs

影片中 recover 完成後馬上接著:

alter database open resetlogs;

雖然影片在最後沒有完整展開所有開庫後查詢結果,但整體脈絡很清楚:

這是標準的不完全恢復收尾方式。

為什麼一定要 resetlogs

因為你已不是把資料庫恢復到原來 redo 歷史的自然終點,而是在某個中間點重啟資料庫生命線。這時 Oracle 需要重新建立 redo 歷史,開出新的 incarnation。


Step 16:收尾驗證

影片末段可見:

select open_mode ...

雖然結果未完整拍出,但這表示操作者至少有做開庫後的基本驗證。

實務上你至少應該驗證:

  1. select open_mode from v$database;
  2. select name from v$database;
  3. 必要時確認 resetlogs_change# 或 incarnation 狀態
  4. 檢查 alert log 是否還有殘餘錯誤

為什麼這一步不能省:

因為 restore 成功、recover 成功、能 open,這三件事在實務上是不同層次。真正交付前,至少要確認資料庫已是可讀寫或符合你的預期狀態。


新手版 SOP 摘要

如果你只想先記住骨架,可以背下面這版:

  1. su - oracle
  2. sqlplus / as sysdba
  3. shutdown immediate
  4. startup nomount pfile='/u4/inittopprd.ora'
  5. create spfile from pfile='/u4/inittopprd.ora'
  6. startup force nomount
  7. rsyncctl/full/archlog 從備份主機同步到本機
  8. 檢查 /u4/orabackup 目錄與 owner/group
  9. rman target /
  10. restore controlfile from '<ctl backup path>'
  11. alter database mount
  12. catalog start with '/u4/orabackup'
  13. restore database
  14. recover database
  15. 如果 archived log 缺失,先確認是缺檔還是權限錯誤
  16. 必要時回備份主機補抓 archive logs
  17. 如果仍缺下一個 sequence,改用 set until sequence
  18. alter database open resetlogs
  19. 驗證 open_mode

常見錯誤與這支影片教你的判斷方式

錯誤 1:sqlplus: command not found

代表什麼:

不是 Oracle 沒裝,而是你現在這個 shell 環境沒有 Oracle 的執行路徑。

怎麼想:

先切 oracle 使用者,再談後面指令。

錯誤 2:LRM-00109 could not open parameter file

代表什麼:

通常是 pfile 路徑寫錯,這支片裡就是多打一個 /

怎麼想:

先檢查路徑字串,不要一開始就判定資料庫損壞。

錯誤 3:ORA-27041 unable to open file + Permission denied

代表什麼:

檔案可能存在,但 Oracle 程序無法讀取。

怎麼想:

先查 owner/group/permission,特別是檔案剛從 rsync 拉回來時。

錯誤 4:no backup of archived log found

代表什麼:

可能是真缺檔,也可能是本機還沒同步到,或權限讓 Oracle 視同找不到。

怎麼想:

不要只在 RMAN 裡重試,要回到 OS/NAS 檢查實體檔案是否存在。

錯誤 5:media recovery requesting unknown archived log

代表什麼:

你現在想恢復到的下一段 sequence 已經不在可用備份範圍內。

怎麼想:

把恢復目標停在最後一個可用 sequence 前後,改做不完全恢復。


這支影片真正想教會你的,不只是 RMAN 指令

如果把這支影片濃縮成一句話,它在教的是:

先讓本機環境能跑 Oracle,再讓本機真的擁有可讀的備份片,最後才談 RMAN 能把資料庫恢復到哪裡。

也就是說,RMAN 還原有三層:

  1. Oracle 啟動層
  2. 備份檔供應層
  3. 恢復點判斷層

很多新手只盯著第 3 層,但這支影片清楚示範:

第 1 層和第 2 層如果沒處理好,第 3 層根本走不到。


可以直接拿去做內訓的結論

這支 ORACLE-RMAN-RESTORE-ON-THE-BACKUP-VM 最適合拿來教新人以下 5 件事:

  1. 為什麼要用 oracle 帳號而不是直接 root 執行 RMAN
  2. nomount -> restore controlfile -> mount -> restore -> recover -> resetlogs 的正確順序
  3. restore 前,為什麼一定要先確認本機 backup VM 真的拿到完整備份片
  4. archived log 問題不能只看 RMAN,還要回到檔案系統與備份來源檢查
  5. 缺 log 時,如何用 set until sequence 做安全收尾

如果只記一句話,就是:

在 backup VM 上做 RMAN restore,成功的關鍵不只是指令對,而是「檔案真的在、Oracle 真的讀得到、恢復點真的合理」。

By Kevin

發佈留言

CS

AI 客服助理

線上答詢中

error: Content is protected !!