# Get arguments from the my.cnf file, # the only group, which is read from now on is [mysqld] if test -x ./bin/my_print_defaults then print_defaults="./bin/my_print_defaults" elif test -x $bindir/my_print_defaults then print_defaults="$bindir/my_print_defaults" elif test -x $bindir/mysql_print_defaults then print_defaults="$bindir/mysql_print_defaults" else # Try to find basedir in /etc/my.cnf conf=/etc/my.cnf print_defaults= if test -r $conf then subpat='^[^=]*basedir[^=]*=\(.*\)$' dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf` for d in $dirs do d=`echo $d | sed -e 's/[ ]//g'` if test -x "$d/bin/my_print_defaults" then print_defaults="$d/bin/my_print_defaults" break fi if test -x "$d/bin/mysql_print_defaults" then print_defaults="$d/bin/mysql_print_defaults" break fi done fi # Hope it's in the PATH ... but I doubt it test -z "$print_defaults" && print_defaults="my_print_defaults" fi
查找默认的配置文件
-r file 如果文件可读,则为真
# # Read defaults file from 'basedir'. If there is no defaults file there # check if it's in the old (depricated) place (datadir) and read it from there # extra_args="" if test -r "$basedir/my.cnf" then extra_args="-e $basedir/my.cnf" else if test -r "$datadir/my.cnf" then extra_args="-e $datadir/my.cnf" fi fi
解析配置文件中的参数
my_print_defaults的用法如下:
my_print_defaults --defaults-file=example.cnf client mysql
即读取配置文件中,client和mysql部分的参数配置,
具体在本脚本中,是读取mysqld,server,mysql_server,mysql.server四个部分的配置参数。
parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
设置pid file的路径
-z string 判断字符串是否为空
如果--pid-file没有在读取到的配置文件中设置或者脚本刚开始的mysqld_pid_file_path参数没有设置,
则pid file默认设置在datadir下,以主机名.pid命名。
如果该参数设置了,还需要进一步判断
如果该参数中带有斜杠,则代表给定的值带有路径,可直接使用。
如果该参数中没带路径,则代表给定的值只是pid的文件名,可将其设在datadir下。
# # Set pid file if not given # if test -z "$mysqld_pid_file_path" then mysqld_pid_file_path=$datadir/`hostname`.pid else case "$mysqld_pid_file_path" in /* ) ;; * ) mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;; esac fi
服务脚本start选项
首先,切换到$basedir中
其次,判断$basedir/bin中的mysqld_safe是否是可执行文件,如果是,则启动mysqld实例,如果不是,则报错退出。
那么,启动流程又是如何实现的呢?
首先,执行$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &命令,启动mysqld实例。
注意到没有,mysqld_safe其实是在basedir中执行的,包括mysql初始化脚本mysql_install_db,也建议在basedir中执行,具体可参考:
分析MariaDB初始化脚本mysql_install_db
然后通过wait_for_pid函数进行判断,具体可见下文对于wait_for_pid函数的分析
判断完毕后,
查看$lockdir目录是否可写,可写的话,则在目录上创建一个文件。