Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

使用 RMAN 在沒有 catalog 資料庫時的備份與還原方式
post by tommy @ 22 十一月, 2002 21:05
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 <<EOF
run {
allocate channel t1 type disk;
backup
incremental level 0
format '/backup/${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" <<EOF
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 <<EOF
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 <<EOF
shutdown abort;
exit
EOF

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

sqlplus / as sysdba <<EOF
startup mount;
exit
EOF

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

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

rman target / nocatalog <<EOF
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 <<EOF
recover database using backup controlfile until cancel;
alter database open resetlogs;
exit
EOF

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

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 139 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS