mysql启动脚本详解

  1 #!/bin/sh
  2 # Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
  3 # This file is public domain and comes with NO WARRANTY of any kind
  4
  5 # MySQL daemon start/stop script.
  6
  7 # Usually this is put in /etc/init.d (at least on machines SYSV R4 based
  8 # systems) and linked to /etc/rc3.d/S99mysql and /etc/rc0.d/K01mysql.
  9 # When this is done the mysql server will be started when the machine is
 10 # started and shut down when the systems goes down.
 11
 12 # Comments to support chkconfig on RedHat Linux
 13 # chkconfig: 2345 64 36
 14 # description: A very fast and reliable SQL database engine.
 15
 16 # Comments to support LSB init script conventions
 17 ### BEGIN INIT INFO
 18 # Provides: mysql
 19 # Required-Start: $local_fs $network $remote_fs
 20 # Should-Start: ypbind nscd ldap ntpd xntpd
 21 # Required-Stop: $local_fs $network $remote_fs
 22 # Default-Start:  2 3 4 5
 23 # Default-Stop: 0 1 6
 24 # Short-Description: start and stop MySQL
 25 # Description: MySQL is a very fast and reliable SQL database engine.
 26 ### END INIT INFO
 27
 28 # If you install MySQL on some other places than /usr, then you
 29 # have to do one of the following things for this script to work:
 30 #
 31 # - Run this script from within the MySQL installation directory
 32 # - Create a /etc/my.cnf file with the following information:
 33 #   [mysqld]
 34 #   basedir=<path-to-mysql-installation-directory>
 35 # - Add the above to any other configuration file (for example ~/.my.ini)
 36 #   and copy my_print_defaults to /usr/bin
 37 # - Add the path to the mysql-installation-directory to the basedir variable
 38 #   below.
 39 #
 40 # If you want to affect other MySQL variables, you should make your changes
 41 # in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files.
 42
 43 # If you change base dir, you must also change datadir. These may get
 44 # overwritten by settings in the MySQL configuration files.
 45
 46 basedir=            #mysql的安装目录
 47 datadir=            #数据存储路径
 48
 49 # Default value, in seconds, afterwhich the script should timeout waiting
 50 # for server start.
 51 # Value here is overriden by value in my.cnf.
 52 # 0 means don‘t wait at all
 53 # Negative numbers mean to wait indefinitely
 54 service_startup_timeout=900
 55
 56 # Lock directory for RedHat / SuSE.
 57 lockdir=‘/var/lock/subsys‘                #mysql进程锁
 58 lock_file_path="$lockdir/mysql"
 59
 60 # The following variables are only set for letting mysql.server find things.
 61
 62 # Set some defaults
 63 mysqld_pid_file_path=
 64 if test -z "$basedir"                     #依次确定$basedir,$datadir,$bindir等路径
 65 then
 66   basedir=/usr
 67   bindir=/usr/bin
 68   if test -z "$datadir"
 69   then
 70     datadir=/var/lib/mysql
 71   fi
 72   sbindir=/usr/sbin
 73   libexecdir=/usr/sbin
 74 else
 75   bindir="$basedir/bin"
 76   if test -z "$datadir"
 77   then
 78     datadir="$basedir/data"
 79   fi
 80   sbindir="$basedir/sbin"
 81   libexecdir="$basedir/libexec"
 82 fi
 83
 84 # datadir_set is used to determine if datadir was set (and so should be
 85 # *not* set inside of the --basedir= handler.)
 86 datadir_set=
 87
 88 #
 89 # Use LSB init script functions for printing messages, if possible
 90 #
 91 lsb_functions="/lib/lsb/init-functions"   #linux系统脚本,包含打印log函数
 92 if test -f $lsb_functions ; then    #如果存在改文件,将这些函数导入该脚本
 93   . $lsb_functions
 94 else                              #否则使用自定义信息
 95   log_success_msg()
 96   {
 97     echo " SUCCESS! [email protected]"
 98   }
 99   log_failure_msg()
100   {
101     echo " ERROR! [email protected]"
102   }
103 fi
104
105 PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin"           #添加$basrdir到系统环境变量
106 export PATH
107
108 mode=$1    # start or Stop        #传入启动脚本的第1个参数
109
110 [ $# -ge 1 ] && shift      #如果参数个数大于等于1个,shift删掉第一个参数,将剩余参数传给$other_args
111
112
113 other_args="$*"   # uncommon, but needed when called from an RPM upgrade action
114            # Expected: "--skip-networking --skip-grant-tables"
115            # They are not checked here, intentionally, as it is the resposibility
116            # of the "spec" file author to give correct arguments only.
117
118 case `echo "testing\c"`,`echo -n testing`     #echo_c和echo_n的定义;\c不加换行符,-n不换行
119     *c*,-n*) echo_n=   echo_c=     ;;
120     *c*,*)   echo_n=-n echo_c=     ;;
121     *)       echo_n=   echo_c=‘\c‘ ;;
122 esac
123
124
125 parse_server_arguments() {                 #该函数将my_print_defaults 命令分析出得参数赋值给相应的变量
126   for arg do
127     case "$arg" in
128       --basedir=*)  basedir=`echo "$arg" | sed -e ‘s/^[^=]*=//‘`    #利用正则表达式获取
129                     bindir="$basedir/bin"
130             if test -z "$datadir_set"; then
131               datadir="$basedir/data"
132             fi
133             sbindir="$basedir/sbin"
134             libexecdir="$basedir/libexec"
135         ;;
136       --datadir=*)  datadir=`echo "$arg" | sed -e ‘s/^[^=]*=//‘`
137             datadir_set=1
138     ;;
139       --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e ‘s/^[^=]*=//‘` ;;
140       --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e ‘s/^[^=]*=//‘` ;;
141     esac
142   done
143 }
144
145
146
147 wait_for_pid () {                        #该函数在启动和停止mysql服务时用于等待pid的生成
148   verb="$1"           # created | removed
149   pid="$2"            # process ID of the program operating on the pid-file
150   pid_file_path="$3" # path to the PID file.
151
152   i=0
153   avoid_race_condition="by checking again"
154
155   while test $i -ne $service_startup_timeout ; do
156
157     case "$verb" in                                  #处理第1个参数,created或removed
158       ‘created‘)
159         # wait for a PID-file to pop into existence.
160         test -s "$pid_file_path" && i=‘‘ && break
161         ;;
162       ‘removed‘)
163         # wait for this PID-file to disappear
164         test ! -s "$pid_file_path" && i=‘‘ && break
165         ;;
166       *)
167         echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
168         exit 1
169         ;;
170     esac
171
172     # if server isn‘t running, then pid-file will never be updated
173     if test -n "$pid"; then                 #如果pid非空
174       if kill -0 "$pid" 2>/dev/null; then   #kill -0发送一个无效信号,可检查进程是否存在,存在返回0,反之则1
175         :  # the server still runs
176       else
177         # The server may have exited between the last pid-file check and now.
178         if test -n "$avoid_race_condition"; then
179           avoid_race_condition=""
180           continue  # Check again.
181         fi
182
183         # there‘s nothing that will affect the file.
184         log_failure_msg "The server quit without updating PID file ($pid_file_path)."
185         return 1  # not waiting any more.
186       fi
187     fi
188
189     echo $echo_n ".$echo_c"
190     i=`expr $i + 1`
191     sleep 1                   #睡眠1秒
192
193   done
194
195   if test -z "$i" ; then   #如果i长度为0
196     log_success_msg
197     return 0
198   else
199     log_failure_msg
200     return 1
201   fi
202 }
203
204
205 # Get arguments from the my.cnf file,
206 # the only group, which is read from now on is [mysqld]
207 if test -x ./bin/my_print_defaults          #找到print_defaults的路径
208 then
209   print_defaults="./bin/my_print_defaults"
210 elif test -x $bindir/my_print_defaults
211 then
212   print_defaults="$bindir/my_print_defaults"
213 elif test -x $bindir/mysql_print_defaults
214 then
215   print_defaults="$bindir/mysql_print_defaults"
216 else
217   # Try to find basedir in /etc/my.cnf
218   conf=/etc/my.cnf
219   print_defaults=
220   if test -r $conf                         #如果可读,从配置文件$conf读取
221   then
222     subpat=‘^[^=]*basedir[^=]*=\(.*\)$‘
223     dirs=`sed -e "/$subpat/!d" -e ‘s//\1/‘ $conf`
224     for d in $dirs
225     do
226       d=`echo $d | sed -e ‘s/[     ]//g‘`
227       if test -x "$d/bin/my_print_defaults"
228       then
229         print_defaults="$d/bin/my_print_defaults"
230         break
231       fi
232       if test -x "$d/bin/mysql_print_defaults"
233       then
234         print_defaults="$d/bin/mysql_print_defaults"
235         break
236       fi
237     done
238   fi
239
240   # Hope it‘s in the PATH ... but I doubt it
241   test -z "$print_defaults" && print_defaults="my_print_defaults"     #还是不行,就用my_print_defaults
242 fi
243
244 #
245 # Read defaults file from ‘basedir‘.   If there is no defaults file there
246 # check if it‘s in the old (depricated) place (datadir) and read it from there
247 #
248
249 #配置文件的目录,先从basedir读取,不行再读取datadir的
250 extra_args=""
251 if test -r "$basedir/my.cnf"
252 then
253   extra_args="-e $basedir/my.cnf"
254 else
255   if test -r "$datadir/my.cnf"
256   then
257     extra_args="-e $datadir/my.cnf"
258   fi
259 fi
260
261 #使用parse_server_arguments函数和my_print_defaults 从my.cnf 中获取相应的参数并付给相应的变量
262 parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
263
264 #
265 # Set pid file if not given
266 #指定mysql启动时进程文件的位置
267 if test -z "$mysqld_pid_file_path"
268 then
269   mysqld_pid_file_path=$datadir/`hostname`.pid
270 else
271   case "$mysqld_pid_file_path" in
272     /* ) ;;
273     * )  mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;;
274   esac
275 fi
276
277 case "$mode" in
278   ‘start‘)
279     # Start daemon
280
281     # Safeguard (relative paths, core dumps..)
282     cd $basedir
283
284     echo $echo_n "Starting MySQL"
285     if test -x $bindir/mysqld_safe  #如果mysqld_safe存在且可执行
286     then
287       # Give extra arguments to mysqld with the my.cnf file. This script
288       # may be overwritten at next upgrade.
289       #关键语句,启动mysqld_safe,传入3个参数:datadir,pid-file,other_args;将输出丢弃到系统黑洞/dev/null
290       $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
291       wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
292
293       # Make lock for RedHat / SuSE          #mysql锁的检测和创建
294       if test -w "$lockdir"       #如果存在且可写
295       then
296         touch "$lock_file_path"
297       fi
298
299       exit $return_value
300     else
301       log_failure_msg "Couldn‘t find MySQL server ($bindir/mysqld_safe)"
302     fi
303     ;;
304
305   ‘stop‘)
306     # Stop daemon. We use a signal here to avoid having to know the
307     # root password.
308
309     if test -s "$mysqld_pid_file_path"    #如果非空
310     then
311       mysqld_pid=`cat "$mysqld_pid_file_path"`      #获取mysqld进程
312
313       if (kill -0 $mysqld_pid 2>/dev/null)
314       then
315         echo $echo_n "Shutting down MySQL"
316         kill $mysqld_pid                             #杀死
317         # mysqld should remove the pid file when it exits, so wait for it.
318         wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
319       else
320         log_failure_msg "MySQL server process #$mysqld_pid is not running!"
321         rm "$mysqld_pid_file_path"
322       fi
323
324       # Delete lock for RedHat / SuSE
325       if test -f "$lock_file_path"    #如果存在锁,需要移除
326       then
327         rm -f "$lock_file_path"
328       fi
329       exit $return_value
330     else
331       log_failure_msg "MySQL server PID file could not be found!"
332     fi
333     ;;
334
335   ‘restart‘)
336     # Stop the service and regardless of whether it was          #重启mysql
337     # running or not, start it again.
338     if $0 stop  $other_args; then
339       $0 start $other_args
340     else
341       log_failure_msg "Failed to stop running server, so refusing to try to start."
342       exit 1
343     fi
344     ;;
345
346   ‘reload‘|‘force-reload‘)                        #重载mysql
347     if test -s "$mysqld_pid_file_path" ; then
348       read mysqld_pid <  "$mysqld_pid_file_path"
349       kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL"
350       touch "$mysqld_pid_file_path"
351     else
352       log_failure_msg "MySQL PID file could not be found!"
353       exit 1
354     fi
355     ;;
356   ‘status‘)
357     # First, check to see if pid file exists           #mysql的状态
358     if test -s "$mysqld_pid_file_path" ; then
359       read mysqld_pid < "$mysqld_pid_file_path"
360       if kill -0 $mysqld_pid 2>/dev/null ; then
361         log_success_msg "MySQL running ($mysqld_pid)"
362         exit 0
363       else
364         log_failure_msg "MySQL is not running, but PID file exists"
365         exit 1
366       fi
367     else
368       # Try to find appropriate mysqld process
369       mysqld_pid=`pidof $libexecdir/mysqld`
370
371       # test if multiple pids exist
372       pid_count=`echo $mysqld_pid | wc -w`
373       if test $pid_count -gt 1 ; then
374         log_failure_msg "Multiple MySQL running but PID file could not be found ($mysqld_pid)"
375         exit 5
376       elif test -z $mysqld_pid ; then
377         if test -f "$lock_file_path" ; then
378           log_failure_msg "MySQL is not running, but lock file ($lock_file_path) exists"
379           exit 2
380         fi
381         log_failure_msg "MySQL is not running"
382         exit 3
383       else
384         log_failure_msg "MySQL is running but PID file could not be found"
385         exit 4
386       fi
387     fi
388     ;;
389     *)
390       # usage            #输出用法的提示
391       basename=`basename "$0"`
392       echo "Usage: $basename  {start|stop|restart|reload|force-reload|status}  [ MySQL server options ]"
393       exit 1
394     ;;
395 esac
396
397 exit 0
时间: 2024-08-29 23:01:29

mysql启动脚本详解的相关文章

mysql服务启动脚本详解

1 #!/bin/sh 2 # Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB 3 # This file is public domain and comes with NO WARRANTY of any kind 4 5 # MySQL daemon start/stop script. 6 7 # Usually this is put in /etc/init.d (at lea

Linux开机启动程序详解

我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. 加载内核LILO启动之后,如果你选择了Linux作为准备引导的操作系统,第一个被加载的东西就是内核.请记住此时的计算机内存中还不存在任何操作系统,PC(因为它们天然的设计缺陷)也还没有办法存取机器上全部的内存.因此,内核就必须完整地加载到可用RAM的第一个兆字节之内.为了实现这个目的,内核是被压缩了的.这个文件的头部包含着

Linux如何实现开机启动程序详解

Linux开机启动程序详解我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. 加载内核LILO启动之后,如果你选择了Linux作为准备引导的操作系统,第一个被加载的东西就是内核.请记住此时的计算机内存中还不存在任何操作系统,PC(因为它们天然的设计缺陷)也还没有办法存取机器上全部的内存.因此,内核就必须完整地加载到可用RAM的第一个兆字节之内.为了实现这个目的,内核是被压缩

MySQL数据库优化详解(收藏)

MySQL数据库优化详解 mysql表复制 复制表结构+复制表数据mysql> create table t3 like t1;mysql> insert into t3 select * from t1;mysql索引 ALTER TABLE用来创建普通索引.UNIQUE索引或PRIMARY KEY索引ALTER TABLE table_name ADD INDEX index_name (column_list)ALTER TABLE table_name ADD UNIQUE (colu

Yahoo的MySQL性能分析器详解

Yahoo的MySQL性能分析器详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.介绍 Yahoo于前日开源了自己的MySQL性能分析器(MySQL Performance Analyzer),源码托管在GitHub.此性能分析器使用Maven构建,需要JDK 8和Maven 3.0. 此性能分析器项目包含了两个子项目: 1)Java Web应用项目:myperf 2)Jetty Web服务器项目:jetty wrapper 虽然项目在pom

Linux如何实现开机启动程序详解(转)

Linux开机启动程序详解我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. 加载内核LILO启动之后,如果你选择了Linux作为准备引导的操作系统,第一个被加载的东西就是内核.请记住此时的计算机内存中还不存在任何操作系统,PC(因为它们天然的设计缺陷)也还没有办法存取机器上全部的内存.因此,内核就必须完整地加载到可用RAM的第一个兆字节之内.为了实现这个目的,内核是被压缩

MySQL数据库备份详解

原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据可能也已经被删除了, 我们不能使用从数据库上的数据来恢复主数据库上的数据,只能通过备份进行误删除数据的恢复 一. 备份的分类 1.按备份的结果来分: 逻辑备份 其备份结果为SQL语句,适合于所有存储引擎,恢复时需要较多时间,逻辑备份时,对于MyISAM存储引擎是需要进行锁表操作的,通过使用的mysq

MySQL配置文件mysql.ini参数详解、MySQL性能优化

MySQL配置文件mysql.ini参数详解.MySQL性能优化 my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数. my.ini分为两块:Client Section和Server Section.   Client Section用来配置MySQL客户端参数.   要查看配置参数可以用下面的命令: show variables like '%innodb%'; # 查看innodb相关配置参数 show status like

cmd下 mysql操作命令大全详解

启动:net start mySql; 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName; 列出数据库:show databases; 选择数据库:use databaseName; 列出表格:show tables: 显示表格列的属性:show columns from tableName: 建立数据库:source fileName.txt; 匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串; 增加一个字段