MySQL的一些功能实用的Linux shell脚本分享

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="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 $"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" 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 --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.XXX"
SLAVE_USER="check_binlog"
SLAVE_PWD="binlog_2356"

LOGFILE="/data/logs/db_sync_info.log"
PINGFILE="/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 1
fi

## 测试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 1
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/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 1
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
  echo The MySQL Replication is not synchronous at: `date +%F" "%H-%M-%S` >> ${LOGFILE}
  exit 1
fi

## 再做一次判断,以保证数据同步绝对正常【创建测试数据】
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 1
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 "show master status;" | 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
  echo Has noknown error at:`date +%F" "%H-%M-%S` >> ${LOGFILE}
  exit 1
fi

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/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

LOGFILE=/data/repair_mysql_sync_`date +%F`.log
SQLCMD1="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 1
fi

## 获得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.info
if [[ ! -e ${MASTER_FILE} ]]; then
  echo This Server is not MySQL Slave at: `date +%F" "%H-%M-%S` >> ${LOGFILE}
  exit 1
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
  echo Now, The MySQL Replication is synchronous at: `date +%F" "%H-%M-%S` >> ${LOGFILE}
  exit 0
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}'`

## 删除无用的Relay binlog
rm -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=0"
mysql -uroot -e "stop slave;"
mysql -uroot -e "${SQLCMD2};"
mysql -uroot -e "start slave;"

## 如果同步的过程中,出现重复记录导致同步失败,就跳过
while true
do
  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
  fi
done
(0)

相关推荐

  • linux shell数据重定向(输入重定向与输出重定向)详细分析

    在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作. 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值. linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error outp

  • linux shell命令快捷获得系统帮助(一)[man-pages定义规范]

    作为刚刚学习linux朋友,我们拿到一个命令,不知道怎么样使用,一般都会先看下命令默认参数说明,然后再不清楚就是通过man命令查阅手册.还是找不到方法,就网上搜索,最后不行就去大论坛发帖.由于很多时候发帖子估计要比较久有人回复.久而久之,对学习linux的热情被怠慢下来了. 其实,这也是学习linux的最大困难. linux命令帮助,一般有2种,命令自身代码里面带有使用帮助说明,这种一般很精简,太长了,程序自身的大小以及日常维护不方便.还有一种,就是带有帮助文件,类似windows的chm格式文

  • linux shell 管道命令(pipe)使用及与shell重定向区别

    看了前面一节:linux shell数据重定向(输入重定向与输出重定向)详细分析 估计还有一些朋友是头晕晕的,好复杂的重定向了.这次我们看下管道命令了.shell管道,可以说用法就简单多了. 管道命令操作符是:"|",它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandard error 信息没有直接处理能力.然后,传递给下一个命令,作为标准的输入 standard input. 管道命令使用说明: 先看下下面图: comma

  • linux shell 字符串操作(长度,查找,替换)详解

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那

  • linux shell实现随机数几种方法分享(date,random,uuid)

    在日常生活中,随机数实际上经常遇到,想丢骰子,抓阄,还有抽签.呵呵,非常简单就可以实现.那么在做程序设计,真的要通过自己程序设计出随机数那还真的不简单了.现在很多都是操作系统内核会提供相应的api,这些原始参数是获取一些计算机运行原始信息,如内存,电压,物理信号等等,它的值在一个时间段可以保证是唯一的了.好了,废话我就不说了.呵呵. shell脚本程序我们有那些获得随机数方法呢? 一.通过时间获得随机数(date) 这个也是我们经常用到的,可以说时间是唯一的,也不会重复的,从这个里面获得同一时间

  • Linux Shell 数组建立及使用技巧

    linux shell在编程方面比windows 批处理强大太多,无论是在循环.运算.已经数据类型方面都是不能比较的. 下面是个人在使用时候,对它在数组方面一些操作进行的总结. 1.数组定义 [chengmo@centos5 ~]$ a=(1 2 3 4 5) [chengmo@centos5 ~]$ echo $a 一对括号表示是数组,数组元素用"空格"符号分割开. 2.数组读取与赋值 得到长度: [chengmo@centos5 ~]$ echo ${ #a[@]} 用${#数组名

  • Linux系统中bash shell编程的10个基础问题讲解

    第1问:为何叫做shell? 在介绍 shell 是什么东西之前,不妨让我们重新审视使用者与电脑的关系.我们知道电脑的运作不能离开硬件,但使用者却无法直接对硬件作驱动,硬件的驱动只能透过一个称为"操作系统(Operating System)"的软件来控管,事实上,我们每天所谈的linux,严格来说只是一个操作系统,我们称之为"核心(kernel)".然而,从使用者的角度来说,使用者也没办法直接操作kernel,而是透过kernel的"外壳"程序,

  • MySQL的一些功能实用的Linux shell脚本分享

    Memcached启动脚本 # vim /etc/init.d/memcached #!/bin/bash #======================================================================================= # chkconfig: - 80 12 # description: Distributed memory caching daemon # processname: memcached #===========

  • Linux shell脚本输出日志笔记整理(必看篇)

    1.日志方法简介: #日志名称 log="./upgrade.log" #操作日志存放路径 fsize=2000000 #如果日志大小超过上限,则保存旧日志,重新生成日志文件 exec 2>>$log #如果执行过程中有错误信息均输出到日志文件中 #日志函数 #参数 #参数一,级别,INFO ,WARN,ERROR #参数二,内容 #返回值 function zc_log() { #判断格式 if [ 2 -gt $# ] then echo "parameter

  • Linux shell脚本基础学习详细介绍(完整版)第1/2页

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Linux 脚本编写基础 ◆1.1 语法基本介绍1.1.1 开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序.当编辑好脚本时,如果要执行该脚本,还必须使其可执行.要使脚本可执行:编译

  • 使用Linux shell脚本实现FTP定时执行批量下载指定文件

    使用FTP定时批量下载指定文件的shell脚本,具体实例介绍如下所示: 1.目标FTP服务器地址 #FTP服务器地址 ip=10.19.15.23 2.FTP账号和密码 u=账号 p=密码 3.使用mget结合正则表达式下载文件 #获取昨天日期,为后面下载使用 T=`date -d yesterday +%Y%m%d` 4.连接FTP服务器,到指定路径下下载文件 ftp -n <<EOF open $ip user $u $p binary cd /hour #远程服务器文件目录 lcd /h

  • Linux Shell 脚本编程入门教程

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用.深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh).Bourne

  • Linux Shell脚本实现检测tomcat

    Linux Shell脚本检测tomcat并自动重启 后台运行命令 sh xxx.sh & 查看后台任务:jobs 召唤到前台:fg jobs编号 可以删掉while循环的代码放到crontab里面定时执行,可以将脚本直接后台运行, #!/bin/bash while [ true ] do url="http://www.jb51.net/"; httpOK=`curl --connect-timeout 10 -m 60 --head --silent $url | awk

  • 在linux shell脚本中root切换到普通用户执行脚本或命令的方法

    需求: 安装deb包,设置程序安装后启动,不需要root权限启动程序 | 不能用root权限启动 其他开机启动选项 方法:root临时降低权限 secUser=`who am i | awk '{print $1}'` #echo $secUser su $secUser -c <指令> > /dev/null 2>&1 & #这一条命令的执行权限是临时的,只在本条语句起作用 id -u # 结果为0,还是root用户权限 附: su --help -c, --co

  • linux shell脚本对未定义变量的判断以及if的用法详解

    环境 操作系统:win10 虚拟机:centos7 需求 因为公司有个脚本,是用于启动程序的,但是每次启动都要手动做如下两个操作: ①先查询之前的进程ID ②杀死之前的,在启动新了 时间长了弄得我很烦躁,所以就琢磨下,把上面的的操作一起整合到启动脚本里去. 最开始我是这么写的: #!/bin/bash echo "ggjob-search..." pid=`ps -ef|grep -w ggjob-search|grep -v grep|grep -v ggjob-search.sh|

  • 干掉一堆mysql数据库,仅需这样一个shell脚本(推荐)

    一大早就被电话吵醒了,云某项目数据库全挂了,启动不了(睡得太死,没听到报警短信),吓得不轻啊! 电话中说所有mysql数据库主库都启动不了,但从库正常,怀疑是主库去连其它阿里云的主库了.这些数据库,以前是从阿里云迁移到idc机房的,因此他有这个判断. 赶紧打开电脑,连***,登录其中一个数据库服务器,试着执行如下命令启动mysql服务 [root@bbsmysql121 backup]#mysqld_safe –user=mysql & 启动失败,又换一台数据库服务器尝试,还是失败.考虑到所有的

  • Linux Shell脚本中获取本机ip地址方法

    方法一:ifconfig -a ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:" 命令解析 ifconfig -a  和window下执行此命令一样道理,返回本机所有ip信息 grep inet                  截取包含ip的行 grep -v 127.0.0.1      去掉本地指向的那行 grep -v inet6             去掉

随机推荐