Имејл нотификације кад се tablespace на Oracle DB напуни

Ову скрипту покрећете као било који Oracle корисник на бази али и као oracle корисник на Linux-у, чисто због повлачења варијабли, а најбоље је да је поставите у crontab. Имејл ће вам стићи и ако база није стартована (неплански рестарт сервера, неко је угасио и слично).

#!/bin/sh
source /home/oracle/.bash_profile

############ VARIJABLE ##############
SERVER="MojServer - `ip addr | grep 'state UP' -A2 | grep 'inet ' | tail -n1 | awk '{print $2}' | cut -f1  -d'/'`"
HTML_IZVESTAJ="/tmp/tablespace_izvestaj.html"
DOZVOLJENO_ZAUZECE_U_PROCENTIMA=$1
MAIL_TO="mojmail@example.com"
#####################################

# Ako nema ulaznih parametara postavi 90% i izbaci alert
if [ $# -lt 1 ]
then
	echo "Niste uneli procenat zauzetog prostora kao ulazni parametar. Koristicemo 90%"
	echo "Ako zelite da postavite, recimo alert na 85% zauzetosti tablespacea okinite skriptu ovako:"
	echo "$0 85"
	#----------------------------------------#
	DOZVOLJENO_ZAUZECE_U_PROCENTIMA=90
fi

sqlplus -S -M "HTML ON TABLE 'BORDER="1" CELLSPACING="0"'" '/ as sysdba' <<EOF > ${HTML_IZVESTAJ} 2>/dev/null
set pagesize 32000
set feedback on
select b.tablespace_name Name,
       TO_CHAR(b.TABLESPACE_SIZE,'999999990.9') "Size(MB)",
       TO_CHAR((b.TABLESPACE_SIZE-nvl(a.TOTAL_FREE,0))*100/b.TABLESPACE_SIZE,'99990.9') "Used(%)",
       TO_CHAR(b.TABLESPACE_SIZE-nvl(a.TOTAL_FREE,0),'999999990.9') "Used(MB)",
       TO_CHAR(nvl(a.TOTAL_FREE,0),'999999990.9') "Free(MB)",
       decode(b.AUTOEXTENT,0,'   NO','  YES') "AutoExt"
from
(
SELECT tablespace_name,
       SUM(bytes)/1024/1024 TOTAL_FREE
FROM dba_free_space
GROUP BY tablespace_name
) a,
(
SELECT c.tablespace_name,
       SUM(c.bytes)/1024/1024 TABLESPACE_SIZE,
       (select count(*) from dba_data_files d where d.tablespace_name=c.tablespace_name and d.autoextensible='YES') AUTOEXTENT
FROM dba_data_files c
GROUP BY c.tablespace_name
) b
where b.tablespace_name=a.tablespace_name(+)
  and (b.TABLESPACE_SIZE-nvl(a.TOTAL_FREE,0))*100/b.TABLESPACE_SIZE >= ${DOZVOLJENO_ZAUZECE_U_PROCENTIMA}
order by "Used(%)" desc;
exit
/
EOF

if [ $(grep -ir "no rows selected" ${HTML_IZVESTAJ} | wc -l) -ne 1 ]; then
	echo "Baza prepunjena na ${SERVER}" |
	 mail -s "${SERVER}: Tablespace zauzece >${DOZVOLJENO_ZAUZECE_U_PROCENTIMA}%" -a ${HTML_IZVESTAJ} $MAIL_TO
fi

exit 0

Скрипта се окида овако

# Скрипту окидате са процентом попуњености диска који се сматра критичним
# рецимо за 80% попуњености скрипту окините:
./skripta.sh 80

# Ако не поставите улазни параметар, као критицно сматраће се 90%

Ако желите да ову скрипту покрећете као роот онда покрените овако

#!/bin/sh
source /home/oracle/.bash_profile
 
############ VARIJABLE ##############
SERVER="MojServer - `ip addr | grep 'state UP' -A2 | grep 'inet ' | tail -n1 | awk '{print $2}' | cut -f1  -d'/'`"
HTML_IZVESTAJ="/tmp/tablespace_izvestaj.html"
DOZVOLJENO_ZAUZECE_U_PROCENTIMA=$1
MAIL_TO="mojmail@example.com"
#####################################
 
# Ako nema ulaznih parametara postavi 90% i izbaci alert
if [ $# -lt 1 ]
then
	echo "Niste uneli procenat zauzetog prostora kao ulazni parametar. Koristicemo 90%"
	echo "Ako zelite da postavite, recimo alert na 85% zauzetosti tablespacea okinite skriptu ovako:"
	echo "$0 85"
	#----------------------------------------#
	DOZVOLJENO_ZAUZECE_U_PROCENTIMA=90
fi

touch /tmp/tablespace_izvestaj
chown oracle:oinstall /tmp/tablespace_izvestaj.html

cat <<EOT > /tmp/SQLupit.sql
sqlplus -S -M "HTML ON TABLE 'BORDER="1" CELLSPACING="0"'" '/ as sysdba' <<EOF > ${HTML_IZVESTAJ} 2>/dev/null
set pagesize 32000
set feedback on
select b.tablespace_name Name,
       TO_CHAR(b.TABLESPACE_SIZE,'999999990.9') "Size(MB)",
       TO_CHAR((b.TABLESPACE_SIZE-nvl(a.TOTAL_FREE,0))*100/b.TABLESPACE_SIZE,'99990.9') "Used(%)",
       TO_CHAR(b.TABLESPACE_SIZE-nvl(a.TOTAL_FREE,0),'999999990.9') "Used(MB)",
       TO_CHAR(nvl(a.TOTAL_FREE,0),'999999990.9') "Free(MB)",
       decode(b.AUTOEXTENT,0,'   NO','  YES') "AutoExt"
from
(
SELECT tablespace_name,
       SUM(bytes)/1024/1024 TOTAL_FREE
FROM dba_free_space
GROUP BY tablespace_name
) a,
(
SELECT c.tablespace_name,
       SUM(c.bytes)/1024/1024 TABLESPACE_SIZE,
       (select count(*) from dba_data_files d where d.tablespace_name=c.tablespace_name and d.autoextensible='YES') AUTOEXTENT
FROM dba_data_files c
GROUP BY c.tablespace_name
) b
where b.tablespace_name=a.tablespace_name(+)
  and (b.TABLESPACE_SIZE-nvl(a.TOTAL_FREE,0))*100/b.TABLESPACE_SIZE >= ${DOZVOLJENO_ZAUZECE_U_PROCENTIMA}
order by "Used(%)" desc;
exit
/
EOF
EOT

chmod +x /tmp/SQLupit.sql
chown -R oracle:oinstall /tmp/SQLupit.sql
runuser -l oracle -c '/tmp/SQLupit.sql'
rm -f /tmp/SQLupit.sql
 
if [ $(grep -ir "no rows selected" ${HTML_IZVESTAJ} | wc -l) -ne 1 ]; then
	echo "Baza prepunjena na ${SERVER}" |
	 mail -s "${SERVER}: Tablespace zauzece >${DOZVOLJENO_ZAUZECE_U_PROCENTIMA}%" -a ${HTML_IZVESTAJ} $MAIL_TO
fi
 
exit 0