免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2843 | 回复: 1
打印 上一主题 下一主题

完整版非catalog模式下的RMAN备份与恢复 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-25 15:06 |只看该作者 |倒序浏览
俺上的帖子得用dbms_backup_resote包来取数据文件,很麻烦,如果不知道file ID根本无从下手。

本文的假设是需要不完全恢复的方式下备份,如果您的需求不一样,可以自己对脚本做修改

一、        在使用rman备份之前,首先确保数据库已经打开archivelog模式。
如果没有打开,可以按以下步骤操作:
(1)        首先把数据库停止再启动到mount状态
SQL> shutdown immediate
SQL> startup mount

(2)        修改数据库参数
SQL>alter database archivelog;
SQL>alter system set db_recovery_file_dest='/u02/backup';
SQL>alter database open;

(3)        如果是双机环境,则应当同步当前修改的spfile。
$ spc $ORACLE_HOME/dbs/spfilehdoadb.ora   oracle@oaserver2:/$ORACLE_HOME/dbs/

二、        备份数据库
1、编写备份脚本,内容如下(仅供参考):

#!/bin/bash

dbname=hdoadb
dbuser=oracle
export ORACLE_SID=$dbname
export ORACLE_BASE=$(su - $dbuser -c 'echo $ORACLE_BASE')
export ORACLE_HOME=$(su - $dbuser -c 'echo $ORACLE_HOME')
timestamp=$(date +"%Y%m%d-%H%M%S")

top_dir=/u02/backup
backup_dir=$top_dir/dat/$dbname/$timestamp
arcbak_dir=$top_dir/arc/$dbname
local_dir=/backup/rman

spfile_bkp=$backup_dir/$timestamp.spfile$dbname.ora
ctl_snap=$ORACLE_HOME/dbs/snapcf_${dbname}.f
ctl_copy=$backup_dir/$timestamp.$dbname-snapcf.ctl
db_bkp=$backup_dir/$timestamp.$dbname-%s.bkp
arc_bkp=$arcbak_dir/$timestamp.$dbname-%s.arc
rman_log=$backup_dir/$timestamp.${dbname}_rman.log

chk_db=$(ps axw | grep ora_ | grep $dbname | grep -v grep)
if [ -z "$chk_db" ];then
   exit 1
fi

if [ ! -d $backup_dir ];then
  mkdir -p $backup_dir
  chown -R oracle:oinstall $backup_dir
fi

if [ ! -d $arcbak_dir ];then
  mkdir -p $arcbak_dir
  chown -R oracle:oinstall $arcbak_dir
fi

if [ ! -d $local_dir ];then
  mkdir -p $local_dir
  chown -R oracle:oinstall $local_dir
fi

## backup password file and /etc/oratab
su - $dbuser -c "tar zcPf $backup_dir/$timestamp.${dbname}_orapw.tgz \
$ORACLE_HOME/dbs/hc_$dbname.dat \
$ORACLE_HOME/dbs/orapw$dbname \
/etc/oratab"

## backup all dump dest for database
dump_dest=$(su - $dbuser -c "export ORACLE_SID=$ORACLE_SID;sqlplus / as sysdba << EOF
show parameters user_dump_dest;
quit;
EOF")
all_dest=$(dirname $(echo "$dump_dest" | grep "user_dump_dest" | awk '{ print $3 }'))
su - $dbuser -c "tar zcPf $backup_dir/$timestamp.${dbname}_dump.tgz $all_dest"

## backup spfile , datafile , controlfile
su - $dbuser -c "export ORACLE_SID=$ORACLE_SID;
rman target / log $rman_log append << EOF
CONFIGURE CONTROLFILE AUTOBACKUP OFF;
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO COMPRESSED BACKUPSET;
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '$ctl_snap';
BACKUP SPFILE TAG '$timestamp' FORMAT '$spfile_bkp';
BACKUP FULL TAG '$timestamp' DATABASE FORMAT '$db_bkp';
BACKUP ARCHIVELOG ALL TAG '$timestamp' FORMAT '$arc_bkp';
DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 1 TIMES TO DEVICE TYPE DISK;
CROSSCHECK ARCHIVELOG ALL;
QUIT;
EOF"

## copy the snapshot controlfile to backup directory
su - $dbuser -c "cp $ctl_snap $ctl_copy"

## delete backupsets that older than 7 days
su - $dbuser -c "find $top_dir/dat/$dbname -mtime +6 -exec rm -fr {} \;"
su - $dbuser -c "find $top_dir/arc/$dbname -mtime +6 -exec rm -fr {} \;"

## build new information of backupsets in controlfile
su - $dbuser -c "export ORACLE_SID=$ORACLE_SID;
rman target / log $rman_log append << EOF
CROSSCHECK BACKUP;
EXIT;
EOF"

## copy the latest backupset to local directory
su - $dbuser -c "rm -fr $local_dir/*"
su - $dbuser -c "cp -R $backup_dir $local_dir"

将以上内容保存为rman_bak.sh,授予755权限,然后用root执行测试是否能够正常备份。

2、备份脚本说明

以上脚本会自动生成以下目录:
/backup
/u02/backup/arc
/u02/backup/dat
每一次备份,自动生成的目录为:
/backup/<数据库名>
/u02/backup/arc/<数据库名>
/u02/backup/dat/<数据库名>/YYYYMMDD-HHmmss/

在arc子目录下保存的是归档日志的备份,dat子目录下保存的是数据库数据文件、控制文件、spfile和user_dump等文件。

在/u02/backup目录下备份完策划能够后,自动删除超过七天以前的备份,然后将最近的备份拷贝到本地目录/backup下。

每次备份生成如以下文件:
20070420-160407.spfilehdoadb.ora
20070420-160407.hdoadb-19.bkp
20070420-160407.hdoadb-20.bkp
20070420-160407.hdoadb_dump.tgz
20070420-160407.hdoadb_orapw.tgz
20070420-160407.hdoadb_rman.log

其中每一个文件的开头为日期,接着是数据库名称,.bkp文件是数据文件、控制文件和spfile的备份集。.log文件是rman备份时的操作信息。orapw.tgz结尾的文件是oracle的口令文件备份,dump.tgz结尾的文件是cdump,udump,adump等子目录的备份。

如果希望备份的时候保存到其他目录,可以修改脚本中的变量:

top_dir=<磁盘阵列的备份目录>
local_dir=<保存本地备份的目录>

三、        数据库恢复

按照不同的损坏程度,有不同的恢复方法:
1、数据库全部损坏,重装之后,在有备份集的情况下做恢复:

(1)首先解压格式:
YYYYMMDD-HHmmmss.$dbname_orpw.tgz
YYYYMMDD-HHmmmss.$dbname_dump.tgz
的包:
# tar zxPf YYYYMMDD-HHmmmss.$dbname_orpw.tgz
# tar zxPf YYYYMMDD-HHmmmss.$dbname_dump.tgz

(2)然后启动到nomout状态:
在解压文件后,$ORACLE_BASE/admin/<DBNAME>pfile目录中,有一个格式为init.ora.nnnnnnn的参数文件,可以先用该文件启动到nomount状态。
Sqlplus / as sysdba
SQL> startup nomount pfile=/path_to/init.ora.nnnnnnnn;

(3)从rman恢复spfile和controlfile:
Rman target /
RMAN> restore spfile from ‘/path_to/ YYYYMMDD-HHmmmss.$dbname_%s.bkp’
RMAN> restore controlfile from ‘/path_to/ YYYYMMDD-HHmmmss.$dbname_%s.bkp’
RMAN> quit;

备份集的文件可以从备份时生成的log文件中查看。

(4)重新启动数据库到mount状态:
SQL> shutdown
SQL> startup mount;

(5)从RMAN恢复数据库:
$ rman target /
RMAN> restore database;
RMAN> recover database;
RMAN> quit;

执行recover database的时候会报错,可以不理会。

(6)将数据库启动到open状态:
SQL> alter database open resetlogs;

至此,数据库恢复完成。

2、仅数据库文件、控制文件丢失下的恢复
(1)首先创建原来的数据库目录结构:
# mkdir –p /02/oradata/hdoadb
# chown oracle:oinstall –R /u02/oradata/hdoadb

(2)从sqlplus启动到nomount状态,然后按照上述方法恢复controlfile。
SQL> startup nomount;
RMAN> restore controlfile from ‘/path_to/backup_peice.bkp’;

启动到mount状态:
SQL> alter database mount;

(4)        恢复数据文件:
rman target /
RMAN> restore database;
RMAN> recover database;
RMAN> quit;

执行recover database的时候会报错,可以不理会。

将数据库启动到open状态:
SQL> alter database open resetlogs;

论坛徽章:
0
2 [报告]
发表于 2007-04-28 11:31 |只看该作者
不错,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP