作者 主題: ORACLE Tips: 使用 RMAN 在沒有 catalog 資料庫時的備份與還...  (閱讀 8354 次)

0 會員 與 1 訪客 正在閱讀本文。

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5392
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
ORACLE Tips: 使用 RMAN 在沒有 catalog 資料庫時的備份與還原方式
By Tommy Wu

ORACLE 的 RMAN (Recovery Manager) 是一個不錯的備份與還原工具. 使用 RMAN 來備
份資料庫時, 比以前使用的方式要快多了, 而且空間也節省了不少.

不過, 通常 ORACLE 在使用 RMAN 的時候, 都建議使用另一個 catalog 資料庫來存放備
份的相關訊息. 對於這一點, 我一直無法認同.... 用另一個資料庫來存備份資訊, 那麼
... 那一個 catalog 資料庫要怎麼備份呢? 因為在真的做資料回復的時候, 所能用的東
西是越簡單越好, 如果還要依賴另一個資料庫, 那萬一那個資料庫也出事了, 要如何回
復呢?

所以, 我習慣使用 RMAN 在沒有 catalog 資料庫的情形下做備份與還原的動作. 這樣的
話, 我只要確定備份下來的檔案正常無誤, 就一定可以還原.

當不使用 catalog 資料庫時, 這些備份的資料也要有地方可以存放, 此時, 存放的位置
就是 ORACLE 本身的 control 檔案. 使用這個方式備份時, 你的 controlfile 會因為
存放這些資料而變的比較大 (可能會上數百 MB), 而且你要在你的參數檔案中指定這些
資料的保存日數, 如:

CONTROL_FILE_RECORD_KEEP_TIME = 14

上面的參數會存放 14 天的資料. 你可以依據你的需求而決定這個數字.


== 備份 ==

在備份的時候, 由於備份的資訊是存放在 controlfile 中, 所以我們必須在備份資料庫
之後, 另外將 controlfile 備份出來, 如:

rman target / nocatalog <run {
 allocate channel t1 type disk;
 backup
   incremental level 0
   format '/bakup/${TODAY}/%d_t%t_s%s_p%p'
   database
   maxsetsize 2G
   include current controlfile for standby;
 backup current controlfile tag='database backup';
 sql 'alter system archive log current';
 release channel t1;
}

exit

EOF

在原本的 backup database 指令後面, 多一行指令備份 controlfile, 備份出來的檔
案會存放在 $ORACLE_HOME/dbs 的目錄下面. 只要你有保存這些備份出來的所有檔案,
還有之後的 archivelog 檔案, 就可以將資料庫還原到最後一個 archivelog 的時間.

另外, 也可以使用下面的指另備份 controlfile 來使用:

sqlplus "/ as sysdba" <alter system archive log current;
alter database backup controlfile to '/backup/${TODAY}/control01.ctl';
exit
EOF


== 還原 ==

還原的時候, 先安裝一份 ORACLE, 之後將之前備份的檔案, 放回原本備份時的相關路
徑內 (如果忘了... 做到後面會有錯誤, 就會知道該放那兒了).

首先, 因為 ORACLE 要在 mount 的狀態下才能讀取 controlfile, 所以我們先將備份
的 controlfile 找出來, 所以強迫將資料庫啟動在 mount 的狀態下, 如:

rman target / nocatalog <startup force mount
run {
  allocate channel ch1 type disk;
  restore controlfile to '/tmp/cf.tmp' from tag='database backup';
}  
exit
EOF

上述的指令要將 controlfile 由原本備份到 $ORACLE_HOME/dbs 中的檔案還原到
/tmp/cf.tmp 這個檔案.

這時將資料庫關閉, 再將還原的 controlfile 放回正確的路徑, 然後重新將資料庫啟
動在 mount 的狀態下:

sqlplus / as sysdba <shutdown abort;
exit
EOF

cp /tmp/cf.tmp $ORACLE_DATA/control01.ctl

sqlplus / as sysdba <startup mount;
exit
EOF

如果你的 controlfile 是另外備份出來的檔案, 也可以直接拿來使用, 就不須要上述
的動作, 只要使用那些 controlfile 將資料庫啟動在 mount 狀態就可以了.

這時就可以使用 RMAN 來還原資料庫, 如:

rman target / nocatalog <run {
  allocate channel ch1 type disk;
  restore database;
}
exit
EOF

如果沒有其他的 archivelog 檔案, 可以在 restore database 之後加上下面的兩行指
令:

  recover database noredo;
  sql 'alter database open resetlogs';
 
如果還有 archivelog 檔案, 在上述的 RMAN 指令結束之後, 再執行 recover 的動作,
如:

sqlplus / as sysdba <recover database using backup controlfile until cancel;
alter database open resetlogs;
exit
EOF

這樣整個資料庫就還原回來了.


本文的最新版本可以由下列的網頁取得:
 
http://www.teatime.com.tw/~tommy/doc/rman_nocatalog.txt

solomonqoo

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
不建議這樣做,還是請依照oracle原廠說明執行較為妥當!

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5392
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
那可否說說原廠說明的備份方式應該是什麼呢? (上頭的文也有五年了, 我好像也沒碰 ORACLE 有五年了, 也許這五年間 RMAN 也跟以前不同了吧?)
上頭提到的方法, 不也是由原廠的文件可以看到嗎? 到 metalink 去翻翻看應該還找的到吧.

會考慮這樣的方式, 在上頭也有提到, 因為個人認為, 還原的動作, 本來就應該越單純越好. 在災難發生之後, 如果要還原時才發現少東少西, 還要備份的檔案以外的資料來配合才能還原, 對我來說, 一點保障都沒有.

需要還原, 通常也表示資料庫出問題, 既然資料庫會出問題, 要怎麼保證 catelog 資料庫就不會出問題呢? 放另一套主機中嗎? 可是, 放另一套主機就不會出問題嗎? 而且... 是不是要多花錢買授權, 不然多出來的資料庫要怎麼跑?

當然, 如果可以, 我想沒有任何 DBA 會希望用到還原這個動作. 不過.... 真的到需要做的那一天, 我會希望還原時所須依賴的東西越少越好. 最好只要有 tape 上頭的檔案就能夠還原出來.

tony

  • 活潑的大學生
  • ***
  • 文章數: 204
    • 檢視個人資料
小弟也認為在少數DB的情形下,如果是不要使用 Catalog 會比較單純一點!
如果多個DB的話,用Catalog也不錯啦~在Data Guard 時會方便一點點,也可以在不同時間還原同一份資料=>這其實 nocatalog 也是作得到的!
反正小弟也想不出確切的優點!但 Oracle 很像比較建議使用 Catalog的樣子~
-=-=-=
Powered by Linux
=-=-=-=-=-=-=-=-=

panasync

  • 可愛的小學生
  • *
  • 文章數: 14
    • 檢視個人資料
很好的範例, 我也傾向用nocatalog, 但上面好像少了spfile
backup spfile;
....
restore spfile from autobackup;
....