오라클 리눅스 5.10
oracle 사용자로서 "tblspc_usage.sh" 스크립트를 수동으로 성공적으로 실행할 수 있습니다. 나에게 보고서를 이메일로 보냈기 때문에 나는 이것을 알고 있습니다.
그러나 cron에서는 전혀 실행되지 않습니다. 로그 파일을 생성하지 않습니다.
[oracle@dub-ImrORA3 scripts]$ crontab -l
# user /bin/sh
SHELL=/bin/sh
# mail to oracle user
MAILTO=oracle
# run at 9:45 AM monday thur friday
45 09 * * 1-5 /home/oracle/scripts/tblspc_usage.sh 2>&1 /home/oracle/scripts/tblspc_usage.log
[oracle@dub-ImrORA3 scripts]$ ls -al tblspc_usage.sh
-rwxrwxr-- 1 oracle oinstall 2013 Jan 20 09:12 tblspc_usage.sh
좋습니다. /var/mail/oracle /home/oracle/scripts/tblspc_usage.sh에서 보낸 이메일은 다음과 같습니다. 15행: sqlplus: 명령을 찾을 수 없습니다. grep: body.log: 해당 파일 또는 디렉터리가 없습니다.
이것은 내 쉘 스크립트입니다.
#!/bin/sh
#
# tblspc_usage.sh
#=======================================
#
# Checks for tablespace usage exceeding 90% and email the details
# does not check undo or temp tablespaces
#=======================================
#
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1 ; export ORACLE_HOME
ORACLE_SID=IMR1 ; export ORACLE_SID
user="system"
pass="letmein" # bogus passwd
sqlplus -S $user/$pass <<EOF
column "TOTAL ALLOC (MB)" format 9,999,990.00
column "TOTAL PHYS ALLOC (MB)" format 9,999,990.00
column "USED (MB)" format 9,999,990.00
column "FREE (MB)" format 9,999,990.00
column "% USED" format 990.00
set echo off
spool body.log
select
a.tablespace_name,
a.bytes_alloc/(1024*1024) "TOTAL ALLOC (MB)",
a.physical_bytes/(1024*1024) "TOTAL PHYS ALLOC (MB)",
nvl(b.tot_used,0)/(1024*1024) "USED (MB)",
(nvl(b.tot_used,0)/a.bytes_alloc)*100 "USED %"
from
(select
tablespace_name,
sum(bytes) physical_bytes,
sum(decode(autoextensible,'NO',bytes,'YES',maxbytes)) bytes_alloc
from
dba_data_files
group by
tablespace_name ) a,
(select
tablespace_name,
sum(bytes) tot_used
from
dba_segments
group by
tablespace_name ) b
where
a.tablespace_name = b.tablespace_name (+)
and
a.tablespace_name not in
(select distinct
tablespace_name
from
dba_temp_files
)
and
a.tablespace_name not like 'UNDO%'
and
( nvl(b.tot_used,0)/a.bytes_alloc)*100 >= 90.00
order by 1;
spool off
exit
EOF
# if the word "TABLESPACE" exists in the spool file
# then at least one tablespace has usage over 90%
if grep -q TABLESPACE "body.log";
then
cat /home/oracle/scripts/body.log | mailx -s "ORA3 - Tablespace(s) 90% Full" \
[email protected]
fi
답변1
메시지가 sqlplus: command not found
답을주었습니다. 환경 변수 ORACLE_HOME을 설정했으므로 ORACLE_HOME을 내보낸 후 스크립트에 다음 줄을 입력하세요.
export PATH=$PATH:$ORACLE_HOME/bin
나는 또한 TNS_ADMIN 내보내기에 대해 미신적입니다.
export TNS_ADMIN=$ORACLE_HOME/network/admin
이것이 꼭 필요한 것인지는 모르겠습니다.
답변2
더 많은 정보로 게시물을 업데이트한 것 같습니다. Bruce가 말한 것처럼 ORACLE_HOME
경로가 누락되었다는 오류가 발생합니다. 다음을 포함하도록 스크립트를 업데이트하세요.
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=IMR1
나는 여전히 당신의 cron에서 이것을 고칠 것입니다:
# run at 9:45 AM monday thur friday
45 09 * * 1-5 /home/oracle/scripts/tblspc_usage.sh >> /home/oracle/scripts/tblspc_usage.log 2>&1
- 로그에 첨부:>>
- stderr를 로그 파일로 리디렉션합니다(이 예에서는 stdout과 동일).2>&1