Chinaunix首页 | 论坛 | 博客
  • 博客访问: 472633
  • 博文数量: 57
  • 博客积分: 877
  • 博客等级: 准尉
  • 技术积分: 1275
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-24 16:16
文章分类

全部博文(57)

文章存档

2014年(2)

2013年(15)

2012年(20)

2011年(20)

我的朋友

分类: Mysql/postgreSQL

2012-11-28 23:37:03

mysql.server 调用mysqld_safe的时候并把一些必要的参数传给mysqld_safe,它就开始运行了。

查看了一下mysqld_safe的代码,有831(包括注释

点击(此处)折叠或打开

  1. [root@media bin]# wc -l mysqld_safe
  2. 831 mysqld_safe


仔细看了一下这个脚本,主要分为4部分

1:函数,后面需要调用这些函数

2:确定参数,把这个参数传入到mysqld 命令中去

3:启动mysql服务

4:监控mysql服务


一:函数和参数值

mysqld_safe这个脚本中,定义了不少函数

my_which()

log_generic ()

log_error ()

log_notice ()

eval_log_error ()

shell_quote_string()

parse_arguments()

add_mysqld_ld_preload()

mysqld_ld_preload_text()

get_mysql_config()

set_malloc_lib()

append_arg_to_args();

其中parse_arguments() append_arg_to_args() 2个函数比较重要,一个是用来解析参数的,一个是用来把参数链接起来.

parse_arguments `$print_defaults $defaults --loose-verbose mysqld server`

就是把 my.cnf 配置文件里的参数解析出来。

下面来查看一下 parse_arguments() 代码

点击(此处)折叠或打开

  1. parse_arguments() {
  2. # We only need to pass arguments through to the server if we don't
  3. # handle them here. So, we collect unrecognized options (passed on
  4. # the command line) into the args variable.
  5. pick_args=1
  6. if test "$1" = PICK-ARGS-FROM-ARGV
  7. then
  8. pick_args=1
  9. shift
  10. fi
  11. for arg do
  12. # the parameter after "=", or the whole $arg if no match
  13. val=`echo "$arg" | sed -e 's;^--[^=]*=;;'`
  14. # what's before "=", or the whole $arg if no match
  15. optname=`echo "$arg" | sed -e 's/^\(--[^=]*\)=.*$/\1/'`
  16. # replace "_" by "-" ; mysqld_safe must accept "_" like mysqld does.
  17. optname_subst=`echo "$optname" | sed 's/_/-/g'`
  18. arg=`echo $arg | sed "s/^$optname/$optname_subst/"`
  19. case "$arg" in
  20. # these get passed explicitly to mysqld
  21. --basedir=*) MY_BASEDIR_VERSION="$val" ;;
  22. --datadir=*) DATADIR="$val" ;;
  23. --pid-file=*) pid_file="$val" ;;
  24. --plugin-dir=*) PLUGIN_DIR="$val" ;;
  25. --user=*) user="$val"; SET_USER=1 ;;
  26. # these might have been set in a [mysqld_safe] section of my.cnf
  27. # they are added to mysqld command line to override settings from my.cnf
  28. --log-error=*) err_log="$val" ;;
  29. --port=*) mysql_tcp_port="$val" ;;
  30. --socket=*) mysql_unix_port="$val" ;;
  31. # mysqld_safe-specific options - must be set in my.cnf ([mysqld_safe])!
  32. --core-file-size=*) core_file_size="$val" ;;
  33. --ledir=*) ledir="$val" ;;
  34. --malloc-lib=*) set_malloc_lib "$val" ;;
  35. --mysqld=*) MYSQLD="$val" ;;
  36. --mysqld-version=*)
  37. if test -n "$val"
  38. then
  39. MYSQLD="mysqld-$val"
  40. PLUGIN_VARIANT="/$val"
  41. Else
  42. MYSQLD="mysqld"
  43. fi
  44. ;;
  45. --nice=*) niceness="$val" ;;
  46. --open-files-limit=*) open_files="$val" ;;
  47. --open_files_limit=*) open_files="$val" ;;
  48. --skip-kill-mysqld*) KILL_MYSQLD=0 ;;
  49. --syslog) want_syslog=1 ;;
  50. --skip-syslog) want_syslog=0 ;;
  51. --syslog-tag=*) syslog_tag="$val" ;;
  52. --timezone=*) TZ="$val"; export TZ; ;;
  53. --help) usage ;;
  54. *)
  55. if test -n "$pick_args"
  56. then
  57. append_arg_to_args "$arg"
  58. fi
  59. ;;
  60. esac
  61. done
  62. }

这里可以比较清楚的看出这个函数的功能是把一些参数解析出来并赋予给某个变量,把解析不了的参数追加到 $arg 变量中,但前提是pick_args 参数不为0

Note:这里不能解析的变量指的是 除去以下参数的其他参数

--no-defaults

 --defaults-file=FILE      

 --defaults-extra-file=FILE

--ledir=DIRECTORY         

--open-files-limit=LIMIT  

--core-file-size=LIMIT    

--timezone=TZ             

--malloc-lib=LIB         

--mysqld=FILE             

--mysqld-version=VERSION  

 --nice=NICE               

--plugin-dir=DIR                                     

--skip-kill-mysqld        

--syslog                  

--skip-syslog             

--syslog-tag=TAG         

  在这个函数中,pick_args这个参数初始值是为空,就是说如果是不能解析的参数,是不会追加到$arg变量中的,这会导致当你把启动mysql的参数都写到my.cnf配置文件中,他只会读取能解析的那几个参数,另外的都忽略了。解决的办法:1)写上—defaults-extra-file 的参数值2)修改函数中pick_args变量值,修改为一个非空值即可。

另外在启动mysql服务之前,还有设定一些参数,主要是设定一些启动mysql时候所产生的错误日志(err.log)和系统日志(syslog),可方便mysql错误的时候可以方便检查,还是就是pid_file,另外还有2个系统内核参数,open_files_limitscore_files_limits

   在确定了启动参数以后,就需要把mysqld命令和所需要的参数链接到一起:

点击(此处)折叠或打开

  1. cmd="`mysqld_ld_preload_text`$NOHUP_NICENESS"
  2. for i in "$ledir/$MYSQLD" "$defaults" "--basedir=$MY_BASEDIR_VERSION" \
  3. "--datadir=$DATADIR" "--plugin-dir=$plugin_dir" "$USER_OPTION"
  4. do
  5. cmd="$cmd "`shell_quote_string "$i"`
  6. done
  7. cmd="$cmd $args"
  8. # Avoid 'nohup: ignoring input' warning
  9. test -n "$NOHUP_NICENESS" && cmd="$cmd < /dev/null"

二:mysql 启动和监控

启动mysql的代码如下:


点击(此处)折叠或打开

  1. eval_log_error "$cmd"

看下eval_log_error 这个函数

点击(此处)折叠或打开

  1. eval_log_error () {
  2. cmd="$1"
  3. case $logging in
  4. file) cmd="$cmd >> "`shell_quote_string "$err_log"`" 2>&1" ;;
  5. syslog)
  6. # mysqld often prefixes its messages with a timestamp, which is
  7. # redundant when logging to syslog (which adds its own timestamp)
  8. # However, we don't strip the timestamp with sed here, because
  9. # sed buffers output (only GNU sed supports a -u (unbuffered) option)
  10. # which means that messages may not get sent to syslog until the
  11. # mysqld process quits.
  12. cmd="$cmd 2>&1 | logger -t '$syslog_tag_mysqld' -p daemon.error"
  13. ;;
  14. *)
  15. echo "Internal program error (non-fatal):" \
  16. " unknown logging method '$logging'" >&2
  17. ;;
  18. esac
  19. #echo "Running mysqld: [$cmd]"
  20. eval "$cmd"
  21. }

eval "$cmd"  这一行才是真正启动mysq服务的命令l

 mysql 监控主要体现在当mysql宕掉的时候或者hang住的时候会自动重启mysql服务,用了一个while true的一个循环来实现的。或许这就是为什么叫mysql_safe  的原因了!

 

 --------------------觉得后面写的有点凌乱了,真觉得自己的表达能力还需加强





(function(w, d, g, J) { var e = J.stringify || J.encode; d[g] = d[g] || {}; d[g]['showValidImages'] = d[g]['showValidImages'] || function() { w.postMessage(e({'msg': {'g': g, 'm':'s'}}), location.href); } })(window, document, '__huaban', JSON);
阅读(3339) | 评论(2) | 转发(0) |
0

上一篇:Mysql 启动区别(1)

下一篇:oracle imp 小记

给主人留下些什么吧!~~

ning_lianjie2012-12-07 08:57:04

能够仔细研究mysql.server脚本,精神可嘉.赞一个.表达能力是可以改进的.期待博主更精彩的分析.
略微提示一下:
mysql.server 是启动和终止MySQL服务器的脚本.
mysqld 是真正的MySQL服务器,可以用ps查看进程得知.
mysqld_safe用来启动和监控MySQL服务器的脚本.

个人愚见:mysql.server使用方便,是对mysqld_safe的"包装".