MySQL的一些功能实用的Linux shell脚本分享
Memcached启动脚本
#vim/etc/init.d/memcached
#!/bin/bash
#=======================================================================================
#chkconfig:-8012
#description:Distributedmemorycachingdaemon
#processname:memcached
#=======================================================================================
IPADDR=`/sbin/ifconfigeth1|awk-F':''/inetaddr/{print$2}'|sed's/[a-zA-Z]//g'`
PORT="11211"
USER="root"
SIZE="2048"
CONNNUM="51200"
PIDFILE="/var/run/memcached.pid"
BINFILE="/usr/local/memcached/bin/memcached"
LOCKFILE="/var/lock/subsys/memcached"
RETVAL=0
start(){
echo-n$"Startingmemcached......"
$BINFILE-d-l$IPADDR-p$PORT-u$USER-m$SIZE-c$CONNNUM-P$PIDFILE
RETVAL=$?
echo
[$RETVAL-eq0]&&touch$LOCKFILE
return$RETVAL
}
stop(){
echo-n$"Shuttingdownmemcached......"
/sbin/killproc$BINFILE
RETVAL=$?
echo
[$RETVAL-eq0]&&rm-f$LOCKFILE
return$RETVAL
}
restart(){
stop
sleep1
start
}
reload(){
echo-n$"Reloadingmemcached......"
/sbin/killproc$BINFILE-HUP
RETVAL=$?
echo
return$RETVAL
}
case"$1"in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
[-e$LOCKFILE]&&restart
RETVAL=$?
;;
reload)
reload
;;
status)
status$prog
RETVAL=$?
;;
*)
echo"Usage:$0{start|stop|restart|condrestart|status}"
RETVAL=1
esac
exit$RETVAL #chmod+x/etc/init.d/memcached #chkconfig--addmemcached #chkconfig--level235memcachedon #servicememcachedstart
binlog自动清理脚本
#vim/data/scripts/delete_mysql_binlog.sh
#!/bin/bash
#=======================================================================================
#用于删除MySQLMaster端已经同步完的binlog【需在Master端运行】,以减少磁盘空间
#每天凌晨5:30分运行一次
#
#注:需在Slave端添加允许Master端访问的帐号【帐号:check_binlog,密码:binlog_2356】
#运行于MySQLMaster端【目前只用于一主一从的同步模式,对于多从的情况暂时未考虑】
#=======================================================================================
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
##Slave端连接信息
SLAVE_ADDR="XXX.XXX.XXX.XXX"
SLAVE_USER="check_binlog"
SLAVE_PWD="binlog_2356"
LOGFILE="/data/logs/db_sync_info.log"
PINGFILE="/tmp/mysqlping.log"
##MySQL状态信息查看命令
SQLCMD="showslavestatus"
#=======================================================================================
##检查MySQL是否已经运行
if[[`psaux|grepmysql[d]|wc-l`-eq0]];then
echoTheMySQLisnotrunningat:`date+%F""%H-%M-%S`>>${LOGFILE}
exit1
fi
##测试Slave端的连通性
nohupmysqladmin-h${SLAVE_ADDR}-u${SLAVE_USER}-p${SLAVE_PWD}ping>${PINGFILE}
retval=`grep"^error"${PINGFILE}`
rm-f${PINGFILE}
if[["${retval}X"!="X"]];then
echoTheMySQLSlavecannotbeconnectedat:`date+%F""%H-%M-%S`>>${LOGFILE}
exit1
fi
##检查是否合法的Slave
MASTER_ADDR=`mysql-h${SLAVE_ADDR}-u${SLAVE_USER}-p${SLAVE_PWD}-e"${SQLCMD}\G;"|awk'$1=="Master_Host:"{print$2}'`
LOCAL_ADDR=`/sbin/ifconfigeth1|awk-F':''/inetaddr/{print$2}'|sed's/[a-zA-Z]//g'`
if[["${MASTER_ADDR}"!="${LOCAL_ADDR}"]];then
echoTheMySQLSlaveisnotlawfulat:`date+%F""%H-%M-%S`>>${LOGFILE}
exit1
fi
##获得Slave端信息,以此来确定是否处于正常同步的情况
IO_STATUS=`mysql-h${SLAVE_ADDR}-u${SLAVE_USER}-p${SLAVE_PWD}-e"${SQLCMD}\G;"|awk'$1=="Slave_IO_Running:"{print$2}'`
SQL_STATUS=`mysql-h${SLAVE_ADDR}-u${SLAVE_USER}-p${SLAVE_PWD}-e"${SQLCMD}\G;"|awk'$1=="Slave_SQL_Running:"{print$2}'`
if[["${IO_STATUS}"!="Yes"||"${SQL_STATUS}"!="Yes"]];then
echoTheMySQLReplicationisnotsynchronousat:`date+%F""%H-%M-%S`>>${LOGFILE}
exit1
fi
##再做一次判断,以保证数据同步绝对正常【创建测试数据】
mysql-uroot-e"createdatabaseifnotexistsmytestdb;"
sleep3
retval=`mysql-h${SLAVE_ADDR}-u${SLAVE_USER}-p${SLAVE_PWD}-e"showdatabases;"|grepmytestdb`
mysql-uroot-e"dropdatabaseifexistsmytestdb;"
if[["${retval}X"="X"]];then
echoTheMySQLReplicationisnotsynchronousat:`date+%F""%H-%M-%S`>>${LOGFILE}
exit1
fi
##在已经同步的情况,还需要判断当前同步的binlog,以此来确定哪些已经是过期的binlog
SLAVE_BINLOG1=`mysql-h${SLAVE_ADDR}-u${SLAVE_USER}-p${SLAVE_PWD}-e"${SQLCMD}\G;"|awk'$1=="Master_Log_File:"{print$2}'`
SLAVE_BINLOG2=`mysql-h${SLAVE_ADDR}-u${SLAVE_USER}-p${SLAVE_PWD}-e"${SQLCMD}\G;"|awk'$1=="Relay_Master_Log_File:"{print$2}'`
##获得Master端,当前的binlog文件以及binlog路径
MASTER_BINLOG=`mysql-uroot-e"showmasterstatus;"|grep-v'^+'|tail-1|awk'{print$1}'`
##主从端已经同步到相同的binlog
if[["${SLAVE_BINLOG1}"="${SLAVE_BINLOG2}"&&"${SLAVE_BINLOG1}"="${MASTER_BINLOG}"]];then
CURR_BINLOG="${MASTER_BINLOG}"
##主从端已经同步,但从端的binlog还没有追赶到主端最新的binlog
elif[["${SLAVE_BINLOG1}"="${SLAVE_BINLOG2}"&&"${SLAVE_BINLOG1}"!="${MASTER_BINLOG}"]];then
CURR_BINLOG="${SLAVE_BINLOG1}"
##主从端已经同步,主从端的binlog一致,但relaylog还不一致
elif[["${SLAVE_BINLOG1}"!="${SLAVE_BINLOG2}"&&"${SLAVE_BINLOG1}"="${MASTER_BINLOG}"]];then
CURR_BINLOG="${SLAVE_BINLOG2}"
else
echoHasnoknownerrorat:`date+%F""%H-%M-%S`>>${LOGFILE}
exit1
fi
mysql-uroot-e"purgebinarylogsto'${CURR_BINLOG}';"
if[[$?-eq0]];then
echoClearMySQLbinlogisokat:`date+%F""%H-%M-%S`>>${LOGFILE}
fi
#crontab-e 3005***/data/scripts/delete_mysql_binlog.sh>/dev/null2>&1
修复MySQL主从同步
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
LOGFILE=/data/repair_mysql_sync_`date+%F`.log
SQLCMD1="showslavestatus"
##查看MySQL是否已启动
if[[`psaux|grepmysqld|grep-vgrep`"X"="X"]];then
echoTheMySQLisnotrunningat:`date+%F""%H-%M-%S`>>${LOGFILE}
exit1
fi
##获得MySQL从端Relaybinlog的路径
retval=`grep"^relay-log"/etc/my.cnf|grep-vrelay-log-|grep'/'`
if[["${retval}"="X"]];then
RELAY_BINLOG_PATH=`psaux|grep-wmysqld|grep-vgrep|awk'{print$13}'|awk-F'=''{print$2}'`
else
RELAY_BINLOG_PATH=`dirname$(echo${retval}|awk-F'=''{print$2}')`
fi
##查找master.info文件,用于定位Binlog信息
MASTER_FILE=`psaux|grep-wmysqld|grep-vgrep|awk'{print$13}'|awk-F'=''{print$2}'`/master.info
if[[!-e${MASTER_FILE}]];then
echoThisServerisnotMySQLSlaveat:`date+%F""%H-%M-%S`>>${LOGFILE}
exit1
fi
##获得当前的同步状态
IO_STATUS=`mysql-uroot-e"${SQLCMD1}\G;"|awk'$1=="Slave_IO_Running:"{print$2}'`
SQL_STATUS=`mysql-uroot-e"${SQLCMD1}\G;"|awk'$1=="Slave_SQL_Running:"{print$2}'`
if[["${IO_STATUS}"="Yes"&&"${SQL_STATUS}"="Yes"]];then
echoNow,TheMySQLReplicationissynchronousat:`date+%F""%H-%M-%S`>>${LOGFILE}
exit0
fi
##从master.info文件中,获得MySQL主端的同步信息
REPLI_INFO=`sed'/^$/d'${MASTER_FILE}|tail+2|head-5`
REPLI_BINLOG_FILE=`echo${REPLI_INFO}|awk'{print$1}'`
REPLI_IPADDR=`echo${REPLI_INFO}|awk'{print$3}'`
REPLI_USER=`echo${REPLI_INFO}|awk'{print$4}'`
REPLI_PWD=`echo${REPLI_INFO}|awk'{print$5}'`
##删除无用的Relaybinlog
rm-rf${RELAY_BINLOG_PATH}/*-relay-bin.*
##直接从0位置开始同步
SQLCMD2="changemastertomaster_host='${REPLI_IPADDR}',master_user='${REPLI_USER}',master_password='${REPLI_PWD}',"
SQLCMD2="${SQLCMD2}master_log_file='${REPLI_BINLOG_FILE}',master_log_pos=0"
mysql-uroot-e"stopslave;"
mysql-uroot-e"${SQLCMD2};"
mysql-uroot-e"startslave;"
##如果同步的过程中,出现重复记录导致同步失败,就跳过
whiletrue
do
sleep2
IO_STATUS=`mysql-uroot-e"${SQLCMD1}\G;"|awk'$1=="Slave_IO_Running:"{print$2}'`
SQL_STATUS=`mysql-uroot-e"${SQLCMD1}\G;"|awk'$1=="Slave_SQL_Running:"{print$2}'`
BEHIND_STATUS=`mysql-uroot-e"${SQLCMD1}\G;"|awk'$1=="Seconds_Behind_Master:"{print$2}'`
SLAVE_BINLOG1=`mysql-uroot-e"${SQLCMD1}\G;"|awk'$1=="Master_Log_File:"{print$2}'`
SLAVE_BINLOG2=`mysql-uroot-e"${SQLCMD1}\G;"|awk'$1=="Relay_Master_Log_File:"{print$2}'`
##出现错误,就将错误信息记录到日志文件,并跳过错误继续同步
if[["${IO_STATUS}"!="Yes"||"${SQL_STATUS}"!="Yes"]];then
ERRORINFO=`mysql-uroot-e"${SQLCMD1}\G;"|awk-F':''$1=="Last_Error"{print$2}'`
echo"TheMySQLsynchronouserrorinformation:${ERRORINFO}">>${LOGFILE}
mysql-uroot-e"stopslave;"
mysql-uroot-e"setGLOBALSQL_SLAVE_SKIP_COUNTER=1;"
mysql-uroot-e"startslave;"
##已完成同步,就正常退出
elif[["${IO_STATUS}"="Yes"&&"${SQL_STATUS}"="Yes"&&"${SLAVE_BINLOG1}"="${SLAVE_BINLOG2}"&&${BEHIND_STATUS}-eq0]];then
echoTheMySQLsynchronousisokat:`date+%F""%H-%M-%S`>>${LOGFILE}
break
fi
done