5月
13
背景
最近需要给一个项目做数据备份,由于数据量较小(一百多兆)就没考虑用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 {} \;
问题顺利解决,当然可能还有其他的解决办法,这里就不展开。
Address: https://zhengjianfeng.cn/?p=351
no comment untill now