RMAN 是 Oracle 官方提供的备份恢复工具支持数据库、归档日志、控制文件、SPFILE 的备份与恢复也支持增量备份和备份校验。在生产环境中RMAN 是最常见、也最规范的备份方式之一。这篇文章主要整理三件事如何部署 RMAN 本地备份脚本如何配置定时自动备份如何验证备份是否可用1、什么是 RMANRMANRecovery Manager是 Oracle 官方备份恢复工具主要用于备份数据库备份归档日志备份控制文件和 SPFILE执行增量备份校验备份是否可恢复执行数据库恢复相比手工拷贝数据文件RMAN 更适合生产环境因为它支持热备也更方便后续恢复和管理。2、执行用户说明本文中的命令分为两类执行前请先确认用户身份。1以 root 用户执行主要用于系统层面的操作例如创建目录修改属主调整权限2以 oracle 用户执行主要用于 Oracle 数据库相关操作例如执行rman target /执行sqlplus / as sysdba编写和执行 RMAN 脚本配置 oracle 用户自己的定时任务crontab -e3一句话记住涉及系统目录和权限用 root涉及 Oracle 备份和数据库操作用 oracle。3、先确认数据库已开启归档模式RMAN 热备的前提是数据库处于ARCHIVELOG模式。1检查归档模式以 oracle 用户登录服务器后进入 SQL*Plus 执行archive log list;如果看到类似下面内容说明已开启Database log mode Archive Mode Automatic archival Enabled Archive destination ...2开启归档模式注意开启归档模式需要重启数据库必须在维护窗口操作。以 oracle 用户登录服务器后进入 SQL*Plus 执行-- 可选提前设置归档路径 alter system set log_archive_dest_1LOCATION/archivelog scopeboth; -- 关闭数据库 shutdown immediate; -- 启动到 mount startup mount; -- 开启归档模式 alter database archivelog; -- 打开数据库 alter database open; -- 再次确认 archive log list;3说明开启归档后数据库会不断生成归档日志。所以备份之外还要有归档清理策略否则磁盘空间迟早会被占满。4、归档日志清理脚本生产环境中不建议无条件强删归档日志。更稳妥的做法是只删除已经备份过的归档日志。1创建脚本目录以 root 用户执行mkdir -p /home/oracle/scripts chown -R oracle:oinstall /home/oracle/scripts chmod -R 750 /home/oracle/scripts2创建归档清理脚本由于打开归档模式后会源源不断的产生归档日志所以建议部署一个定期删除归档的任务。 注意以下脚本直接复制粘贴即可使用只需注意修改对应的备份路径即可切换到 oracle 用户后执行cat /home/oracle/scripts/del_arch.sh EOF #!/bin/bash source ~/.bash_profile deltime$(date %Y%m%d%H%M%S) rman target / nocatalog msglog /home/oracle/scripts/del_arch_${deltime}.log RMAN_EOF crosscheck archivelog all; delete noprompt expired archivelog all; delete noprompt archivelog until time sysdate-7 backed up 1 times to disk; # 如需启用空间兜底策略取消下一行注释 # delete noprompt force archivelog until time SYSDATE-14; RMAN_EOF EOF chmod x /home/oracle/scripts/del_arch.sh本脚本默认先清理 7 天前且已备份过 1 次的归档日志。再对 14 天前的归档日志执行强制删除作为防止归档持续堆积、占满磁盘空间的兜底措施。如遇归档持续堆积、磁盘空间紧张可按需启用delete noprompt force archivelog until time SYSDATE-14;作为空间兜底措施。需要注意的是FORCE会忽略归档删除策略因此更适合空间优先场景不建议在未评估恢复需求的情况下长期默认启用。3配置定时任务以 oracle 用户执行crontab -e加入00 02 * * * /home/oracle/scripts/del_arch.sh4说明这段脚本的逻辑是校验归档记录是否存在删除失效记录删除7 天前且至少已备份过 1 次的归档日志再对 14 天前的归档日志执行强制删除评估后再启用这样比直接强删安全得多更适合正式环境。5、本地 RMAN 备份方案常见做法是周日执行 0 级增量备份相当于全备周一到周六执行 1 级增量备份同时备份归档日志记录日志方便排查6、备份前先确认 RMAN 保留策略可以给你一版精简后的最终知识点已经把“生产环境一般保留几天”加进去了适合直接插到文章里。在正式备份前建议先确认 RMAN 保留策略。因为后面脚本里的delete noprompt obsolete;是否会删除旧备份就是按这个策略来判断的。RMAN 的保留策略有两种互斥方式REDUNDANCY和RECOVERY WINDOW。其中RECOVERY WINDOW表示必须保留足够的备份保证数据库能恢复到过去指定天数内的任意时间点。(Oracle Docs)6.1 查看当前保留策略以 oracle 用户执行rman target /进入 RMAN 后执行show retention policy;或者show all;如果看到CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default表示当前采用默认策略保留 1 份可用备份。(Oracle Docs)6.2 修改保留策略如果只是按份数保留可以改成CONFIGURE RETENTION POLICY TO REDUNDANCY 2;如果按恢复天数保留可以改成CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;或者CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;如果想恢复默认值CONFIGURE RETENTION POLICY CLEAR;CLEAR会恢复为默认值不是禁用策略。(Oracle Docs)6.3 为什么有策略也可能不删除因为RMAN 保留策略只负责判断不会自动删除。真正执行删除的是delete noprompt obsolete;也就是说只配置策略不会自动删脚本里加了delete noprompt obsolete;才会按策略删除如果当前没有 obsolete 备份就算加了这句也可能删不掉可以先执行report obsolete;看当前有没有可删除的旧备份。Oracle 文档明确说明RMAN 不会自动删除因恢复窗口或保留策略而变成 obsolete 的备份只有执行DELETE OBSOLETE才会删除。(Oracle Docs)6.4 生产环境一般保留几天正式生产环境里通常更建议使用RECOVERY WINDOW不要长期只用默认的REDUNDANCY 1。实战中常见的做法是普通生产库7 天重要生产库14 天例如CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;或者CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;Oracle 文档用RECOVERY WINDOW OF 7 DAYS作为标准示例在 ODA 文档中磁盘备份的恢复窗口也给出了1 到 14 天的范围所以把 7 天或 14 天作为生产环境常见值是比较稳的写法。(Oracle Docs)6.5 一句话总结RMAN 保留策略负责判断旧备份是否过时delete noprompt obsolete;负责真正删除。如果脚本里没有这句通常不会自动清理旧备份。生产环境中一般更建议使用RECOVERY WINDOW OF 7 DAYS或14 DAYS。7、准备本地备份目录 注意以下脚本直接复制粘贴即可使用只需注意修改对应的备份路径即可以 root 用户执行mkdir -p /backup chown -R oracle:oinstall /backup chmod -R 775 /backup建议提前确认/backup空间是否足够。8、Linux 下 RMAN 备份脚本10 级备份脚本周日执行切换到 oracle 用户后执行cat /home/oracle/scripts/dbbackup_lv0.sh EOF #!/bin/bash source ~/.bash_profile backtime$(date %Y%m%d%H%M%S) rman target / log/backup/level0_backup_${backtime}.log RMAN_EOF run { allocate channel c1 device type disk; allocate channel c2 device type disk; crosscheck backup; crosscheck archivelog all; delete noprompt expired backup; delete noprompt expired archivelog all; sql alter system archive log current; backup incremental level 0 database include current controlfile format /backup/backlv0_%d_%T_%t_%s_%p; backup archivelog all delete input format /backup/arch_%d_%T_%t_%s_%p; delete noprompt obsolete; release channel c1; release channel c2; } RMAN_EOF EOF chmod x /home/oracle/scripts/dbbackup_lv0.sh21 级备份脚本周一到周六执行切换到 oracle 用户后执行cat /home/oracle/scripts/dbbackup_lv1.sh EOF #!/bin/bash source ~/.bash_profile backtime$(date %Y%m%d%H%M%S) rman target / log/backup/level1_backup_${backtime}.log RMAN_EOF run { allocate channel c1 device type disk; allocate channel c2 device type disk; crosscheck backup; crosscheck archivelog all; delete noprompt expired backup; delete noprompt expired archivelog all; sql alter system archive log current; backup incremental level 1 database include current controlfile format /backup/backlv1_%d_%T_%t_%s_%p; backup archivelog all delete input format /backup/arch_%d_%T_%t_%s_%p; delete noprompt obsolete; release channel c1; release channel c2; } RMAN_EOF EOF chmod x /home/oracle/scripts/dbbackup_lv1.sh9、多实例环境补充说明 注意如果有多个实例每个实例对应的脚本需要手动指定实例export ORACLE_SID。如果一台服务器上有多个实例脚本里要明确指定以 oracle 用户执行###示例 export ORACLE_SIDHISCDB1否则脚本可能连到错误的实例。如果是 RAC 环境还要结合节点、共享目录、通道数等实际情况调整。10、配置定时任务脚本创建完之后记得给脚本赋予可执行权限cd /home/oracle/scripts chmod x dbbackup_lv0.sh chmod x dbbackup_lv1.sh ls -lrthOracle RMAN 本地备份脚本一般是与定时任务crontab配合使用选择合适的时间段进行备份很重要建议尽量挑选业务空闲或者负载较低的时间段进行备份。假设凌晨是业务空闲时段部署定时任务以 oracle 用户执行crontab -e加入00 00 * * 0 /home/oracle/scripts/dbbackup_lv0.sh 00 00 * * 1-6 /home/oracle/scripts/dbbackup_lv1.sh含义周日 00:00 执行 0 级备份周一到周六 00:00 执行 1 级备份建议放在业务低峰期执行。11、如何验证备份是否成功脚本写完不算完至少要确认备份真的生成了。1手工执行一次 0 级备份以 oracle 用户执行sh /home/oracle/scripts/dbbackup_lv0.sh后台执行也可以nohup sh /home/oracle/scripts/dbbackup_lv0.sh /dev/null 21 2通过 RMAN 查看备份记录以 oracle 用户执行rman target /执行list backup;这一步可以查看是否生成备份集数据文件是否已备份控制文件、SPFILE 是否已备份归档日志是否已备份3通过视图查看备份任务明细以 oracle 用户登录服务器后进入 SQL*Plus 执行set linesize 200 set pagesize 1000 col status for a12 col input_type for a20 col input_bytes_display for a12 col output_bytes_display for a12 col time_taken_display for a12 select input_type, status, to_char(start_time,yyyy-mm-dd hh24:mi:ss) as start_time, to_char(end_time,yyyy-mm-dd hh24:mi:ss) as end_time, input_bytes_display, output_bytes_display, time_taken_display, compression_ratio from v$rman_backup_job_details order by start_time desc;重点看STATUS是否为COMPLETED开始和结束时间是否正常备份大小是否符合预期12、如何验证备份是否可用备份成功不等于恢复一定没问题。RMAN 也提供了备份集的验证功能通过简单的几行命令即可验证备份是否可用可以用 RMAN 做基础校验。1连接 RMAN以 oracle 用户执行rman target /2执行验证命令在 RMAN 提示符下执行restore validate spfile; restore validate controlfile; restore validate database;这几条命令的作用是验证备份是否可读验证 RMAN 是否能找到对应备份检查备份片是否有损坏3说明这几条命令不会真的把数据库、SPFILE、CONTROLFILE 恢复到当前生产环境但会读取备份片所以会有一定 I/O 开销。尤其是restore validate database;这条相对更重建议放在业务低峰期执行。一句话理解restore validate是恢复前校验不是真恢复。真正要完全确认备份可恢复还是要做一次异机恢复测试。