1 说明
上一篇文章:Oracle逻辑备份脚本,介绍了如何部署Oracle数据库的逻辑备份脚本,在数据迁移场景下十分好用,但是作为备份来说有点牵强。仅仅有逻辑备份时,当故障发生后,逻辑备份恢复只能恢复到某一时刻,无法做到完全恢复,会发生数据丢失。
RMAN是Oracle数据库软件自带的备份/恢复工具,它能够备份整个数据库或数据库部件,如表空间、数据文件、控制文件、归档文件以及Spfile参数文件。通过RMAN的方式无论是要备份还是要恢复,都必须先启动实例并加载数据库。
本篇文章主要介绍如何去部署一份RMAN热备脚本,采用全备+归档备份的方式:
- 全备:每周一次;
- 归档备份:每天一次。
为什么不采用全备+增倍?主要是由于归档备份恢复起来比较灵活,可以恢复到任意时间点。并且归档日志备份不依赖于前置的备份,这样备份链的某一部分损坏不会影响到其他备份的有效性。
2 准备工作
准备工作主要包括脚本路径创建和RMAN配置。
2.1 脚本路径创建
脚本部署在ORCLE_BASE下,使用oracle用户,创建脚本目录:
$ cd /u01/app/oracle/
$ mkdir -p rman/src
$ mkdir -p rman/log
$ mkdir -p rman/ctl
$ tree rman/
rman/
|-- ctl
|-- log
`-- src
3 directories, 0 files
src目录用于存放脚本,log目录用于存放备份日志,ctl目录用于存放自动备份的控制文件。
2.2 RMAN配置保留策略
保留策略有两种类型:recovery window(恢复窗口)和redundancy(冗余)。
通常使用冗余保留策略,保留2份备份。
RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
new RMAN configuration parameters:
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
new RMAN configuration parameters are successfully stored
RMAN> show RETENTION POLICY;
RMAN configuration parameters for database with db_unique_name ORCL are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
3 全备脚本部署
3.1 脚本说明
3.2 编辑脚本
oracle用户进入脚本目录,创建并编辑脚本:
$ cd /u01/app/oracle/rman/src
$ vi rman_orcl_full_weekly.sh
脚本内容如下:
#!/bin/bash
if [ -f $HOME/.bash_profile ];
then
export ORAENV_ASK=NO
. $HOME/.bash_profile
fi
# ---------------------------------------------------------------
# environment variables
# ---------------------------------------------------------------
export ORACLE_HOME=/u01/app/oracle/product/11.2/db_1
export ORACLE_SID=orcl
DATE=`date +'%Y%m%d%H'`
RMANBASE=/u01/app/oracle/rman
SCRIPTDIR=${RMANBASE}/src
LOGDIR=${RMANBASE}/log
CTLDIR=${RMANBASE}/ctl
RMAN_LOG_FILE=${LOGDIR}/${DATE}_${ORACLE_SID}_RMAN_FULL.log
# ---------------------------------------------------------------
# begin
# ---------------------------------------------------------------
echo 'Run Script' $0 >> ${RMAN_LOG_FILE}
echo -e "\n****** Rman Full Backup started on `date +'%F %T'` ******\n" >> ${RMAN_LOG_FILE}
# ---------------------------------------------------------------
# rman full backup
# ---------------------------------------------------------------
rman target / msglog ${RMAN_LOG_FILE} append << EOF
run {
allocate channel ch00 type disk;
allocate channel ch01 type disk;
allocate channel ch02 type disk;
allocate channel ch03 type disk;
sql 'alter system archive log current';
backup database
filesperset 1
tag 'BK_WEEKLY_FULL.${DATE}'
format 'BK_WEEKLY_FULL_%d_%T_%U_%s'
include current controlfile;
sql 'alter system archive log current';
backup archivelog all
filesperset 1
tag 'BK_WEEKLY_ARCH.${DATE}'
format 'BK_WEEKLY_ARCH_%d_%T_%U_%s';
backup spfile
tag 'BK_WEEKLY_SPFILE.${DATE}'
format 'BK_WEEKLY_SPFILE_%d_%T_%U_%s';
backup current controlfile
tag 'BK_WEEKLY_CTRL.${DATE}'
format 'BK_WEEKLY_CTRL_%d_%T_%U_%s';
crosscheck backup;
delete noprompt expired backup;
delete noprompt obsolete;
release channel ch00;
release channel ch01;
release channel ch02;
release channel ch03;
}
list backup summary;
EOF
# ---------------------------------------------------------------
# end
# ---------------------------------------------------------------
echo -e "\n****** Rman Full Backup Finished On `date +'%F %T'` ******\n" >> ${RMAN_LOG_FILE}
exit 0
脚本赋予执行权限:
$ chmod +x rman_orcl_full_weekly.sh
3.3 脚本试运行
oracle用户进入脚本目录执行:
$ cd /u01/app/oracle/rman/src
$ ./rman_orcl_full_weekly.sh
4 归档备份脚本部署
4.1 脚本说明
4.2 编辑脚本
oracle用户进入脚本目录,创建并编辑脚本:
$ cd /u01/app/oracle/rman/src
$ vi rman_orcl_arch_daily.sh
脚本内容如下:
#!/bin/bash
if [ -f $HOME/.bash_profile ];
then
export ORAENV_ASK=NO
. $HOME/.bash_profile
fi
# ---------------------------------------------------------------
# environment variables
# ---------------------------------------------------------------
export ORACLE_HOME=/u01/app/oracle/product/11.2/db_1
export ORACLE_SID=orcl
DATE=`date +'%Y%m%d%H'`
RMANBASE=/u01/app/oracle/rman
SCRIPTDIR=${RMANBASE}/src
LOGDIR=${RMANBASE}/log
CTLDIR=${RMANBASE}/ctl
RMAN_LOG_FILE=${LOGDIR}/${DATE}_${ORACLE_SID}_RMAN_ARCH.log
# ---------------------------------------------------------------
# begin
# ---------------------------------------------------------------
echo 'Run Script' $0 >> ${RMAN_LOG_FILE}
echo -e "\n****** Rman Archive Log Backup started on `date +'%F %T'` ******\n" >> ${RMAN_LOG_FILE}
# ---------------------------------------------------------------
# rman archive log backup
# ---------------------------------------------------------------
rman target / msglog ${RMAN_LOG_FILE} append << EOF
run {
allocate channel ch00 type disk;
allocate channel ch01 type disk;
allocate channel ch02 type disk;
allocate channel ch03 type disk;
sql 'alter system archive log current';
backup archivelog all
filesperset 1
tag 'BK_DAILY_ARCH.${DATE}'
format 'BK_DAILY_ARCH_%d_%T_%U_%s';
crosscheck archivelog all;
delete noprompt archivelog all completed before 'sysdate-1';
backup spfile
tag 'BK_DAILY_SPFILE.${DATE}'
format 'BK_DAILY_SPFILE_%d_%T_%U_%s';
backup current controlfile
tag 'BK_DAILY_CTRL.${DATE}'
format 'BK_DAILY_CTRL_%d_%T_%U_%s';
crosscheck backup;
delete noprompt expired backup;
delete noprompt obsolete;
release channel ch00;
release channel ch01;
release channel ch02;
release channel ch03;
}
list backup summary;
EOF
# ---------------------------------------------------------------
# end
# ---------------------------------------------------------------
echo -e "\n****** Rman Archive Log Backup Finished On `date +'%F %T'` ******\n" >> ${RMAN_LOG_FILE}
exit 0
脚本赋予执行权限:
$ chmod +x rman_orcl_arch_daily.sh
4.3 脚本试运行
oracle用户进入脚本目录执行:
$ cd /u01/app/oracle/rman/src
$ ./rman_orcl_arch_daily.sh
5 备份检查
5.1 备份日志检查
查看日志时,如何判断备份是成功的?
方法是,检查日志文件最后 List of Backups
部分,如果控制文件备份成功了,那么可以确定此次备份就是成功的。
因为在备份脚本中,备份操作都放在run{}
里,只有当前的操作成功了,才可以继续执行后续的操作。而控制文件又是最后备份的,因此,控制文件备份成功,则说明前面的备份也是成功的,反之亦然。
一、查看全备日志
进入日志目录,查看最新的全备日志文件:
$ cd /u01/app/oracle/rman/log
$ ls -lth ^C
$ tail -50 2024092609_orcl_RMAN_FULL.log
二、查看归档备份日志
进入日志目录,查看最新的归档备份日志文件:
$ cd /u01/app/oracle/rman/log
$ ls -lth ^C
$ tail -50 2024092609_orcl_RMAN_ARCH.log
5.2 备份集检查
判断备份完整行的结果也是和看日志的方法一样,检查有没有控制文件备份集。
登录rman工具,命令查看备份集:
$ rman target /
RMAN> list backup summary;
5.3 查看视图
也可以通过数据库自带的视图v$rman_status查看备份情况,比较直观。
oracle用户登录数据库实例:
# su - oracle
$ sqlplus / as sysdba
输入下列sql脚本查看备份情况:
set lines 200
col Type_LV for a15
select *
from (SELECT A.RECID BACKUP_SET,
--A.SET_STAMP,
DECODE(B.INCREMENTAL_LEVEL,
'',
DECODE(BACKUP_TYPE, 'L', 'Archivelog', 'Full'),
1,
'Incr-1级',
0,
'Incr-0级',
B.INCREMENTAL_LEVEL) Type_LV,
B.CONTROLFILE_INCLUDED INCLUDED_CTL,
DECODE(A.STATUS,
'A',
'AVAILABLE',
'D',
'DELETED',
'X',
'EXPIRED',
'ERROR') STATUS,
A.DEVICE_TYPE Device_Type,
to_char(A.START_TIME, 'yyyy-mm-dd hh24:mi:ss') Start_Time,
to_char(A.COMPLETION_TIME, 'yyyy-mm-dd hh24:mi:ss') Completion_Time,
A.ELAPSED_SECONDS Elapsed_Seconds,
A.BYTES / 1024 / 1024 / 1024 "Size(GB)",
A.COMPRESSED,
A.TAG Tag
--,A.HANDLE Path
FROM GV$BACKUP_PIECE A, GV$BACKUP_SET B
WHERE A.SET_STAMP = B.SET_STAMP
AND A.DELETED = 'NO'
ORDER BY A.COMPLETION_TIME DESC)
where rownum <= 20;
6 配置定时任务
通常来说全备一周一次,归档每天一次。如果是核心系统,可以频繁一点,比如全备一周两次,归档每天几次。
本文就按照常规情况制定备份计划:
- 全备:每周一次,周六执行,时间为2点;
- 归档备份:每天一次,周一、二、三、四、五、七执行,时间为2点。
根据以上要求,使用oracle用户配置定时任务:
$ su - oracle
$ crontab -e
添加以下内容:
# --------------------------------------------------------------------
# Rman Backup
# --------------------------------------------------------------------
0 2 * * 6 sh /u01/app/oracle/rman/src/rman_orcl_full_weekly.sh >/dev/null 2>&1
0 2 * * 1-5,7 sh /u01/app/oracle/rman/src/rman_orcl_arch_daily.sh >/dev/null 2>&1
7 结语
至此,一套完善的RMAN备份脚本部署完成,能够应付绝大部分的备份恢复场景,可以确保在发生故障后,备份恢复数据不会丢失。