如何编写远程备份Oracle 19c数据库的脚本并解决执行报错问题
解决Oracle 19c跨服务器RMAN自动备份问题
问题根源
你当前的脚本错误在于:执行rman target ...后进入了RMAN交互模式,后续的BACKUP命令被bash解释器执行,而bash不识别RMAN命令,因此报错“BACKUP command not found”。必须让RMAN以非交互式方式执行指定命令。
修正后的备份脚本
创建backup_script.sh,内容如下:
#!/bin/bash # 显式设置Oracle环境变量(crontab默认不加载用户bashrc) export ORACLE_HOME=/home/oracle/oracle_database_client export PATH=$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH # 定义备份和日志目录,不存在则自动创建 BACKUP_DIR="/home/oracle/backup_oracle_process/backup_files" LOG_DIR="/home/oracle/backup_oracle_process/logs" mkdir -p $BACKUP_DIR $LOG_DIR # 生成带时间戳的日志文件名 LOG_FILE="${LOG_DIR}/oracle_backup_$(date +%Y%m%d_%H%M%S).log" # 非交互式执行RMAN备份命令 rman target sys/******@//x.x.x.a:1521/ORCL << EOF RUN { BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG FORMAT '${BACKUP_DIR}/%U'; # 可选:备份完成后删除已备份的归档日志,节省源服务器空间 DELETE ALL INPUT; } EXIT; EOF # 记录备份执行状态 if [ $? -eq 0 ]; then echo "$(date +%Y-%m-%d %H:%M:%S) 备份成功" >> $LOG_FILE else echo "$(date +%Y-%m-%d %H:%M:%S) 备份失败" >> $LOG_FILE exit 1 fi
脚本优化说明
- 使用
<< EOF的here-doc语法,将RMAN命令作为输入直接传给rman进程,避免进入交互模式。 - 显式配置所有必要环境变量,确保crontab执行时环境正确(crontab默认不加载用户的
~/.bashrc)。 - 自动创建备份和日志目录,避免因目录缺失导致备份失败。
- 添加详细日志记录,方便后续排查备份状态。
- 可选的
DELETE ALL INPUT命令,可根据需求决定是否删除已备份的归档日志。
配置crontab实现每周自动备份
- 编辑当前用户的crontab规则:
crontab -e
- 添加每周日凌晨2点执行备份的规则(可根据需求调整时间):
0 2 * * 0 /home/oracle/backup_script.sh >> /home/oracle/backup_oracle_process/crontab_backup.log 2>&1
- 时间格式说明:
分 时 日 月 周,0 2 * * 0表示每周日凌晨2点执行。 >> ... 2>&1将crontab的执行输出和错误信息追加到日志文件,方便排查问题。
验证步骤
- 手动执行脚本,检查是否生成备份文件和日志:
./backup_script.sh
- 查看日志文件确认备份状态:
cat /home/oracle/backup_oracle_process/logs/oracle_backup_*.log
- 检查备份目录是否有生成的备份文件:
ls -l /home/oracle/backup_oracle_process/backup_files/
内容的提问来源于stack exchange,提问作者M_Gh
相关产品推荐
相关产品推荐

