MySQL 啟動原理剖析

来源:http://www.cnblogs.com/chenmh/archive/2016/04/09/5369045.html
-Advertisement-
Play Games

介紹 本篇文章主要從查看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

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

《歡迎交流討論》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在對選擇欄進行的學習後,下麵我們深入的對水平菜單進行一下瞭解。 我們來看看效果圖。 接下來,我們最這樣的效果進行一下思路分析, 這與選擇欄有些相似的地方: 都利用了滑鼠進入事件,內容隱藏。 在這些基礎上,再利用浮動與定位和css的佈局就可以完成了。 首先,我們註意對三個列表標題進行左浮動,就可以讓它 ...
  • 重新整理了下自己星級評價的Demo,可以展示星級評價,可以動態修改星級。 github的地址:https://github.com/hunterCold/HYBStarEvaluationView a simple tool of star evaluation 一個簡單的星級評價的工具 歡迎各位提 ...
  • Android 4.4版本加入了沉浸式者這項功能,相信大家手中的安卓機也早已是Android 4.4甚至更高版本。越來越多的應用實現了沉浸式狀態欄這一個效果。 我們先看一個Demo,來熟悉一下沉浸式。 在圖中可以清晰地看到,我們項目的頂部和手機的狀態欄是融合在一起。這樣表現得非常美觀,自然。 其實, ...
  • 手機防盜頁面部分 點擊手機防盜,進行判斷,如果沒有設置密碼,顯示一個設置密碼的對話框,如果已經設置密碼了,彈出輸入密碼對話框 密碼保存在SharedPreferences中,數據取出進行判斷 自定義一個佈局文件,dialog_setup_password.xml 根佈局寬度不要充滿屏幕 內部控制項,寬 ...
  • UICollectionView @interface UICollectionView : UIScrollView UICollectionView 和UICollectionViewController類是iOS6新引進的API,用於展示集合視圖,佈局更加靈活,可實現多列佈局,用法類似UITa ...
  • IOS 圖片輪播實現原理的一種 圖片輪播所要實現的是在一個顯示區域內通過滑動來展示不同的圖片。 當圖片較少時我們可以採用在滾動視圖上添加很多張圖片來實現。 但是如果圖片數量較多時,一次性載入過多圖片會浪費記憶體,影響性能。 因此我們要採取適當地方法來實現圖片的輪播。 下麵我們只是簡單的介紹很多方法中的 ...
  • 1. Objc是一門編譯型語言,JAVA是解析型語言 編譯型語言:把做好的源程式全部編譯成二進位代碼的可運行程式。然後,可直接運行這個程式。 編譯型語言,執行速度快、效率高;依賴編譯器、跨平臺性差些。 解析型語言:解釋性語言在運行程式的時候才翻譯,每個語句都是執行的時候才翻譯。這樣解釋性語言每執行一 ...
  • 在我學習hive的時候,按照官網上的demo, // sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) sqlContext.sql("CREATE TABLE ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...