使用CRONTAB呼叫shell指令碼執行EXP
透過SHELL指令碼執行全庫匯出是很常見的。但是如果將這個SHELL指令碼透過CRONTAB定時呼叫,則需要修改很多地方。這裡簡單記錄一下。
由於對UNIX系統不是很熟悉。將一個已經可以執行的csh指令碼,改成一個可以在CRONTAB中呼叫的bash指令碼,花了我足足大半天的時間。又用了不少時間將整個CRONTAB環境從測試的LINUX環境移植到UNIX環境。
下面是根據Tom的expert one-on-one oracle上程式碼稍加修改後的初始版本:
#!/bin/csh -f
# Set this to the userid you want to perform the export as I always use OPS$ (os
# authenticated) accounts for all jobs that will be run in the background. In that
# way a password never appears in a script file or in the ps output.
setenv UID system/systempassword@bjdb01
# This is the name of the export file. SPLIT will use this to name the pieces of
# the compressed DMP file.
setenv FN bjdb01_full_`date +%y%m%d`.dmp
# This is the name of the named pipe we will use.
setenv PIPE /tmp/exp_tmp.dmp
# Here I limit the size of the compressed files to 500 MG each. Anything less
# than 2 GB would be fine.
# This is what we are going to export. By default I am doing a full database
# export.
setenv EXPORT_WHAT "full=y COMPRESS=n"
# This is where the export will go to.
cd /data/exp
# Clear out the last export.
#rm expbjdb01.log export.test exp.*.dmp* $PIPE
# Create the named pipe.
mknod $PIPE p
# Write the datetime to the log file.
date > expbjdb01.log
# Start a gzip process in the background. Gzip will read the pipe and put the
# compressed data out to split. Split will then create 500 MB files out of the
# input data adding .aa, .ab, .ac, .ad, ... file extensions to the template name
# found in $FN.
(gzip < $PIPE) > $FN.gz &
# Now, start up export. The Gzip above is waiting for export to start filling the
# pipe up.
exp userid=$UID buffer=204800000 file=$PIPE $EXPORT_WHAT >>& expbjdb01.log
date >> expbjdb01.log
# Now the export is done, this is how to IMP. We need to sort the filenames and
# then simply cat their contents into gunzip. We write that into the pipe. IMP
# will then read that pipe and write what it would do to stderr. The >>& in the
# csh redirects both stdout and stderr for us.
#date > export.test
#gunzip $FN.gz > $PIPE &
#imp userid=$UID file=$PIPE show=y full=y >>& export.test
#date >> export.test
# Clean up the pipe, we don't need it anymore.
rm -f $PIPE
這個是我修改以後可以被CRONTAB呼叫的指令碼:
ORACLE_HOME=/u1/oracle/product/9.2.0;
export ORACLE_HOME;
PATH=$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin:$PATH;
export PATH;
NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK';
export NLS_LANG;
USERID=system/systempassword@bjdb01;
export USERID;
FN=/data/exp/bjdb01_full_`date +%y%m%d`.dmp;
export FN;
PIPE=/tmp/exp_tmp.dmp;
export PIPE;
EXPORT_WHAT="full=y COMPRESS=n";
export EXPORT_WHAT;
cd /data/exp;
rm expbjdb01.log;
/usr/sbin/mknod $PIPE p;
date > expbjdb01.log;
(gzip < $PIPE) > $FN.gz &
exp userid=$USERID buffer=204800000 file=$PIPE $EXPORT_WHAT >> expbjdb01.log 2>> expbjdb01.log;
date >> expbjdb01.log;
rm -f $PIPE
~
主要注意兩個地方:
透過CRONTAB呼叫和當前Oracle使用者呼叫並不一樣,透過CRONTAB呼叫不會包含當前使用者中的各種環境變數的設定。因此必須開始的就設定好ORACLE_HOME等環境變數;
在每條命令後都加上分號,而這在非CRONTAB呼叫的指令碼中是不需要的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28389881/viewspace-1282547/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 執行shell指令碼指令碼
- shell指令碼放到crontab裡就執行不成功的問題指令碼
- crontab異常:shell下可以執行命令,執行crontab卻報錯
- 使用Mac自定義快捷鍵執行shell指令碼Mac指令碼
- 伺服器部署python指令碼並使用crontab定時執行伺服器Python指令碼
- Mac 終端執行 shell 指令碼Mac指令碼
- Linux shell:執行shell指令碼的幾種方式Linux指令碼
- [20210330]bash使用source or ..呼叫shell指令碼注意txt指令碼
- 在linux上定期執行命令、指令碼(cron,crontab,anacron)Linux指令碼
- linux crontab下的指令碼不執行怎麼辦Linux指令碼
- shell指令碼linux命令連續執行指令碼Linux
- 如何用crontab每隔1分鐘執行一個命令列指令碼,shell設定時任務命令列指令碼
- shell指令碼執行錯誤 $‘\r‘:command not found指令碼
- 執行 shell 指令碼 \r 問題解決指令碼
- 如何呼叫python中的shell指令碼?Python指令碼
- [20220414]toad呼叫執行指令碼問題.txt指令碼
- [20231023]生成bbed的執行指令碼(bash shell).txt指令碼
- php執行shell指令碼需要sudo許可權PHP指令碼
- shell指令碼命令 執行python檔案&python命令列執行python程式碼指令碼Python命令列
- Linux Crontab Shell指令碼實現秒級定時任務Linux指令碼
- 使用Python和Java呼叫Shell指令碼時的死鎖陷阱PythonJava指令碼
- crontab+shell 實現每秒執行一個任務
- Shell指令碼入門:編寫格式與執行方式指令碼
- 如何讓shell指令碼變成可執行檔案指令碼
- Linux中執行Shell指令碼的方式(三種方法)Linux指令碼
- shell指令碼的三種執行方式和區別指令碼
- shell 檢測 pm2 是否執行 frp 相關程序 沒有執行執行 crontabFRP
- go 呼叫 shell 指令碼 如何傳遞引數Go指令碼
- WordPress 3.5.1遠端程式碼執行EXP
- 使用shell指令碼對Nginx日誌進行切分指令碼Nginx
- Shell多執行緒備份資料庫的指令碼執行緒資料庫指令碼
- Shell指令碼執行有哪些方式?linux系統學習指令碼Linux
- 在Linux中,如何使用shell指令碼判斷某個服務是否正在執行?Linux指令碼
- Shell指令碼介紹與使用指令碼
- Linux Shell獲取正在執行指令碼的絕對路徑Linux指令碼
- 詳解shell中source、sh、bash、./執行指令碼的區別指令碼
- shell指令碼指令碼
- .net 程式通過 crontab 無法啟動,手動執行指令碼可以啟動指令碼
- shell 命令在終端可以執行成功,為什麼放在 groovy 指令碼中不執行?指令碼