完美无敌Oracle RMAN备份脚本

  金牌会员 | 2024-11-17 06:51:06 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 805|帖子 805|积分 2415

1 阐明

上一篇文章:Oracle逻辑备份脚本,介绍了怎样部署Oracle数据库的逻辑备份脚本,在数据迁移场景下十分好用,但是作为备份来说有点牵强。仅仅有逻辑备份时,当故障发生后,逻辑备份恢复只能恢复到某一时候,无法做到完全恢复,会发生数据丢失。
RMAN是Oracle数据库软件自带的备份/恢复工具,它可以或许备份整个数据库或数据库部件,如表空间、数据文件、控制文件、归档文件以及Spfile参数文件。通过RMAN的方式无论是要备份照旧要恢复,都必须先启动实例并加载数据库。
本篇文章重要介绍怎样去部署一份RMAN热备脚本,采用全备+归档备份的方式:


  • 全备:每周一次;
  • 归档备份:每天一次。
为什么不采用全备+增倍?重要是由于归档备份恢复起来比较机动,可以恢复到恣意时间点。并且归档日记备份不依赖于前置的备份,如许备份链的某一部分破坏不会影响到其他备份的有效性。
2 准备工作

准备工作重要包罗脚本路径创建和RMAN设置。
2.1 脚本路径创建

脚本部署在ORCLE_BASE下,使用oracle用户,创建脚本目录:
  1. $ cd /u01/app/oracle/
  2. $ mkdir -p rman/src
  3. $ mkdir -p rman/log
  4. $ mkdir -p rman/ctl
  5. $ tree rman/
  6. rman/
  7. |-- ctl
  8. |-- log
  9. `-- src
  10. 3 directories, 0 files
复制代码
src目任命于存放脚本,log目任命于存放备份日记,ctl目任命于存放自动备份的控制文件。
2.2 RMAN设置保存计谋

保存计谋有两种类型:recovery window(恢复窗口)和redundancy(冗余)。
通常使用冗余保存计谋,保存2份备份。
  1. RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
  2. new RMAN configuration parameters:
  3. CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
  4. new RMAN configuration parameters are successfully stored
  5. RMAN> show RETENTION POLICY;
  6. RMAN configuration parameters for database with db_unique_name ORCL are:
  7. CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
复制代码
3 全备脚本部署

3.1 脚本阐明

3.2 编辑脚本

oracle用户进入脚本目录,创建并编辑脚本:
  1. $ cd /u01/app/oracle/rman/src
  2. $ vi rman_orcl_full_weekly.sh
复制代码
脚本内容如下:
  1. #!/bin/bash
  2. if [ -f $HOME/.bash_profile ];
  3. then
  4.     export ORAENV_ASK=NO
  5.     . $HOME/.bash_profile
  6. fi
  7. # ---------------------------------------------------------------
  8. # environment variables
  9. # ---------------------------------------------------------------
  10. export ORACLE_HOME=/u01/app/oracle/product/11.2/db_1
  11. export ORACLE_SID=orcl
  12. DATE=`date +'%Y%m%d%H'`
  13. RMANBASE=/u01/app/oracle/rman
  14. SCRIPTDIR=${RMANBASE}/src
  15. LOGDIR=${RMANBASE}/log
  16. CTLDIR=${RMANBASE}/ctl
  17. RMAN_LOG_FILE=${LOGDIR}/${DATE}_${ORACLE_SID}_RMAN_FULL.log
  18. # ---------------------------------------------------------------
  19. # begin
  20. # ---------------------------------------------------------------
  21. echo 'Run Script' $0 >> ${RMAN_LOG_FILE}
  22. echo -e "\n****** Rman Full Backup started on `date +'%F %T'` ******\n" >> ${RMAN_LOG_FILE}
  23. # ---------------------------------------------------------------
  24. # rman full backup
  25. # ---------------------------------------------------------------
  26. rman target / msglog ${RMAN_LOG_FILE} append << EOF
  27. run {
  28. allocate channel ch00 type disk;
  29. allocate channel ch01 type disk;
  30. allocate channel ch02 type disk;
  31. allocate channel ch03 type disk;
  32. sql 'alter system archive log current';
  33. backup database
  34. filesperset 1
  35. tag 'BK_WEEKLY_FULL.${DATE}'
  36. format '+FRA/orcl/backupset/BK_WEEKLY_FULL_%d_%T_%U_%s'
  37. include current controlfile;
  38. sql 'alter system archive log current';
  39. backup archivelog all
  40. filesperset 1
  41. tag 'BK_WEEKLY_ARCH.${DATE}'
  42. format '+FRA/orcl/backupset/BK_WEEKLY_ARCH_%d_%T_%U_%s';
  43. backup spfile
  44. tag 'BK_WEEKLY_SPFILE.${DATE}'
  45. format '+FRA/orcl/backupset/BK_WEEKLY_SPFILE_%d_%T_%U_%s';
  46. backup current controlfile
  47. tag 'BK_WEEKLY_CTRL.${DATE}'
  48. format '+FRA/orcl/backupset/BK_WEEKLY_CTRL_%d_%T_%U_%s';
  49. crosscheck backup;
  50. delete noprompt expired backup;
  51. delete noprompt obsolete;
  52. release channel ch00;
  53. release channel ch01;
  54. release channel ch02;
  55. release channel ch03;
  56. }
  57. list backup summary;
  58. EOF
  59. # ---------------------------------------------------------------
  60. # end
  61. # ---------------------------------------------------------------
  62. echo -e "\n****** Rman Full Backup Finished On `date +'%F %T'` ******\n" >> ${RMAN_LOG_FILE}
  63. exit 0
复制代码
脚本赋予执行权限
  1. $ chmod +x rman_orcl_full_weekly.sh
复制代码
3.3 脚本试运行

oracle用户进入脚本目录执行:
  1. $ cd /u01/app/oracle/rman/src
  2. $ ./rman_orcl_full_weekly.sh
复制代码

4 归档备份脚本部署

4.1 脚本阐明

4.2 编辑脚本

oracle用户进入脚本目录,创建并编辑脚本:
  1. $ cd /u01/app/oracle/rman/src
  2. $ vi rman_orcl_arch_daily.sh
复制代码
脚本内容如下:
  1. #!/bin/bash
  2. if [ -f $HOME/.bash_profile ];
  3. then
  4.     export ORAENV_ASK=NO
  5.     . $HOME/.bash_profile
  6. fi
  7. # ---------------------------------------------------------------
  8. # environment variables
  9. # ---------------------------------------------------------------
  10. export ORACLE_HOME=/u01/app/oracle/product/11.2/db_1
  11. export ORACLE_SID=orcl
  12. DATE=`date +'%Y%m%d%H'`
  13. RMANBASE=/u01/app/oracle/rman
  14. SCRIPTDIR=${RMANBASE}/src
  15. LOGDIR=${RMANBASE}/log
  16. CTLDIR=${RMANBASE}/ctl
  17. RMAN_LOG_FILE=${LOGDIR}/${DATE}_${ORACLE_SID}_RMAN_ARCH.log
  18. # ---------------------------------------------------------------
  19. # begin
  20. # ---------------------------------------------------------------
  21. echo 'Run Script' $0 >> ${RMAN_LOG_FILE}
  22. echo -e "\n****** Rman Archive Log Backup started on `date +'%F %T'` ******\n" >> ${RMAN_LOG_FILE}
  23. # ---------------------------------------------------------------
  24. # rman archive log backup
  25. # ---------------------------------------------------------------
  26. rman target / msglog ${RMAN_LOG_FILE} append << EOF
  27. run {
  28. allocate channel ch00 type disk;
  29. allocate channel ch01 type disk;
  30. allocate channel ch02 type disk;
  31. allocate channel ch03 type disk;
  32. sql 'alter system archive log current';
  33. backup archivelog all
  34. filesperset 1
  35. tag 'BK_DAILY_ARCH.${DATE}'
  36. format '+FRA/orcl/backupset/BK_DAILY_ARCH_%d_%T_%U_%s';
  37. crosscheck archivelog all;
  38. delete noprompt archivelog all completed before 'sysdate-1';
  39. backup spfile
  40. tag 'BK_DAILY_SPFILE.${DATE}'
  41. format '+FRA/orcl/backupset/BK_DAILY_SPFILE_%d_%T_%U_%s';
  42. backup current controlfile
  43. tag 'BK_DAILY_CTRL.${DATE}'
  44. format '+FRA/orcl/backupset/BK_DAILY_CTRL_%d_%T_%U_%s';
  45. crosscheck backup;
  46. delete noprompt expired backup;
  47. delete noprompt obsolete;
  48. release channel ch00;
  49. release channel ch01;
  50. release channel ch02;
  51. release channel ch03;
  52. }
  53. list backup summary;
  54. EOF
  55. # ---------------------------------------------------------------
  56. # end
  57. # ---------------------------------------------------------------
  58. echo -e "\n****** Rman Archive Log Backup Finished On `date +'%F %T'` ******\n" >> ${RMAN_LOG_FILE}
  59. exit 0
复制代码
脚本赋予执行权限:
  1. $ chmod +x rman_orcl_arch_daily.sh
复制代码
4.3 脚本试运行

oracle用户进入脚本目录执行:
  1. $ cd /u01/app/oracle/rman/src
  2. $ ./rman_orcl_arch_daily.sh
复制代码

5 备份检查

5.1 备份日记检查

检察日记时,怎样判断备份是成功的?
方法是,检查日记文件末了 List of Backups 部分,如果控制文件备份成功了,那么可以确定此次备份就是成功的。
因为在备份脚本中,备份操作都放在run{}里,只有当前的操作成功了,才可以继承执行后续的操作。而控制文件又是末了备份的,因此,控制文件备份成功,则阐明前面的备份也是成功的,反之亦然。
一、检察全备日记
进入日记目录,检察最新的全备日记文件:
  1. $ cd /u01/app/oracle/rman/log
  2. $ ls -lth ^C
  3. $ tail -50 2024092609_orcl_RMAN_FULL.log
复制代码

二、检察归档备份日记
进入日记目录,检察最新的归档备份日记文件:
  1. $ cd /u01/app/oracle/rman/log
  2. $ ls -lth ^C
  3. $ tail -50 2024092609_orcl_RMAN_ARCH.log
复制代码

5.2 备份集检查

判断备份完整行的效果也是和看日记的方法一样,检查有没有控制文件备份集。
登录rman工具,命令检察备份集:
  1. $ rman target /
  2. RMAN> list backup summary;
复制代码

5.3 检察视图

也可以通过数据库自带的视图v$rman_status检察备份情况,比较直观。
oracle用户登录数据库实例:
  1. # su - oracle
  2. $ sqlplus / as sysdba
复制代码
输入下列sql脚本检察备份情况:
  1. SQL>
  2. select distinct a.recid,a.object_type,round(a.mbytes_processed/1024) size_gb,b.tag,a.start_time,a.end_time,a.status
  3.   from v$rman_status a,v$backup_piece b
  4. where a.stamp = b.stamp
  5.    and a.operation='BACKUP'
  6. order by a.end_time;
复制代码

6 设置定时任务

通常来说全备一周一次,归档每天一次。如果是核心系统,可以频繁一点,比如全备一周两次,归档每天几次。
本文就按照常规情况订定备份计划:


  • 全备:每周一次,周六执行,时间为2点;
  • 归档备份:每天一次,周一、二、三、四、五、七执行,时间为2点。
根据以上要求,使用oracle用户设置定时任务:
  1. $ su - oracle
  2. $ crontab -e
复制代码
添加以下内容:
  1. # --------------------------------------------------------------------
  2. # Rman Backup
  3. # --------------------------------------------------------------------
  4. 0 2 * * 6     sh /u01/app/oracle/rman/src/rman_orcl_full_weekly.sh >/dev/null 2>&1
  5. 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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表