memcached启动脚本
# vim /etc/init.d/memcached
#!/bin/bash#=======================================================================================# chkconfig: - 80 12# description: distributed memory caching daemon# processname: memcached#=======================================================================================ipaddr=`/sbin/ifconfig eth1 | awk -f ':' '/inet addr/{print $2}' | sed 's/[a-za-z ]//g'`port=11211user=rootsize=2048connnum=51200pidfile=/var/run/memcached.pidbinfile=/usr/local/memcached/bin/memcachedlockfile=/var/lock/subsys/memcachedretval=0 start() { echo -n $starting memcached...... $binfile -d -l $ipaddr -p $port -u $user -m $size -c $connnum -p $pidfile retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval} stop() { echo -n $shutting down memcached...... /sbin/killproc $binfile retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval} restart() { stop sleep 1 start} reload() { echo -n $reloading memcached...... /sbin/killproc $binfile -hup retval=$? echo return $retval} case $1 instart) 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=1esac
exit $retval# chmod +x /etc/init.d/memcached# chkconfig --add memcached# chkconfig --level 235 memcached on# service memcached start
binlog 自动清理脚本
# vim /data/scripts/delete_mysql_binlog.sh
#!/bin/bash#=======================================================================================# 用于删除 mysql master 端已经同步完的 binlog【需在 master 端运行】,以减少磁盘空间# 每天凌晨 5:30 分运行一次## 注:需在 slave 端添加允许 master 端访问的帐号【帐号:check_binlog,密码:binlog_2356】# 运行于 mysql master 端【目前只用于一主一从的同步模式,对于多从的情况暂时未考虑】#=======================================================================================path=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin ## slave端连接信息slave_addr=xxx.xxx.xxx.xxxslave_user=check_binlogslave_pwd=binlog_2356 logfile=/data/logs/db_sync_info.logpingfile=/tmp/mysqlping.log ## mysql状态信息查看命令sqlcmd=show slave status #=======================================================================================## 检查mysql是否已经运行if [[ `ps aux | grep mysql[d] | wc -l` -eq 0 ]]; then echo the mysql is not running at: `date +%f %h-%m-%s` >> ${logfile} exit 1fi ## 测试slave端的连通性nohup mysqladmin -h${slave_addr} -u${slave_user} -p${slave_pwd} ping > ${pingfile}retval=`grep ^error ${pingfile}`rm -f ${pingfile}if [[ ${retval}x != x ]]; then echo the mysql slave can not be connected at: `date +%f %h-%m-%s` >> ${logfile} exit 1fi ## 检查是否合法的slavemaster_addr=`mysql -h${slave_addr} -u${slave_user} -p${slave_pwd} -e ${sqlcmd}\g; | awk '$1==master_host: {print $2}'`local_addr=`/sbin/ifconfig eth1 | awk -f ':' '/inet addr/{print $2}' | sed 's/[a-za-z ]//g'`if [[ ${master_addr} != ${local_addr} ]]; then echo the mysql slave is not lawful at: `date +%f %h-%m-%s` >> ${logfile} exit 1fi ## 获得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 echo the mysql replication is not synchronous at: `date +%f %h-%m-%s` >> ${logfile} exit 1fi ## 再做一次判断,以保证数据同步绝对正常【创建测试数据】mysql -uroot -e create database if not exists mytestdb;sleep 3 retval=`mysql -h${slave_addr} -u${slave_user} -p${slave_pwd} -e show databases; | grep mytestdb`mysql -uroot -e drop database if exists mytestdb;if [[ ${retval}x = x ]]; then echo the mysql replication is not synchronous at: `date +%f %h-%m-%s` >> ${logfile} exit 1fi ## 在已经同步的情况,还需要判断当前同步的binlog,以此来确定哪些已经是过期的binlogslave_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 show master status; | grep -v '^+' | tail -1 | awk '{print $1}'` ## 主从端已经同步到相同的binlogif [[ ${slave_binlog1} = ${slave_binlog2} && ${slave_binlog1} = ${master_binlog} ]]; then curr_binlog=${master_binlog} ## 主从端已经同步,但从端的binlog还没有追赶到主端最新的binlogelif [[ ${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 echo has noknown error at:`date +%f %h-%m-%s` >> ${logfile} exit 1fi mysql -uroot -e purge binary logs to '${curr_binlog}';if [[ $? -eq 0 ]]; then echo clear mysql binlog is ok at: `date +%f %h-%m-%s` >> ${logfile}fi
# crontab -e 30 05 * * * /data/scripts/delete_mysql_binlog.sh >/dev/null 2>&1
修复mysql主从同步
#!/bin/shpath=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin logfile=/data/repair_mysql_sync_`date +%f`.logsqlcmd1=show slave status ## 查看mysql是否已启动if [[ `ps aux | grep mysqld | grep -v grep`x = x ]]; then echo the mysql is not running at: `date +%f %h-%m-%s` >> ${logfile} exit 1fi ## 获得mysql从端relay binlog的路径retval=`grep ^relay-log /etc/my.cnf | grep -v relay-log- | grep '/'`if [[ ${retval} = x ]]; then relay_binlog_path=`ps aux | grep -w mysqld | grep -v grep | awk '{print $13}' | awk -f '=' '{print $2}'`else relay_binlog_path=`dirname $(echo ${retval} | awk -f '=' '{print $2}')`fi ## 查找master.info文件,用于定位binlog信息master_file=`ps aux | grep -w mysqld | grep -v grep | awk '{print $13}' | awk -f '=' '{print $2}'`/master.infoif [[ ! -e ${master_file} ]]; then echo this server is not mysql slave at: `date +%f %h-%m-%s` >> ${logfile} exit 1fi ## 获得当前的同步状态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 echo now, the mysql replication is synchronous at: `date +%f %h-%m-%s` >> ${logfile} exit 0fi ## 从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}'` ## 删除无用的relay binlogrm -rf ${relay_binlog_path}/*-relay-bin.* ## 直接从0位置开始同步sqlcmd2=change master to master_host='${repli_ipaddr}', master_user='${repli_user}', master_password='${repli_pwd}',sqlcmd2=${sqlcmd2} master_log_file='${repli_binlog_file}', master_log_pos=0mysql -uroot -e stop slave;mysql -uroot -e ${sqlcmd2};mysql -uroot -e start slave; ## 如果同步的过程中,出现重复记录导致同步失败,就跳过while truedo sleep 2 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 the mysql synchronous error information: ${errorinfo} >> ${logfile} mysql -uroot -e stop slave; mysql -uroot -e set global sql_slave_skip_counter=1; mysql -uroot -e start slave; ## 已完成同步,就正常退出 elif [[ ${io_status} = yes && ${sql_status} = yes && ${slave_binlog1} = ${slave_binlog2} && ${behind_status} -eq 0 ]]; then echo the mysql synchronous is ok at: `date +%f %h-%m-%s` >> ${logfile} break fidone