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. 最佳实践
- 自动化:crontab/Scheduler
- 日志:记录
- 监控:状态
- 告警:及时
- 测试:恢复
- 保留:合理
- 清理:OBSOLETE
- 文档:流程
- 演练:故障
- 改进:持续
13. 参考资料
[1] Oracle Database Backup and Recovery User’s Guide 19c, “Scheduling Backups” https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/