编写mysql多实例启动脚本

脚本原理:

 启动MySQL动作:

   mysqld_safe来执行启动

 停止MySQL动作:

   使用mysqladmin来执行停止动作

 重启的MySQL动作:

     原理就是先停止,然后再启动

   但是要注意:简单的sleep来等待停止和启动过程极可能出现在短时间内重复运行重启,mysqld_safe报错提示已经启动了一个实例的问题

   这里可以参考MySQL提供的默认启动脚本mysqld.service中的wait_for_pid()这个函数。

以下是启动脚本,效果如图:

编写mysql多实例启动脚本

脚本:

  1 #!/bin/sh
  2 #init
  3 port=3306
  4 mysql_user="root"
  5 mysql_pwd="test"
  6 CmdPath="/usr/local/mysql-5.5.62/bin/"
  7 mysql_sock="/data/${port}/mysqld.sock"
  8 pid_file="/data/${port}/mysqld.pid"
  9 service_startup_timeout=900
 10 PATH=/sbin:/usr/sbin:/bin:/usr/bin:$CmdPath:$PATH
 11 export PATH
 12 #print success
 13 echo_info_ok(){
 14     echo -e "[e[0;32;1m success e[0;32;0m]"
 15 }
 16 
 17 #print faild
 18 echo_info_false(){
 19     echo -e "[e[0;31;1m failed e[0;31;0m]"
 20 }
 21 #wait for pid
 22 wait_for_pid(){
 23     verb="$1" # created | removed
 24     pid="$2"  # process ID of the program operating on the pid-file
 25     pid_file_path="$3" # path to the PID file.
 26     i=0
 27     flag="by checking again"
 28     while test $i -ne $service_startup_timeout;do
 29         case "$verb" in
 30               'created')
 31                 # wait for a PID-file to pop into existence.
 32                 test -s "$pid_file_path" && i='' && break
 33                 ;;
 34               'removed')
 35                 # wait for this PID-file to disappear
 36                 test ! -s "$pid_file_path" && i='' && break
 37                 ;;
 38               *)
 39                 echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
 40                 exit 1
 41                 ;;
 42         esac
 43 
 44         # if server isn't running, then pid-file will never be updated
 45         if test -n "$pid"; then
 46               if kill -0 "$pid" 2>/dev/null; then
 47                 :  # the server still runs
 48              else
 49                 # The server may have exited between the last pid-file check and now.  
 50                 if test -n "$avoid_race_condition"; then 
 51                        flag=""
 52                        continue  # Check again.
 53                 fi
 54                 return 1  # not waiting any more.
 55             fi
 56         fi
 57         sleep 1
 58     done
 59 }
 60 
 61 #startup function
 62 function_start_mysql(){
 63     if [ ! -e "$mysql_sock" ];then
 64       printf "Starting MySQL..."
 65       /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
 66       wait_for_pid created "$!" "$pid_file"
 67       if [ $? -eq 0 ];then
 68           echo_info_ok
 69       else
 70           echo_info_false
 71       fi
 72     else
 73       printf "MySQL is running...
"
 74       exit
 75     fi
 76 }
 77 
 78 #stop function
 79 function_stop_mysql(){
 80     if [ ! -e "$mysql_sock" ];then
 81        printf "MySQL is stopped...
"
 82        exit
 83     else
 84        printf "Stoping MySQL..."
 85         ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
 86         wait_for_pid removed "$!" "$pid_file"
 87         if [ $? -eq 0 ];then
 88             echo_info_ok
 89         else
 90             echo_info_false
 91         fi
 92    fi
 93 }
 94 
 95 #restart function
 96 function_restart_mysql(){
 97     if [ ! -e $mysql_sock ];then
 98         printf "Restarting MySQL..
"
 99         function_start_mysql
100     else
101         printf "Restarting MySQL...
"
102         function_stop_mysql
103             if [ $? -eq 0 ];then
104                 function_start_mysql
105             else
106                 printf "Starting MySQL"
107                 echo_info_false
108             fi
109         done
110     fi
111 }
112 
113 #main
114 case $1 in
115     start)
116         function_start_mysql
117     ;;
118     stop)
119         function_stop_mysql
120     ;;
121     restart)
122         function_restart_mysql
123     ;;
124     *)
125            printf "Usage: /data/${port}/mysql {start|stop|restart}
"
126 esac