1. 程式人生 > >MySQL 啟動原理剖析

MySQL 啟動原理剖析

介紹

本篇文章主要從檢視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了。

備註:

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結。

《歡迎交流討論》

相關推薦

MySQL 啟動原理剖析

介紹 本篇文章主要從檢視MySQL的啟動命令的程式碼來詳細瞭解MySQL的啟動過程,內容多為概念知識;理解MySQL的啟動原理對熟悉MySQL至關重要,啟動mysql服務有三種方式分別是:mysql.sever,mysqld,mysqld_safe。  my.cnf [client] so

mysql索引原理剖析

mage add 獲得 旋轉速度 tran 運行期 多個 pla 線性 一、索引的原理   所謂索引,即是快速定位與查找,那麽索引的結構組織要盡量減少查找過程中磁盤I/O的存取次數(B+樹相比B樹,其非葉子節點占用更小的空間,可以有更多非葉子節點存放在再內存中,減少大量的

spring boot 啟動原理剖析

urn rgs 獲取 target loader 技術分享 提前 pub 流程 準備 SpringBoot為我們做的自動配置,確實方便快捷,若不大明白SpringBoot內部啟動原理,以後難免會吃虧,所以這次博主就跟你們一起一步步揭開SpringBoot的神秘面紗,讓它不再

mysql】service mysql start出錯,mysql啟動不了,解決mysql: unrecognized service錯誤

開機 init.d starting 設置 tin 執行 rest root lan service MySQL start出錯,mysql啟動不了,解決mysql: unrecognized service錯誤的方法如下: [[email protected]/

MySQL索引原理及慢查詢優化(轉)

範圍 很難 等於 right 事件 原理 插入 jpg 個人網站 轉自:美團點評技術團隊http://tech.meituan.com/mysql-index.html MySQL憑借著出色的性能、低廉的成本、豐富的資源,已經成為絕大多數互聯網公司的首選關系型數據庫。雖然性

NIO原理剖析與Netty初步----淺談高性能服務器開發(一)

返回 創建 基於 register 訪問 io操作 nbsp info class 除特別註明外,本站所有文章均為原創,轉載請註明地址 在博主不長的工作經歷中,NIO用的並不多,由於使用原生的Java NIO編程的復雜性,大多數時候我們會選擇Netty,m

Windows Mysql啟動出現1069錯誤“由於登錄失敗而無法啟動服務”的處理方法

測試 hack src 服務 window bsp 安全性 失敗 技術分享 問題現象 windows下mysql服務無法啟動,報1069錯誤。 問題原因 如果Mysql啟動用戶的密碼或者權限錯誤,會導致Windows服務器Mysql啟動時出現"由於登錄失敗而無法啟動服務"

多實例MySQL啟動腳本

mysql 多實例 開發mysql多實例啟動腳本:已知mysql多實例啟動命令為:mysqld_safe–defaults-file=/data/3306/my.cnf &停止命令為:mysqladmin -u root -p123456 -S /data/3306/mysql.sock sh

iOS程序啟動原理的理解

ret plist 依然 默認 main oar 正常 點擊 函數 應用的生命周期(從啟動到退出):當用戶點擊應用圖標之後,應用就開始啟動。應用啟動完成後,就會展示一系列的視圖,和用戶進行各種各樣的交互(如滑動、點擊)。當用戶退出應用後,該應用就無法和用戶進行交互。這一過

LVS/DR模式原理剖析(FAQs)

load 是否 live forward onf client 默認 rec add 1. LVS/DR如何處理請求報文的,會修改IP包內容嗎? 1.1 vs/dr本身不會關心IP層以上的信息,即使是端口號也是tcp/ip協議棧去判斷是否正確,vs/dr本身主要做這麽幾個事

xampp中的mysql啟動時無法產生err文件

xampp errcode 13 permission denied mysqlcentos6.5,安裝完xampp5.6.30,啟動mysql報錯,不能產生.err文件[[email protected]/* */_server ~]# /opt/lampp/lampp startmysqlXA

MySQL JOIN原理

掃描 參數 rom select 感覺 images 速查 平時 索引 先看一下實驗的兩張表: 表comments,總行數28856 表comments_for,總行數57,comments_id是有索引的,ID列為主鍵。 以上兩張表是我們測試的基礎,

mysql啟動和關閉外鍵約束的方法

word nbsp 查看 set 外鍵約束 mysql 輸入 check select 關閉外鍵約束,輸入命令:SET FOREIGN_KEY_CHECKS=0; 啟動外鍵約束,輸入命令:SET FOREIGN_KEY_CHECKS=1; 查看當前是否有外鍵約束:SELEC

企業級通過shell腳本開發MySQL啟動腳本 案例

shell mysql 啟動腳本 企業Shell面試題10:開發MySQL啟動腳本說明MySQL啟動命令為:/bin/sh mysqld_safe --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &停止命令為:mysqld_

『理論』科學計算專項_線性代數幾何原理剖析

str tar 是否 數學 這就是 cti bsp 存在 amp 矩陣左乘向量的兩種理解 1,矩陣左乘向量可以理解為對向量進行線性變換 探究原理的話,可以理解左乘為對整個空間(基&目標向量)進行線性變換,其中, 變換矩陣是基‘在基的坐標的列向量組合 目標向量是向量

我必須得告訴大家的MySQL優化原理

mysql 優化說起MySQL的查詢優化,相信大家收藏了一堆奇淫技巧:不能使用SELECT *、不使用NULL字段、合理創建索引、為字段選擇合適的數據類型..... 你是否真的理解這些優化技巧?是否理解其背後的工作原理?在實際場景下性能真有提升嗎?我想未必。因而理解這些優化建議背後的原理就尤為重要,希望本文能

我必須得告訴大家的MySQL優化原理2

mysql 優化如果有同學看完上一篇關於MySQL文章,文末留有兩個很開放的問題,如有興趣可以在腦袋裏想想。本文也會試著回答這兩個問題,希望能給你一些參考。現在可以思考一個問題,如果數據量非常大的情況下,您根據業務選擇了合適的字段,精心設計了表和索引,還仔細的檢查了所有的SQL,並確認已經沒什麽問題,但性能仍

mysql啟動錯誤處理

start ini 啟動 tar fail pre nbsp error innodb 1.當啟動MySQL時,報如下錯誤 [ERROR] Plugin ‘InnoDB‘ init function returned error.[ERROR] Plugin ‘InnoDB

Spring Boot 揭秘與實戰 源碼分析 - 工作原理剖析

pro rop 功能 row commons 擴展 onf 公眾 ica 文章目錄 1. EnableAutoConfiguration 幫助我們做了什麽 2. 配置參數類 – FreeMarkerProperties 3. 自動配置類 – FreeMarkerAuto

MySql啟動報錯,無法更新PID文件

mysql error pidMySql啟動報錯Starting MySQL.. ERROR! The server quit without updating PID file (/var/lib/mysql..)1,查看錯誤日誌 2017-08-10 19:38:14 31865 [Note] In