200 ? "200px" : this.width)!important;}
-->

介绍

本篇文章主要从查看MySQL的启动命令的代码来详细了解MySQL的启动过程,内容多为概念知识;理解MySQL的启动原理对熟悉MySQL至关重要,启动mysql服务有三种方式分别是:mysql.sever,mysqld,mysqld_safe。

my.cnf

[client]
socket=/tmp/mysql.sock
port=
[mysqld]
#################[base]##########################
basedir =/usr/local/mysql
datadir =/data/mysql/
innodb_data_home_dir=/data/mysql/
innodb_log_group_home_dir=/data/mysql/
port =
user=mysql
pid-file=/data/mysql/mysql.pid
socket =/tmp/mysql.sock
default_storage_engine=innodb
character_set_server=utf8
open_files_limit= [mysqld_safe]
log_error=/usr/local/mysql/log/mysql-error.log
pid-file=/usr/local/mysql/log/mysql.pid
open_files_limit=

mysql.server

默认的mysql的服务启动程序是mysql.server,mysql.server程序主要是会用到两个程序和一个函数,分别是my_print_defaults、myslqd_safe和parse_server_arguments

  • my_print_defaults:读取my.cnf配置文件,输出参数传递给parse_server_arguments,该程序只读my.cnf中[mysqld]中的参数。
  • parse_server_arguments:该函数处理my_print_defaults传递过来的参数赋值给--basedir、--datadir、--pid-file、--server-startup-timeout
  • myslqd_safe:mysqld_safe程序调用mysqld程序来启动mysql服务

mysql.server

parse_server_arguments

查看mysql进程信息可以看到通过mysql.server启动首先会对参数--datedir和--pid-file赋值,这两个参数是从my.cnf文件[mysqld]部分中读取来的,而且这两个参数的值不会受到mysqld_safe程序中的参数赋值给覆盖。但是在my.cnf中其它的参数值如果[mysqld]和[mysqld_safe]相同的话就以mysqld_safe为主,上图中的--open-files-limit就是说明的例子。

mysqld_safe

在以前老的版本mysqld_safe是主要的启动方式,而且参数也非常多;对于多实例的服务器需要用到mysqld_safe来启动。mysqld_safe会调用mysqld程序启动mysql服务,并且mysqld_safe会读取my.cnf中的配置参数值来启动mysql服务。mysqld_safe本身也有一些启动参数并且这些启动参数优先于配置文件中相应的参数。

mysqld_safe --help

  --no-defaults                     不读任何选项文件
--defaults-file=FILE 配置自定义的默认文件,如果是多实例的服务器这里就需要配置成对应的my.cnf
--defaults-extra-file=FILE 除了默认文件之外所读取的选项文件名
--ledir=DIRECTORY : 指定mysqld文件所在的路径,对于多实例的服务器可以用来分别指定实例的位置。
--open-files-limit=LIMIT 能打开的最大文件数量
--core-file-size=LIMIT mysqld能够创建的内核文件的大小。选项值传递给ulimit -c
--timezone=TZ : 为给定的选项值设置TZ时区环境变量。从操作系统文档查阅合法的时区规定格式
--malloc-lib=LIB 预加载共享库lib
--mysqld=FILE 想要启动的服务器程序名(在ledir目录)。默认是mysqld也可以是其它的名称。
--mysqld-version=VERSION 如果你使用--mysqld-version =max,mysqld_safe启动ledir目录中的mysqld-max程序。如果--mysqld-version的参数为空,mysqld_safe使用目录中的mysqld。
--nice=NICE 使用nice程序根据给定值来设置mysqld的调度优先级。
--plugin-dir=DIR 配置mysql服务的plugin路径,/usr/local/mysql/lib/plugin
--skip-kill-mysqld Don't try to kill stray mysqld processes
--syslog Log messages to syslog with 'logger'
--skip-syslog Log messages to error log (default)
--syslog-tag=TAG Pass -t "mysqld-TAG" to 'logger'

pare_arguments函数

该函数是mysqld_safe程序中用来处理参数的一个函数,从下面的代码中可以了解到mysqld_safe主要处理哪些参数。


parse_arguments() {
# We only need to pass arguments through to the server if we don't
# handle them here. So, we collect unrecognized options (passed on
# the command line) into the args variable.
pick_args=
if test "$1" = PICK-ARGS-FROM-ARGV
then
pick_args=
shift
fi for arg do
# the parameter after "=", or the whole $arg if no match
val=`echo "$arg" | sed -e 's;^--[^=]*=;;'`
# what's before "=", or the whole $arg if no match
optname=`echo "$arg" | sed -e 's/^\(--[^=]*\)=.*$/\1/'`
# replace "_" by "-" ; mysqld_safe must accept "_" like mysqld does.
optname_subst=`echo "$optname" | sed 's/_/-/g'`
arg=`echo $arg | sed "s/^$optname/$optname_subst/"`
case "$arg" in
# these get passed explicitly to mysqld
--basedir=*) MY_BASEDIR_VERSION="$val" ;;
--datadir=*) DATADIR="$val" ;;
--pid-file=*) pid_file="$val" ;;
--plugin-dir=*) PLUGIN_DIR="$val" ;;
--user=*) user="$val"; SET_USER= ;; # these might have been set in a [mysqld_safe] section of my.cnf
# they are added to mysqld command line to override settings from my.cnf
--log-error=*) err_log="$val" ;;
--port=*) mysql_tcp_port="$val" ;;
--socket=*) mysql_unix_port="$val" ;; # mysqld_safe-specific options - must be set in my.cnf ([mysqld_safe])!
--core-file-size=*) core_file_size="$val" ;;
--ledir=*) ledir="$val" ;;
--malloc-lib=*) set_malloc_lib "$val" ;;
--mysqld=*) MYSQLD="$val" ;;
--mysqld-version=*)
if test -n "$val"
then
MYSQLD="mysqld-$val"
PLUGIN_VARIANT="/$val"
else
MYSQLD="mysqld"
fi
;;
--nice=*) niceness="$val" ;;
--open-files-limit=*) open_files="$val" ;;
--open_files_limit=*) open_files="$val" ;;
--skip-kill-mysqld*) KILL_MYSQLD= ;;
--syslog) want_syslog= ;;
--skip-syslog) want_syslog= ;;
--syslog-tag=*) syslog_tag="$val" ;;
--timezone=*) TZ="$val"; export TZ; ;; --help) usage ;; *)
if test -n "$pick_args"
then
append_arg_to_args "$arg"
fi
;;
esac
done
}

通过mysqd_safe启动

查看mysql进程信息可以看到通过mysqld_safe启动mysql服务后,myslqd_safe会对my.cnf配置文件的配置进行读取,如果配置文件中【mysqld】和【mysqld_safe】同时配置了相同的参数以[mysqld_safe]为主,所以会看到--pid-file也是以my.cnfa文件中的[mysqld_safe]中的为主。

mysqld

直接运行mysqld程序也是可以启动mysql服务,mysqld会使用默认的配置进行启动,对于多实例的mysql使用这种方法就不好实现。

总结

在现在的新版本中不建议在[mysqld_safe]中进行参数的配置,对应多实例的服务器在启动的时候可以通过mysqld_safe来指定不同实例的路径和配置文件进行启动,需要用到----defaults-file、--ledir两个参数进行启动,从启动的代码可以看出mysql的启动要用到的两个关键参数--datadir --pid-file,所以为什么经常会在启动和关闭mysql的时候提示找不到pid了。

备注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

《欢迎交流讨论》

MySQL 启动原理剖析的更多相关文章

  1. Android启动原理剖析

    我们知道Android是以一个Activity为单位的,可是我们并没有看到一个Activity是怎么開始启动的. 今天我 们就从Android的源码開始讲吧. ActivityThread: Andr ...

  2. mysql索引原理剖析

    一.索引的原理 所谓索引,即是快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(B+树相比B树,其非叶子节点占用更小的空间,可以有更多非叶子节点存放在再内存中,减少大量的IO ...

  3. 64、Spark Streaming:StreamingContext初始化与Receiver启动原理剖析与源码分析

    一.StreamingContext源码分析 ###入口 org.apache.spark.streaming/StreamingContext.scala /** * 在创建和完成StreamCon ...

  4. MySQL读取配置文件的顺序、启动方式、启动原理

    一.MySQL读取配置文件的顺序 读取顺序:/etc/my.cnf > /etc/mysql/my.cnf > /usr/etc/my.cnf > ~/.my.cnf 命令验证:[r ...

  5. mysql启动过程

    MYSQL启动过程经过以下顺序 1.mysql读取配置文件的顺序 读取顺序 /etc/my.cnf>/etc/mysql/my.cnf>/usr/etc/my.cnf ~/.my.cnf ...

  6. 原理剖析-Netty之服务端启动工作原理分析(下)

    一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分 ...

  7. 46、Spark SQL工作原理剖析以及性能优化

    一.工作原理剖析 1.图解 二.性能优化 1.设置Shuffle过程中的并行度:spark.sql.shuffle.partitions(SQLContext.setConf()) 2.在Hive数据 ...

  8. ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行

    ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行 核心框架 ASP.NET Core APP 创建与运行 总结 之前两篇文章简析.NET Core 以及与 .NET Framew ...

  9. [转]MySQL主从复制原理介绍

    MySQL主从复制原理介绍 一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以 ...

随机推荐

  1. Aspx页面模拟WebService功能

    在后台引入 using System.Web.Services 命名空间 然后在编写web服务方法: [WebMethod] public static string GetData(string t ...

  2. Go语言 模板的使用(一)

    使用Parse package main import ( "html/template" "net/http" ) func SayHello(w http. ...

  3. 关于linux服务器上搭建ftp服务的流程

    小龙最近折腾了一个阿里云的服务器,买完了就要开始做那么多那么多的功课,小龙对ssh也是一知半解的状态,做个小笔记,发布下整个ftp服务的搭建过程,大神勿喷:) 一.aliyun Linux(Redha ...

  4. Myeclipse打断点太多,不知道怎么一次性全删除

    1.打开Debug模式 2.菜单栏里面的Run.点击Remove all Breakpoints

  5. 【iOS atomic、nonatomic、assign、copy、retain、weak、strong】的定义和区别详解

    一.atomic与nonatomic 1.相同点 都是为对象添加get和set方法 2.不同点 atomic为get方法加了一把安全锁(及原子锁),使得方法get线程安全,执行效率慢 nonatomi ...

  6. 揭开Java IO流中的flush()的神秘面纱

    大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...

  7. CharacterEncodingFilter-Spring字符编码过滤器

    通过源码可以看到在web.xml配置CharacterEncodingFilter 时,可以配置两个参数:encoding和forceEncoding : encoding:编码格式: forceEn ...

  8. Logback配置连接

    logback 简介 logback 常用配置详解(一)<configuration> and <logger> logback 常用配置详解(二)<appender&g ...

  9. C# 发送邮件中包含图片

    List<string> To = new List<string>(); To.Add("jake_ge@askey.com.tw"); List< ...

  10. SRM 628 DIV2

    250  想想就发现规律了. 500  暴力,括号匹配. 1000 给一个f数组,如果i存在,那么f[i]也得存在,问这样的集合有多少种. 先拓扑一下,dp[i] = mul(dp[son]+1)最后 ...