当前位置: 首页 > news >正文

完美无敌Oracle RMAN备份脚本

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 storedRMAN> 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/bashif [ -f $HOME/.bash_profile ];
thenexport 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}/ctlRMAN_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 databasefilesperset 1tag '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 allfilesperset 1tag 'BK_WEEKLY_ARCH.${DATE}'format '+FRA/orcl/backupset/BK_WEEKLY_ARCH_%d_%T_%U_%s';backup spfiletag 'BK_WEEKLY_SPFILE.${DATE}'format '+FRA/orcl/backupset/BK_WEEKLY_SPFILE_%d_%T_%U_%s';backup current controlfiletag '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

image.png

4 归档备份脚本部署

4.1 脚本说明

4.2 编辑脚本

oracle用户进入脚本目录,创建并编辑脚本:

$ cd /u01/app/oracle/rman/src
$ vi rman_orcl_arch_daily.sh

脚本内容如下:

#!/bin/bashif [ -f $HOME/.bash_profile ];
thenexport 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}/ctlRMAN_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 allfilesperset 1tag '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 spfiletag 'BK_DAILY_SPFILE.${DATE}'format '+FRA/orcl/backupset/BK_DAILY_SPFILE_%d_%T_%U_%s';backup current controlfiletag '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

image.png

5 备份检查

5.1 备份日志检查

查看日志时,如何判断备份是成功的?

方法是,检查日志文件最后 List of Backups 部分,如果控制文件备份成功了,那么可以确定此次备份就是成功的。

因为在备份脚本中,备份操作都放在run{}里,只有当前的操作成功了,才可以继续执行后续的操作。而控制文件又是最后备份的,因此,控制文件备份成功,则说明前面的备份也是成功的,反之亦然。

一、查看全备日志

进入日志目录,查看最新的全备日志文件:

$ cd /u01/app/oracle/rman/log
$ ls -lth ^C
$ tail -50 2024092609_orcl_RMAN_FULL.log

image.png

二、查看归档备份日志

进入日志目录,查看最新的归档备份日志文件:

$ cd /u01/app/oracle/rman/log
$ ls -lth ^C
$ tail -50 2024092609_orcl_RMAN_ARCH.log

image.png

5.2 备份集检查

判断备份完整行的结果也是和看日志的方法一样,检查有没有控制文件备份集。

登录rman工具,命令查看备份集:

$ rman target /
RMAN> list backup summary;

image.png

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.statusfrom v$rman_status a,v$backup_piece bwhere a.stamp = b.stampand a.operation='BACKUP'order by a.end_time;

image.png

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备份脚本部署完成,能够应付绝大部分的备份恢复场景,可以确保在发生故障后,备份恢复数据不会丢失。

相关文章:

  • VBA解除Excel工作表保护
  • spring装配笔记
  • Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式
  • 【经验分享】自动化测试框架实战
  • 什么是IPv6
  • 解决pycharm中matplotlab画图不能显示中文的错误
  • SpirngBoot核心思想之一IOC
  • Mac通过ssh连接工具远程登录服务器( Royal TSX安装及使用)
  • 深度学习:(七)梯度下降法在神经网络中的应用
  • 基于微信小程序的旧衣回收系统
  • Vue.js组件开发
  • 如何将精益思维应用于智能音箱的产品设计?
  • 如何在算家云搭建MVSEP-MDX23(音频分离)
  • 【C++】set详解
  • 如何选择合适的跨境网络专线?
  • hexo+github搭建个人博客
  • 《剑指offer》分解让复杂问题更简单
  • ES2017异步函数现已正式可用
  • JavaScript标准库系列——Math对象和Date对象(二)
  • npx命令介绍
  • PAT A1120
  • vue数据传递--我有特殊的实现技巧
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 原生Ajax
  • Java数据解析之JSON
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (a /b)*c的值
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C#)获取字符编码的类
  • (二十四)Flask之flask-session组件
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (蓝桥杯每日一题)love
  • (十八)SpringBoot之发送QQ邮件
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)fock函数详解
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET Core 发展历程和版本迭代
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • @GlobalLock注解作用与原理解析
  • [ C++ ] 继承
  • [AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性
  • [C# WPF] 如何给控件添加边框(Border)?
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [C\C++]读入优化【技巧】
  • [C++][opencv]基于opencv实现photoshop算法图像剪切
  • [Codeforces] number theory (R1600) Part.11
  • [ComfyUI]Flux+MiniCPM-V强强联手艺术创意,媲美GPT4V级国产多模态视觉大模型