我是靠谱客的博主 爱撒娇黑夜,最近开发中收集的这篇文章主要介绍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

"yesr";exp_continue}

"*password*" {send "$passwdr";}

}

expect eof;"

}

Rsync_exec2(){

expect -c "

set timeout 7200;

spawn rsync -rpogtv --files-from=list2

$archive_dir $dest_db:$archive_dir

expect {

"*password*" {send "$passwdr";}

}

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

"yesr";exp_continue}

"*password*" {send "$passwdr";}

}

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磁盘备份进行异地恢复的全部内容,希望文章能够帮你解决oracle rman异地备份,通过RMAN磁盘备份进行异地恢复所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部