oracle rman异地备份,通过RMAN磁盘备份进行异地恢复
RMAN的配置,包括Catalog數據庫的配置并不復雜,相關資料也很多,就不贅述了。
通過RMAN備份
在RMAN中,對需要備件的數據庫相關信息進行備份。默認情況下備份是非常簡單的。
$rman catalog rman/rman@test1 target sys/oracle@gz
#catalog數據庫sid為test1
RMAN>backup spfile format ‘/backup/spfilegz.ora’;
#備份spfile
RMAN>copy controlfile to ‘/backup/control01.ctl’;
#備份controlfile
RMAN>backup database; #數據庫全備
RMAN>backup archivelog all;
除了手動指定備份路徑的spfile與controlfile,其他的數據默認被備份到$ORACLE_HOME/flash_recovery_area/GZ下面的archivelog與backupset
(sid是gz)
將備份的數據全部傳到需要恢復的主機上。用rcp當然可以,redhat下默認把rcp封掉了,baidu了一下有一篇用resync命令我覺得挺好,就借用了。
原貼link:
http://www.heibai.net/articles/defense/ruqinjiance/2011/0722/15424.html
備份主機的hostname為swt1,恢復主機的hostname為swt2
#!/bin/sh
#!keep sync of backup between gz and bj
ORACLE_HOME=/u01/oracle/product/10.2.0/db_1
bak_dir=$ORACLE_HOME/flash_recovery_area/GZ/backupset
bak_dir2=/backup
archive_dir=$ORACLE_HOME/flash_recovery_area/GZ/archivelog
dest_db=oracle@192.168.1.172
passwd=oracle
ls -l $bak_dir | awk '{print $NF}'|sed
'1d'>list1
ls -l $archive_dir | awk '{print $NF}'|sed
'1d'>list2
ls -l $bak_dir2 | awk '{print $NF}'|sed
'1d'>list3
Rsync_exec1(){
expect -c "
set timeout 7200;
spawn rsync -rpogtv --files-from=list1?$bak_dir
$dest_db:$bak_dir
expect {
\"*yes/no*\" {send
\"yes\r\";exp_continue}
\"*password*\" {send \"$passwd\r\";}
}
expect eof;"
}
Rsync_exec2(){
expect -c "
set timeout 7200;
spawn rsync -rpogtv?--files-from=list2
$archive_dir $dest_db:$archive_dir
expect {
\"*password*\" {send \"$passwd\r\";}
}
expect eof;"
}
Rsync_exec3(){
expect -c "
set timeout 7200;
spawn rsync -rpogtv --files-from=list3?$bak_dir2
$dest_db:$bak_dir2
expect {
\"*yes/no*\" {send
\"yes\r\";exp_continue}
\"*password*\" {send \"$passwd\r\";}
}
expect eof;"
}
Rsync_exec1
Rsync_exec2
Rsync_exec3
rm -f list1 list2 list3
expect命令是要安裝的,可以用yum或rpm
在相同路徑下通過RMAN恢復
如果只是要把備份的數據恢復到完全相同的路徑,是非常容易的。這里的相同路徑指的是備份文件的路徑與數據庫文件的路徑名都與原來的主機相同。
核心就是幾步。
1.?啟動數據庫到nomount狀態,這時rman就可以工作了
2.?把spfile恢復過來,如果要修改內容,可以生成pfile進行手動編輯
3.?恢復controlfile
4.?啟動到mount狀態,這時就可以恢復數據庫了。
5.?恢復
6.?Recover
7.?Alter database open resetlogs,搞定
在不同路徑下通過RMAN恢復
不同路徑指的是兩種情況
1.?RMAN備份過來的文件存放位置與原來主機上存放位置不一致,原主機上是$ORACLE_HOME/flash_recovery_area/,拷貝到新的主機上放在/backup下
2.?數據庫恢復的位置與原來主機不一致,原主機數據庫數據文件存放在/u01/oracle/product/10.2.0/oradata/gz下,新主機數據庫數據文件存放在/u01/oracle/oradata/gz下
在相同路徑恢復時,可以看到rman很準確地找到了備份數據存放的位置,并且恢復到了正確的位置。那它是從哪里得到這些信息的呢?連接rman時,用得是rman
target
/,并沒有指明catalog數據庫,而且我恢復時干脆把catalog數據庫關掉了。那么就只可能是根據本地的信息來判斷。Spfile的信息很有限,那就只能是controlfile了。用vi打開備份的controlfile,搜索恢復中用到的文件名,果然相關文件的全路徑在controlfile中都有。
現在我們把備份來的備份集文件與歸檔日志都放到/backup下,rman就不知道從哪里讀這些文件了。在rman里直接敲restore
database就可以看到出錯信息,can not identify file
‘/u01/oracle/product/10.2.0/flash_recovery_area/GZ/xfasdfsadfsdfs’之類。所以要通過catalog
archivelog與catalog backuppiece命令告訴rman到哪里找備份集與歸檔日志。
存放controlfile的位置記錄在pfile與spfile中,所以在恢復controlfile之前,先把spfile中的路徑改正確。恢復數據庫時,可以用set
newname的方式把數據庫文件的路徑更改。這樣control file與數據庫文件就都被成功地恢復到新路徑下了。Online
redo日志的位置還是會在原來的路徑中生成,生成新的替換掉就可以了。
[oracle@swt2 ~]$ rman target /
RMAN>
RMAN> startup nomount;
RMAN> restore spfile to
'/u01/oracle/product/10.2.0/db_1/dbs/spfilegz.ora' from
'/backup/spfilegz.ora';
RMAN> sql 'create pfile from spfile';
這時編輯生成的$ORACLE_HOME/dbs/initgz.ora文件,把control
file的路徑改為/u01/oracle/oradata/gz下。
如果想把adump,bdump這些都改了,可以分別進行修改
RMAN> sql 'create spfile from pfile';
RMAN> startup force nomount; #用新的spfile啟動
RMAN> restore controlfile from
'/backup/control01.ctl';
RMAN> alter database mount;
把backup下面的backuppiece與archivelog都加到catalog中,當然可以用腳本的方式。
RMAN> catalog archivelog
'/backup/o1_mf_1_34_7dmtqosj_.arc';
RMAN> catalog archivelog
'/backup/o1_mf_1_35_7dmtqr15_.arc';
RMAN> catalog archivelog
'/backup/o1_mf_1_36_7dmtqvtv_.arc';
RMAN> catalog archivelog
'/backup/o1_mf_1_37_7dmtr5tf_.arc';
RMAN> catalog archivelog
'/backup/o1_mf_1_38_7dmts7dc_.arc';
RMAN> catalog archivelog
'/backup/o1_mf_1_39_7dmtw2d8_.arc';
RMAN> catalog archivelog
'/backup/o1_mf_1_40_7dmtyn0v_.arc';
RMAN> catalog archivelog
'/backup/o1_mf_1_41_7dmv8zdm_.arc';
RMAN> catalog backuppiece
'/backup/o1_mf_annnn_TAG20111121T141808_7dmv91n9_.bkp';
RMAN> catalog backuppiece
'/backup/o1_mf_annnn_TAG20111121T141808_7dmv91vo_.bkp';
RMAN> catalog backuppiece
'/backup/o1_mf_annnn_TAG20111121T141808_7dmv9229_.bkp';
RMAN> catalog backuppiece
'/backup/o1_mf_annnn_TAG20111121T141808_7dmv92cq_.bkp';
RMAN> catalog backuppiece
'/backup/o1_mf_annnn_TAG20111121T141808_7dmv94kg_.bkp';
RMAN> catalog backuppiece
'/backup/o1_mf_ncnnf_TAG20111121T141005_7dmtt30k_.bkp';
RMAN> catalog backuppiece
'/backup/o1_mf_nnndf_TAG20111121T141005_7dmtsys0_.bkp';
RMAN> catalog backuppiece
'/backup/o1_mf_nnndf_TAG20111121T141005_7dmtszhw_.bkp';
RMAN> catalog backuppiece
'/backup/o1_mf_nnndf_TAG20111121T141005_7dmtt09t_.bkp';
RMAN> catalog backuppiece
'/backup/o1_mf_nnsnf_TAG20111121T141005_7dmttrcz_.bkp';
RMAN> run {
set newname for datafile
'/u01/oracle/product/10.2.0/oradata/gz/system01.dbf' to
'/u01/oracle/oradata/gz/system01.dbf';
set newname for datafile
'/u01/oracle/product/10.2.0/oradata/gz/sysaux01.dbf' to
'/u01/oracle/oradata/gz/sysaux01.dbf';
set newname for datafile
'/u01/oracle/product/10.2.0/oradata/gz/undotbs01.dbf' to
'/u01/oracle/oradata/gz/undotbs01.dbf';
set newname for datafile
'/u01/oracle/product/10.2.0/oradata/gz/users01.dbf' to
'/u01/oracle/oradata/gz/users01.dbf';
set newname for datafile
'/u01/oracle/product/10.2.0/oradata/gz/example01.dbf' to
'/u01/oracle/oradata/gz/example01.dbf';
set newname for datafile
'/u01/oracle/product/10.2.0/oradata/gz/tbs001.dbf' to
'/u01/oracle/oradata/gz/tbs001.dbf';
restore database;
switch datafile all;
}
RMAN> recover database;
Starting recover at 21-NOV-11
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
using channel ORA_DISK_4
starting media recovery
archive log thread 1 sequence 39 is already on disk as file
/backup/o1_mf_1_39_7dmtw2d8_.arc
archive log thread 1 sequence 40 is already on disk as file
/backup/o1_mf_1_40_7dmtyn0v_.arc
archive log thread 1 sequence 41 is already on disk as file
/backup/o1_mf_1_41_7dmv8zdm_.arc
archive log filename=/backup/o1_mf_1_39_7dmtw2d8_.arc thread=1
sequence=39
archive log filename=/backup/o1_mf_1_40_7dmtyn0v_.arc thread=1
sequence=40
archive log filename=/backup/o1_mf_1_41_7dmv8zdm_.arc thread=1
sequence=41
unable to find archive log
archive log thread=1 sequence=42
RMAN-00571:
===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS
===============
RMAN-00571:
===========================================================
RMAN-03002: failure of recover command at 11/21/2011
14:52:29
RMAN-06054: media recovery requesting unknown log: thread 1 seq
42 lowscn 777171
上面的錯基本沒什么影響
RMAN> alter database open resetlogs;
database opened
RMAN> exit
這時除了online redo log都恢復好了。
用sqlplus連上來,alter system switch logfile; alter database drop
logfile group 1;alter database add logfile group 1
‘/u01/oracle/oradata/gz/redo01.log’ size 50m; 按這樣的方式把所有log
file都在新的路徑中生成,就齊活了。
總結
以上是生活随笔為你收集整理的oracle rman异地备份,通过RMAN磁盘备份进行异地恢复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASCⅡ码表
- 下一篇: DLL注入——使用注册表