Имејл нотификације кад се 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