- 论坛徽章:
- 0
|
俺上的帖子得用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; |
|