介紹 本篇文章主要從查看MySQL的啟動命令的代碼來詳細瞭解MySQL的啟動過程,內容多為概念知識;理解MySQL的啟動原理對熟悉MySQL至關重要,啟動mysql服務有三種方式分別是:mysql.sever,mysqld,mysqld_safe。 my.cnf mysql.server 預設的my ...
介紹
本篇文章主要從查看MySQL的啟動命令的代碼來詳細瞭解MySQL的啟動過程,內容多為概念知識;理解MySQL的啟動原理對熟悉MySQL至關重要,啟動mysql服務有三種方式分別是:mysql.sever,mysqld,mysqld_safe。
my.cnf
[client] socket=/tmp/mysql.sock port=3306 [mysqld] #################[base]########################## basedir =/usr/local/mysql datadir =/data/mysql/ innodb_data_home_dir=/data/mysql/ innodb_log_group_home_dir=/data/mysql/ port =3306 user=mysql pid-file=/data/mysql/mysql.pid socket =/tmp/mysql.sock default_storage_engine=innodb character_set_server=utf8 open_files_limit=65535 [mysqld_safe] log_error=/usr/local/mysql/log/mysql-error.log pid-file=/usr/local/mysql/log/mysql.pid open_files_limit=15000
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=1 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=1 ;; # 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=0 ;; --syslog) want_syslog=1 ;; --skip-syslog) want_syslog=0 ;; --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 本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明鏈接。 《歡迎交流討論》 |