Oracle 数据库备份自动化详解

Oracle 数据库备份自动化详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

备份自动化保证备份可靠执行[1]:

详细见:Oracle 备份策略与最佳实践Oracle RMAN 备份脚本大全详解


2. 自动化方案

2.1 crontab

- Linux/Unix 定时
- 简单
- 通用

2.2 Scheduler

- DBMS_SCHEDULER
- 数据库内置
- 灵活

2.3 第三方

- Enterprise Manager
- 备份软件
- 脚本

3. crontab

3.1 脚本

#!/bin/bash
# /u01/scripts/rman_backup.sh

export ORACLE_HOME=/u01/app/oracle/product/19c
export ORACLE_SID=prod
export PATH=$ORACLE_HOME/bin:$PATH
export DATE=$(date +%Y%m%d_%H%M%S)
export LOG=/u01/scripts/logs/rman_${DATE}.log

rman target / <<EOF >> $LOG 2>&1
RUN {
  ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
  ALLOCATE CHANNEL ch2 DEVICE TYPE DISK;
  
  CROSSCHECK BACKUP;
  CROSSCHECK ARCHIVELOG ALL;
  DELETE NOPROMPT EXPIRED BACKUP;
  DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
  
  BACKUP INCREMENTAL LEVEL 0 DATABASE
    FORMAT '/u01/backup/inc0_%d_%T_%U.bkp'
    TAG 'inc_level_0'
    PLUS ARCHIVELOG
    FORMAT '/u01/backup/arc_%d_%T_%U.bkp'
    DELETE INPUT;
  
  DELETE NOPROMPT OBSOLETE;
  
  RELEASE CHANNEL ch1;
  RELEASE CHANNEL ch2;
}
EOF

# 邮件通知
if [ $? -ne 0 ]; then
  mail -s "RMAN Backup Failed" dba@example.com < $LOG
fi

3.2 crontab

# 每周日 02:00 全备
0 2 * * 0 /u01/scripts/rman_level0.sh

# 每周三 02:00 增量
0 2 * * 3 /u01/scripts/rman_level1.sh

# 每天 02:00 归档
0 2 * * * /u01/scripts/rman_archive.sh

4. Scheduler

4.1 创建程序

BEGIN
  DBMS_SCHEDULER.CREATE_PROGRAM(
    program_name => 'rman_backup_prog',
    program_type => 'EXECUTABLE',
    program_action => '/u01/scripts/rman_backup.sh',
    enabled => TRUE
  );
END;
/

4.2 创建调度

BEGIN
  DBMS_SCHEDULER.CREATE_SCHEDULE(
    schedule_name => 'daily_2am',
    repeat_interval => 'FREQ=DAILY; BYHOUR=2',
    start_date => SYSTIMESTAMP
  );
END;
/

4.3 创建作业

BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name => 'rman_backup_job',
    program_name => 'rman_backup_prog',
    schedule_name => 'daily_2am',
    enabled => TRUE
  );
END;
/

4.4 Chain

BEGIN
  DBMS_SCHEDULER.CREATE_CHAIN('backup_chain');
  
  DBMS_SCHEDULER.DEFINE_CHAIN_STEP('backup_chain', 'step1', 'rman_backup_prog');
  DBMS_SCHEDULER.DEFINE_CHAIN_STEP('backup_chain', 'step2', 'validate_prog');
  
  DBMS_SCHEDULER.DEFINE_CHAIN_RULE('backup_chain', 'TRUE', 'START step1');
  DBMS_SCHEDULER.DEFINE_CHAIN_RULE('backup_chain', 'step1 COMPLETED', 'START step2');
  DBMS_SCHEDULER.DEFINE_CHAIN_RULE('backup_chain', 'step2 COMPLETED', 'END');
  
  DBMS_SCHEDULER.ENABLE('backup_chain');
END;
/

5. 备份策略脚本

5.1 Level 0(全备)

#!/bin/bash
# rman_level0.sh

rman target / <<EOF
BACKUP INCREMENTAL LEVEL 0 DATABASE 
  FORMAT '/u01/backup/inc0_%d_%T_%U.bkp'
  PLUS ARCHIVELOG DELETE INPUT;
CROSSCHECK BACKUP;
DELETE NOPROMPT OBSOLETE;
EOF

5.2 Level 1(增量)

#!/bin/bash
# rman_level1.sh

rman target / <<EOF
BACKUP INCREMENTAL LEVEL 1 DATABASE 
  FORMAT '/u01/backup/inc1_%d_%T_%U.bkp'
  PLUS ARCHIVELOG DELETE INPUT;
CROSSCHECK BACKUP;
DELETE NOPROMPT OBSOLETE;
EOF

5.3 归档

#!/bin/bash
# rman_archive.sh

rman target / <<EOF
BACKUP ARCHIVELOG ALL 
  FORMAT '/u01/backup/arc_%d_%T_%U.bkp'
  DELETE INPUT;
DELETE NOPROMPT OBSOLETE;
EOF

6. 监控

6.1 日志检查

#!/bin/bash
# check_backup.sh

LOG_DIR=/u01/scripts/logs
TODAY=$(date +%Y%m%d)

grep -i "error\|fail\|ora-" $LOG_DIR/rman_${TODAY}_*.log

6.2 数据库检查

SELECT status, output FROM v$rman_output
WHERE recid = (SELECT MAX(recid) FROM v$rman_output);

SELECT * FROM v$rman_status 
WHERE start_time > SYSDATE - 1
ORDER BY start_time DESC;

6.3 备份状态

SELECT handle, status, start_time, elapsed_seconds
FROM v$backup_piece
WHERE start_time > SYSDATE - 1
ORDER BY start_time DESC;

7. 告警

7.1 邮件

mail -s "RMAN Backup Failed" dba@example.com < $LOG

7.2 SNMP

# 集成监控
send_snmp_trap "RMAN Backup Failed"

7.3 Enterprise Manager

- 内置告警
- 集成

8. 保留策略

8.1 RMAN

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

8.2 日志

# 保留 30 天
find /u01/scripts/logs -name "rman_*.log" -mtime +30 -delete

8.3 备份

# 自动 DELETE OBSOLETE

9. 应用场景

9.1 日常备份

- crontab/Scheduler
- 定时
- 监控

9.2 多数据库

- 集中管理
- 脚本
- Catalog

9.3 异地

- 备份后传输
- 异地保留
- DR

10. 完整方案

10.1 目录结构

/u01/scripts/
├── rman_level0.sh
├── rman_level1.sh
├── rman_archive.sh
├── check_backup.sh
├── notify.sh
└── logs/

/u01/backup/
├── inc0_*.bkp
├── inc1_*.bkp
└── arc_*.bkp

10.2 调度

# crontab
0 2 * * 0 /u01/scripts/rman_level0.sh
0 2 * * 1-6 /u01/scripts/rman_archive.sh
0 2 * * 3 /u01/scripts/rman_level1.sh
0 6 * * * /u01/scripts/check_backup.sh

10.3 监控

- 日志检查
- 数据库状态
- 告警

11. 常见问题

11.1 备份失败

- 空间
- 权限
- 网络
- 数据库状态

11.2 告警未发

- 邮件配置
- 网络问题

11.3 备份未执行

- crontab
- 权限
- 脚本错误

12. 最佳实践

  1. 自动化:crontab/Scheduler
  2. 日志:记录
  3. 监控:状态
  4. 告警:及时
  5. 测试:恢复
  6. 保留:合理
  7. 清理:OBSOLETE
  8. 文档:流程
  9. 演练:故障
  10. 改进:持续

13. 参考资料

[1] Oracle Database Backup and Recovery User’s Guide 19c, “Scheduling Backups” https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/