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 '+FRA/orcl/backupset/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 '+FRA/orcl/backupset/BK_WEEKLY_ARCH_%d_%T_%U_%s';
- backup spfile
- tag 'BK_WEEKLY_SPFILE.${DATE}'
- format '+FRA/orcl/backupset/BK_WEEKLY_SPFILE_%d_%T_%U_%s';
- backup current controlfile
- tag 'BK_WEEKLY_CTRL.${DATE}'
- format '+FRA/orcl/backupset/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 '+FRA/orcl/backupset/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 '+FRA/orcl/backupset/BK_DAILY_SPFILE_%d_%T_%U_%s';
- backup current controlfile
- tag 'BK_DAILY_CTRL.${DATE}'
- format '+FRA/orcl/backupset/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脚本检察备份情况:
- SQL>
- select distinct a.recid,a.object_type,round(a.mbytes_processed/1024) size_gb,b.tag,a.start_time,a.end_time,a.status
- from v$rman_status a,v$backup_piece b
- where a.stamp = b.stamp
- and a.operation='BACKUP'
- order by a.end_time;
复制代码
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备份脚本部署完成,可以或许应付绝大部分的备份恢复场景,可以确保在发生故障后,备份恢复数据不会丢失。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |