MySQL服务启动脚本完全解析

脚本主要分3大部分:变量初始化部分,函数申明部分,具体执行部分

变量初始化部分:

line45:供用户设置basedir变量的值,默认值为空
line46:供用户设置datadir变量的值,默认值为空
line51:供用户设置pid_file变量的值(如果希望用mysqlmanager启动server,则设置这个变量),默认值为空
line52:供用户设置server_pid_file变量的值(如果希望用mysqld_safe启动 server,则设置这个变量),默认值为空
line53:供用户设置use_mysqld_safe变量的值,决定使用mysqld_safe还是 mysqlmanager启动server,默认值为1
line54:供用户设置user变量的值,默认值为空
line77:供用户设置datadir_set变量的值,默认值为空

line55-73:确定basedir和 datadir变量的值
如果用户设置的basedir不存在,那么

  * basedir=/usr/local
  * bindir=/usr/local/bin
  * sbindir=/usr/local/sbin
  * libexecdir=/usr/local/libexec

如果用户设置的basedir存在,那么

  * bindir=$basedir/bin
  * sbindir=$basedir/sbin
  * libexecdir=$basedir/libexec

line96:PATH=/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin

函数申明部分

line82-94:函数申明 log_success_msg()及log_error_msg():
  用途:
    用于显示reload函数的执行结果
  接受参数:
    所要显示的信息
  行为:
    如果/lib/lsb/init-functions存在,那么引入这两个函数的申明
    如果不存在,那么手动申明这两个函数

line101-105:决定系统对echo \c 和 echo -n 的结果

line107-127:函数申明 parse_server_arguments():
  用途:
    通过解析my_print_defaults的结果,来设置一些基础变量的值
  接受参数:
    my_print_defaults的结果
  行为:
   分别设置以下变量:
   basedir、bindir、datadir、sbindir、libexecdir、user、pid-file、use- mysqld_safe、use-manager

line129-136:函数申明 parse_manager_arguments():
  用途:
    用mysqlmanager启动时的参数解析
  接受参数:
    需要解析的参数
  行为:
    如果/lib/lsb/init-functions存在,那么引入这两个函数的申明
    如果不存在,那么手动申明这两个函数

line138-163:函数申明 wait_for_pid():
  用途:
    在start和stop用于等待pid的生成和删除
  输入参数:
    ‘created’ ‘removed’两种值
  行为:
    循环判断35次,每秒一次,根据输入参数去判断pid文件是否被创建或移除。
    如果成功,则log_success_msg
    如果达到超时,则log_failure_msg

主体执行部分:

line165-202:确定二进制可执行程序my_print_defaults的位置。先后顺序如下:  
  其中$d 是从/etc/my.cnf 中的basedir取值的。

  * ./bin/my_print_defaults
  * $bindir/my_print_defaults
  * $bindir/mysql_print_defaults
  * $d/bin/my_print_defaults
  * $d/bin/mysql_print_defaults
  * my_print_defaults   (即my_print_defaults在path中)

line204-218:确定my.cnf 的位置。先后顺序如下:
  其中$d 是从/etc/my.cnf 中的basedir取值的。

  * $basedir/my.cnf
  * $datadir/my.cnf
  * $bindir/mysql_print_defaults
  * $d/bin/my_print_defaults
  * $d/bin/mysql_print_defaults
  * my_print_defaults   (即my_print_defaults在path中)

line220-223:使用预先设置的变量,通过以下两条命令,解析启动必要的参数
  parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
  parse_manager_arguments `$print_defaults $extra_args manager`

line225-236:获得pid- file变量的值,优先级依次是:

  * $pid_file (如果$pid_file是绝对路径)
  * $datadir/$pid_file (如果$pid_file是相对路径)
  * $datadir/mysqlmanager-`/bin/hostname`.pid (之前没有设置$pid_file)

line237-245:获得pid- file变量的值,优先级依次是:

  * $pid_file (如果$pid_file是绝对路径)
  * $datadir/$server_pid_file (如果$pid_file是相对路径)
  * $datadir/`/bin/hostname`.pid (之前没有设置$pid_file)

start部分

用于启动mysql服务器

line254-261:初始化 mysqlmanager可执行程序的路径$libexecdir/mysqlmanager或者$sbindir/mysqlmanager或者$sbindir/mysqlmanager

line264-275:如果mysqlmanager存在并可执行,且$use_mysqld_safe设置为0,那么尝试使用mysqlmanager进行启动
  启动命令:mysqlmanager –user=$user –pid-file=$pid_file >/dev/null 2>&1 &
  使用wait_for_pid created 等待mysqlserver的启动。
  然后创建系统服务锁:/var/lock/subsys/mysqlmanager

line276-288:如果 mysqld_safe存在并可执行,并且$use_mysqld_safe设置不为0
  启动命令:$bindir/mysqld_safe –datadir=$datadir –pid-file=$server_pid_file >/dev/null 2>&1 &
  如果启动成功,创建一个/var/lock/subsys/mysql锁文件。

line289-291:如果 mysqld_safe和mysqlmanager都不可执行,则报错:”Couldn’t find MySQL manager or server”

stop部分

用于关闭mysql服务器

line299-306:分别判断$pid_file和$server_pid_file两个文件是否存在,来判断server是通过何种方式启动的
line310-320:通过pid-file获得server的pid号,使用 kill $pid 的方式关闭服务器
  使用wait_for_pid removed等待server关闭
  如果server是通过mysqlmanager启动的那么删除系统锁文件:/var/lock/subsys/mysqlmanager
  如果server是通过mysql_safe启动的那么删除系统锁文件:/var/lock/subsys/mysql
line321-324:如果找不到pid-file则报错”MySQL manager or server PID file could not be found!”

restart部分

重启mysql服务器

line326-331:依次调用stop 和start函数

reload部分

重新装载mysql的配置文件

line333-341:先通过$server_pid_file获得server的pid
  然后执行kill -HUP $mysqld_pid进行配置重载
  并根据执行情况,调用log_success_msg “Reloading service MySQL”或者log_failure_msg “MySQL PID file could not be found!”报告结果

文章来源

linux/mysql-server-script.txt · 最后更改: 2010/04/15 07:10 由 lostsnow
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki