mysql通过safe_mysql&启动_mysqld_safe启动脚本源码阅读、分析_MySQL

前几天读了下mysqld_safe脚本,个人感觉还是收获蛮大的,其中细致的交代了MySQL数据库的启动流程,包括查找MySQL相关目录,解析配置文件以及最后如何调用mysqld程序来启动实例等,有着不错的参考价值;与此同时,脚本中涉及了很多shell编程中的小技巧,像变量解析,sed替换转义,进程优先级的判断以及无处不在test结构等等,当作Linux shell的学习素材还是非常合适的,下面是我的环境:

数据库版本: MySQL 5.1.45

操作系统版本: Red Hat Enterprise Linux AS release 4 (Nahant Update 3)

MySQL基目录: /usr/local/mysql3306

配置文件目录: /usr/local/mysql3306/etc

数据库是安装好了的,代码如下:#!/bin/sh# 一些状态变量的定义KILL_MYSQLD=1; # 试图kill多余的mysqld_safe程序,1表示需要killMYSQLD= # mysqld二进制可执行文件的名称niceness=0 # 进程的调度优先级标识# 下面的变量主要用于标识不使用错误日志和sysloglogging=init # 日志记录状态,init代表初始化want_syslog=0 # 标识是否要使用syslogsyslog_tag=user='mysql' # --user选项值pid_file= # pid文件的路径err_log= # 错误日志的路径# 这两个都是定义的syslog中标志位,在后面需要写入日志到syslog中时使用syslog_tag_mysqld=mysqldsyslog_tag_mysqld_safe=mysqld_safetrap '' 1 2 3 15# 不允许程序在终端上被人打断(包括挂起,中断,退出,系统终止的情形)umask 007 # 默认权限770,其他组用户对该程序创建的文件没有任何权限# defaults变量记载使用的配置文件的信息defaults=case "$1" in --no-defaults|--defaults-file=*|--defaults-extra-file=*) defaults="$1"; shift ;;esac# usage()函数:使用--help选项时输出的使用帮助信息usage () { cat <> "$err_log" ;; # 记录到err_log中 syslog) logger -t "$syslog_tag_mysqld_safe" -p "$priority" "$*" ;; # 使用logger记录到系统日志中 *) echo "Internal program error (non-fatal):" / " unknown logging method '$logging'" >&2 ;; esac}# 下面两个函数是对log_generic函数中不同分类的引用log_error () { log_generic daemon.error "$@" >&2}log_notice () { log_generic daemon.notice "$@"}# 后面就是用它启动的mysqld,通过logging变量区分记录日志的类型,分错误日志和系统日志syslog两种# 最后的eval命令会解析 $cmd 中的值并执行命令eval_log_error () { cmd="$1" case $logging in file) cmd="$cmd >> "`shell_quote_string "$err_log"`" 2>&1" ;; syslog) cmd="$cmd 2>&1 | logger -t '$syslog_tag_mysqld' -p daemon.error" ;; *) echo "Internal program error (non-fatal):" / " unknown logging method '$logging'" >&2 ;; esac #echo "Running mysqld: [$cmd]" eval "$cmd"}# 转义函数,用于在非"a-z","A-Z","09",'/','_','.','=','-'的特殊字符前加上一个"/"# sed中的/1代表引用前面/(/)中匹配的值shell_quote_string() { echo "$1" | sed -e 's,/([^a-zA-Z0-9/_.=-]/),///1,g'}# 该函数用于解析配置文件中的选项,并赋值给相应的变量parse_arguments() { pick_args= if test "$1" = PICK-ARGS-FROM-ARGV then pick_args=1 shift fi for arg do # 取出参数值,比如 --port=3306 结果为: val = 3306 注意这里sed中使用;来分割,等同于/ val=`echo "$arg" | sed -e "s;--[^=]*=;;"` case "$arg" in # 将参数值传递给对应的变量 --basedir=*) MY_BASEDIR_VERSION="$val" ;; --datadir=*) DATADIR="$val" ;; --pid-file=*) pid_file="$val" ;; --user=*) user="$val"; SET_USER=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值