目的:
自动检查、自动恢复复制进程以及把检查结果自动发电邮给指定邮箱。
因为Slony是放在后台跑的,如果服务器停电或出现异常断电什么的,就会因此出现复制异常或进程中断,所以系统管理员有必要每天去检查复制是否正常。
基于上一遍文章设置的Slony运行环境,检查Slony的log即可知道复制进程是否运行正常,通常我是用 tail -f slon_s.out.YYYYMMDD这样看的,但后来又觉得,每天做重复的事情对于一般人是无奈,对于会写程式的人来说是浪费生命,如果交给程序自动运行,会做的更完美,检查次数会更多。于是花了点时间写了一套可以自动检查、自动维护以及把检查结果自动发电邮给指定邮箱的程序集。
因为这是好几年前设计的script,所以只能通过查看cronjob来开始找了^_^:
切换到root,然后crontab -e,找到如下一段:
# replication tasks by rock 25 02 * * * /live/bin/replbms/smain.sh stop 20 06 * * * /live/bin/replStart.sh 30 07 * * * /live/bin/chk_repl.sh 1 30 09 * * * /live/bin/chk_repl.sh 00 14 * * * /live/bin/chk_repl.sh 00 16 * * * /live/bin/chk_repl.sh我的设置是,凌晨两点二十五分停掉所有复制进程(所有数据库的复制都停掉),然后六点二十分又开启, 七点半检查一次复制是否正常,检查结果无论是否有问题均发电邮通知,余下那几个检查时间点检查,没有问题是不会发电邮的。对了,chk_repl.sh除了检查复制进程、发电邮之外,如果发现该数据库的复制进程出现问题,会自动重新启动复制进程。
replStart.sh复制重启数据库复制,其实是分别调用了replbms和replsmtbms两组复制:
#!/bin/sh # # replStart.sh This script takes care of starting and stopping # the replication # # chkconfig: 2345 91 35 # description: Start replication # /live/bin/replbms/smain.sh stop sleep 1 /live/bin/replbms/smain.sh start sleep 1 /live/bin/replsmtbms/smain.sh start
chk_repl.sh,这个有点复杂,把要检查的数据库放到KEYS变量中,它会逐个检查是否复制正常,或检查是否有运行复制进程,没有则启动。如果发现错误则会自动发电邮通知指定用户。
#!/bin/sh # by rock LOG_PATH="/tmp/chkrepl" MAIL_USER="abcdef@abc.com" MAIL="/usr/sbin/sendmail -f mis.websupport@abc.com -t " SENDOK="$1" KEYS="bms smtbms " if [ ! -d $LOG_PATH ]; then mkdir -p $LOG_PATH fi Test_repl_running() { DB="$1db" #echo "/bin/ps -aux|/bin/grep slon|/bin/grep $DB >$LOG_PATH/chk.log" /bin/ps -aux|/bin/grep slon|/bin/grep $DB >$LOG_PATH/chk$DB.log if /bin/grep "$DB host=" $LOG_PATH/chk$DB.log >/dev/null 2>&1; then echo "sss" return 1 else echo "fff" return 0 fi } ERROR="" for key in $KEYS ;do PATH="/live/bin/repl$key" Test_repl_running $key if [ $? = 0 ] ; then echo "Test replication for $key Failed,restart it ..." echo "$PATH/smain.sh start" $PATH/smain.sh start /bin/sleep 3 ERROR=$ERROR"\n.Test replication for $key Failed,restart it ..." #exit 0 else echo "Test replication for $key successed." fi LOG_PAT="*_s*`/bin/date +%Y``/bin/date +%m``/bin/date +%d`" LOG_FILE="`/bin/ls $PATH/log/$LOG_PAT`" #/bin/grep ERROR $LOG_FILE if [ -f "$LOG_FILE" ] ; then echo "Found log file $LOG_FILE" else echo "Not found log file '$LOG_FILE' for $key"db ERROR=$ERROR"\n.Not found log file '$LOG_FILE' for $key"db continue fi echo "Checing log file $LOG_FILE ..." if /bin/grep "ERROR" $LOG_FILE >/dev/null 2>&1; then echo "$key replication found error,please check ." ERROR=$ERROR"\n.$key replication found error,please check ." else echo "OK." fi done if [ -n "$ERROR" ]; then echo -e "\n\n================================================================================" echo "ERROR List" echo -e $ERROR EMAILHEADER="TO: $MAIL_USER\n" EMAILHEADER=$EMAILHEADER"Subject: [ERROR] BMS LIVE -> RPT replication check Log ($HOSTNAME)" ERROR=$EMAILHEADER""$ERROR /bin/echo -e $ERROR >$LOG_PATH/error_mail.log $MAIL <$LOG_PATH/error_mail.log else if [ -n "$SENDOK" ]; then EMAILHEADER="TO: $MAIL_USER\n" EMAILHEADER=$EMAILHEADER"Subject: [OK] BMS LIVE -> RPT replication check Log ($HOSTNAME)" ERROR=$EMAILHEADER"\nAll replication is running." /bin/echo -e $ERROR >$LOG_PATH/error_mail.log $MAIL <$LOG_PATH/error_mail.log echo "email sent." fi fi原文链接:https://www.f2er.com/postgresql/195774.html