expdb在crontab中的问题

背景

最近需要给一个项目做数据备份,由于数据量较小(一百多兆)就没考虑用rman之类的工具进行备份,直接用数据泵(expdp)进行导出,然后将数据本地存储。脚本写好后,通过crontab进行定时调用即可,问题就出在crontab上,手动执行脚本是可以正常运行,通过crontab就不行。

expdb

同步脚本逻辑比较简单,脚本如下:

#!/bin/bash
file=DB_$(date +%Y%m%d).dmp
echo "dump file ==>"$file
expdp system/password schemas=FND,FUSION directory=DB_DUMP_DIR dumpfile=$file
cd /u01/dump
zip $file.zip $file
find /u01/dump/ -name "*.zip" -mtime +5 -exec rm {} \;
find /u01/dump/ -name "*.dmp" -exec rm {} \;
scp $file.zip oracle@172.10.10.1:/home/oracle/db_db_backup
ssh oracle@172.10.10.1 find /home/oracle/db_db_backup -name "*.zip" -mtime +30 -exec rm {} \;
  • expdb将数据导出
  • 压缩数据(数据库文件压缩率很高)
  • 删除五天以内的数据
  • 删除dump数据
  • 将数据文件拷贝至远程服务器,做异地容灾(需要提前配好免密互信)
  • 删除远程服务器超过30天的备份(同样需要提前配好免密互信)

脚本较为简单,本地执行正常,配了crontab如下

0 1 * * * /home/oracle/scripts/expdb.sh

测试了几下,始终未执行成功,为了排查问题,修改crontab如下

0 1 * * * /home/oracle/scripts/expdb.sh >/u01/dump/dump.log

dump的日志如下:

dump file ==>DB_20200513.dmp
zip error: Nothing to do! (DB_20200513.dmp.zip)

说明,脚本是有执行的,但是expdb没有执行,修改了下脚本,打印出一些环境信息

#!/bin/bash
who=$(who)
path=$PATH
echo "who===>"$who
echo "path==>"$path
echo "ORACLE_HOME==>"$ORACLE_HOME
file=DB_$(date +%Y%m%d).dmp
echo "dump file ==>"$file
expdp system/password schemas=FND,FUSION directory=DB_DUMP_DIR dumpfile=$file
cd /u01/dump
zip $file.zip $file
find /u01/dump/ -name "*.zip" -mtime +5 -exec rm {} \;
find /u01/dump/ -name "*.dmp" -exec rm {} \;
scp $file.zip oracle@172.10.10.1:/home/oracle/db_db_backup
ssh oracle@172.10.10.1 find /home/oracle/db_db_backup -name "*.zip" -mtime +30 -exec rm {} \;

日志如下:

who===>root pts/4 2020-05-13 23:15 (222.77.103.213) oracle pts/5 2020-03-26 12:45 (:1) oracle pts/2 2020-03-11 14:19 (:1) ora
cle pts/14 2020-03-16 18:23 (:1) oracle pts/3 2020-03-16 18:26 (:1) oracle pts/0 2020-03-27 14:26 (:1) oracle pts/1 2020-03-2
7 14:28 (:1) oracle pts/6 2020-04-02 18:09 (:1) oracle pts/7 2020-04-03 10:59 (:1)
path==>/usr/bin:/bin
ORACLE_HOME==>
dump file ==>DB_20200513.dmp
zip error: Nothing to do! (DB_20200513.dmp.zip)

原来是用root用户执行的,并且oracle home目录为空,通过ps也可以看到确实是用root执行

[oracle@definesys dump]$ ps -ef|grep cron
root      5286     1  0 Feb03 ?        00:00:16 /usr/sbin/crond -n

解决

修改了下脚本,增加了环境变量

#!/bin/bash
export ORACLE_SID=definesysdb
export ORACLE_BASE=/u01/oracle/11.2.0.4
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
file=DB_$(date +%Y%m%d).dmp
echo "dump file ==>"$file
expdp system/password schemas=FND,FUSION directory=DB_DUMP_DIR dumpfile=$file
cd /u01/dump
zip $file.zip $file
find /u01/dump/ -name "*.zip" -mtime +5 -exec rm {} \;
find /u01/dump/ -name "*.dmp" -exec rm {} \;
scp $file.zip oracle@172.10.10.1:/home/oracle/db_db_backup
ssh oracle@172.10.10.1 find /home/oracle/db_db_backup -name "*.zip" -mtime +30 -exec rm {} \;

问题顺利解决,当然可能还有其他的解决办法,这里就不展开。

Trackback

no comment untill now

Add your comment now