아래는 장애발생시 오라클의 alert 로그에 “ORA-“와 같이 쌓이는것을 착안하여 만든 프로그램이다.
#! /bin/ksh
export ORACLE_HOME=/rtd_orahome
export ORACLE_SID=XXXXX
export ORACLE_OWNER=AAAAA
export ORAWEB_HOME=$ORACLE_HOME/ows/3.0
export ORAWEB_SITE=web
export LANG=korean
export NLS_LANG=American_America.KO16KSC5601
export ORA_NLS32=$ORACLE_HOME/ocommon/nls/admin/data
export PATH=$PATH:.:/opt/SUNWspro/bin:/usr/ccs/bin:/usr/bin:/usr/ucb:/etc:/usr/sbin:/usr/openwin/bin:$ORACLE_HOME/bin:$ORAWEB_HOME/bin:.
export LD_LIBRARY_PATH=/opt/SUNWspro/lib:/usr/lib:/usr/ccs/lib:/usr/openwin/lib:/usr/ucblib:$ORACLE_HOME/lib
SMS_CLIENT=/rtd_home/monitor/bin/SmsSender
CONFIG_FILE=/rtd_home/monitor/cfg/config.ini
HOST_NAME=`hostname`
# 로그의 라인수 저장파일
LOG_CNT=/rtd_home/monitor/temp/alertlog_line_cnt.txt
touch $LOG_CNT
# 이전에 기록한 라인수를 읽는다
cat $LOG_CNT | read intPrevLineCnt
# 전체라인수 카운트
intTotLineCnt=$(cat /rtd_orahome/admin/RTDORA7/bdump/alert_RTDORA7.log | wc -l)
# Cat할 라인수 지정
let LoopCnt=intTotLineCnt-intPrevLineCnt
cat /rtd_orahome/admin/RTDORA7/bdump/alert_RTDORA7.log | tail -$LoopCnt | grep ORA- | while read ORAMSG
do
grep -w "ORACLE_NOTIFY_PHONE_NUMBER" $CONFIG_FILE | while read TEMP NOTIFY_PHONE_NUMBER
do
$SMS_CLIENT 'Moramcnt' $NOTIFY_PHONE_NUMBER 021234567 "$HOST_NAME $ORAMSG"
sleep 1
done
print `date '+%Y-%m-%d %T'` "$HOST_NAME $ORAMSG" >> /rtd_home/monitor/logs/check_alertlog_err.log
done
rm -f $LOG_CNT
print $intTotLineCnt >> $LOG_CNT
exit 0
위의 쉘 프로그램은 Config.ini와 SMSSender라는 프로그램이 필요하다.
Config.ini의 파일의 내용은 다음과 같이 sms를 수신받을 대상이 기록되어 있다.
[ORACLE]
ORACLE_NOTIFY_PHONE_NUMBER 0101234567
또한 SMSSender는 오라클 Pro*C로 간단한게 구현되어 있다.
#include
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define CONSOLE_MODE 0
int Connection( char *, char *, char *);
int Commit( void);
int RollBack( void);
int Trim(char *);
int SendSMS( char *, char *, char *, char *);
int Connection( char *szUserId, char *szPasswd, char *szConnection)
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR vcConnection[21];
VARCHAR vcUserId[21];
VARCHAR vcPasswd[21];
EXEC SQL END DECLARE SECTION;
strcpy( (char *)vcUserId.arr, szUserId);
vcUserId.len = strlen( szUserId);
strcpy( (char *)vcPasswd.arr, szPasswd);
vcPasswd.len = strlen( szPasswd);
/* If Connection String Is Not Empty */
if (szConnection[ 0] != NULL)
{
strcpy( (char *)vcConnection.arr, szConnection);
vcConnection.len = strlen( szConnection);
}
else
{
vcConnection.arr[0] = '\0';
vcConnection.len = 0;
}
/* Connection */
EXEC SQL CONNECT :vcUserId IDENTIFIED BY :vcPasswd USING :vcConnection;
if( sqlca.sqlcode != 0)
{
#ifdef CONSOLE_MODE
printf("Oracle Connect Fail : %s\n", sqlca.sqlerrm.sqlerrmc);
#endif
return FALSE;
}
#ifdef CONSOLE_MODE
printf("Oracle Connected.\n");
#endif
return TRUE;
}
int Commit( void)
{
EXEC SQL COMMIT WORK RELEASE;
if (sqlca.sqlcode != 0)
{
/* ORA-1034 : ORACLE not available */
if (sqlca.sqlcode == 1034) return FALSE;
#ifdef XCONSOLE_MODE
printf("Oracle Commit Fail : %s\n", sqlca.sqlerrm.sqlerrmc);
#endif
return FALSE;
}
#ifdef CONSOLE_MODE
printf("Oracle Commit Work Relese, Oracle DisConnected.\n");
#endif
return TRUE;
}
int RollBack( void)
{
EXEC SQL ROLLBACK WORK;
if (sqlca.sqlcode != 0)
{
/* ORA-1034 : ORACLE not available */
if (sqlca.sqlcode==1034) return FALSE;
#ifdef CONSOLE_MODE
printf("Oracle Rollback Fail : %s\n", sqlca.sqlerrm.sqlerrmc);
#endif
return FALSE;
}
return TRUE;
}
int Trim(char *szText)
{
int iCnt, iLength = strlen(szText);
for (iCnt = iLength-1; iCnt >= 0; iCnt--)
{
if (szText[iCnt]==' ' || szText[iCnt]=='\n' || szText[iCnt]=='\r')
{
szText[iCnt] = '\0';
iLength--;
}
else
break;
}
return iLength;
}
/*==================================================================================
* SMS 전송
===================================================================================*/
int SendSMS( char *szTranId, char *szTransPhone, char *szCallBackNo, char* szMessage)
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR vcTranId[21];
VARCHAR vcTransPhone[16];
VARCHAR vcTranCallBack[16];
VARCHAR vcMessage[256];
EXEC SQL END DECLARE SECTION;
memset( &vcTranId, 0, sizeof(vcTransPhone));
memset( &vcTransPhone, 0, sizeof(vcTransPhone));
memset( &vcTranCallBack, 0, sizeof(vcTranCallBack));
memset( &vcMessage, 0, sizeof(vcMessage));
strncpy(vcTranId.arr, szTranId, 20);
vcTranId.len = Trim( (char *)vcTranId.arr);
vcTranId.arr[ vcTranId.len] = '\0';
strncpy(vcTransPhone.arr, szTransPhone, 15);
vcTransPhone.len = Trim( (char *)vcTransPhone.arr);
vcTransPhone.arr[ vcTransPhone.len] = '\0';
strncpy(vcTranCallBack.arr, szCallBackNo, 15);
vcTranCallBack.len = Trim( (char *)vcTranCallBack.arr);
vcTranCallBack.arr[ vcTranCallBack.len] = '\0';
strncpy(vcMessage.arr, szMessage, 255);
vcMessage.len = Trim( (char *)vcMessage.arr);
vcMessage.arr[ vcMessage.len] = '\0';
#ifdef CONSOLE_MODE
printf("SMS szTranId...%s|\n", vcTranId.arr);
printf("SMS szTransPhone...%s\n", vcTransPhone.arr);
printf("SMS szCallBackNo...%s\n", vcTranCallBack.arr);
printf("SMS szMessage...%s\n", vcMessage.arr);
#endif
EXEC SQL INSERT INTO
em_tran(tran_pr, tran_id, tran_phone, tran_callback, tran_status, tran_date, tran_msg, tran_type)
VALUES(EM_TRAN_PR.NEXTVAL, :vcTranId, :vcTransPhone, :vcTranCallBack, '1', SYSDATE, :vcMessage, '1');
if (sqlca.sqlcode == 0)
{
if (!Commit())
{
RollBack();
return FALSE;
}
#ifdef CONSOLE_MODE
printf("SMS Sent...\n");
#endif
return TRUE;
}
else
return FALSE;
}
int main(int argc, char* argv[])
{
if( !Connection("오라클계정", "오라클패스워드", "오라클SID")) return -1;
SendSMS( argv[ 1], argv[ 2], argv[ 3], argv[ 4]);
}