MySQL服務讀取參數文件my.cnf的規律研究探索

来源:https://www.cnblogs.com/kerrycode/archive/2018/03/16/8582249.html
-Advertisement-
Play Games

在MySQL中,它是按什麼順序或規律去讀取my.cnf配置文件的呢?其實只要你花一點功夫,實驗測試一下就能弄清楚,下麵的實驗環境為5.7.21 MySQL Community Server。其它版本如有不同,請以實際情況為準。 其實,MySQL是按照下麵這個順序來讀取my.cnf: 1: /etc/... ...


在MySQL中,它是按什麼順序或規律去讀取my.cnf配置文件的呢?其實只要你花一點功夫,實驗測試一下就能弄清楚,下麵的實驗環境為5.7.21 MySQL Community Server。其它版本如有不同,請以實際情況為準。

 

其實,MySQL是按照下麵這個順序來讀取my.cnf:

 

    1: /etc/my.cnf

    2: /etc/mysql/my.cnf

    3: /usr/etc/my.cnf

    4: ~/.my.cnf

 

也就是說首先它會找/etc/my.cnf 這個文件, 如果這個文件不存在,那麼它接下來去找/etc/mysql/my.cnf這個文件,依此類推(這個實驗很簡單,在此略過,不浪費篇幅),如果最後一個文件~/.my.cnf 也不存在,那麼會怎麼樣呢?

[root@gettestlnx02 ~]# mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 
[root@gettestlnx02 ~]# ls /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
ls: cannot access /etc/mysql/my.cnf: No such file or directory
ls: cannot access /usr/etc/my.cnf: No such file or directory
ls: cannot access /root/.my.cnf: No such file or directory
/etc/my.cnf
[root@gettestlnx02 ~]# 

 

如上所示,其實MySQL安裝完成後,只生成了/etc/my.cnf這個配置文件。其它路徑的my.cnf文件是不存在的。我們先來測試一下,將配置文件移走。在這之前,我們先查看一下log_error的位置。如下所示:

 

 

mysql> show variables like '%log_error%';
+---------------------+---------------------+
| Variable_name       | Value               |
+---------------------+---------------------+
| binlog_error_action | ABORT_SERVER        |
| log_error           | /var/log/mysqld.log |
| log_error_verbosity | 3                   |
+---------------------+---------------------+
3 rows in set (0.00 sec)
 
mysql> exit
Bye

 

 

[root@gettestlnx02 ~]# mv /etc/my.cnf  /tmp/my.cnf
[root@gettestlnx02 ~]# ls -lrt /etc/my.cnf
ls: cannot access /etc/my.cnf: No such file or directory
[root@gettestlnx02 ~]# service mysqld stop
Stopping mysqld:  [  OK  ]
[root@gettestlnx02 ~]# service mysqld start
Starting mysqld:  [  OK  ]
[root@gettestlnx02 ~]# 

 

 

clip_image001[4]

 

 

如上所示,即使沒了my.cnf配置文件,MySQL服務依然可以啟動,那麼這個是怎麼回事呢? 我們知道service mysqld start啟動MySQL,其實是運行/etc/init.d/mysqld這個腳本。下麵是腳本獲取給變數datadir、socketfile、errlogifle賦值的部分腳本,如下所示:

 

# Extract value of a MySQL option from config files
# Usage: get_mysql_option OPTION DEFAULT SECTION1 SECTION2 SECTIONN
# Result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
get_mysql_option () {
    option=$1
    default=$2
    shift 2  #移動到第3個參數,詳情見下麵調試。
    result=$(/usr/bin/my_print_defaults "$@" | sed -n "s/^--${option}=//p" | tail -n 1)
    if [ -z "$result" ]; then
        # not found, use default
        result="${default}"
    fi
}
 
get_mysql_option datadir "/var/lib/mysql" mysqld
datadir="$result"
get_mysql_option socket "$datadir/mysql.sock" mysqld
socketfile="$result"
get_mysql_option log-error "/var/log/mysqld.log" mysqld mysqld_safe
errlogfile="$result"
get_mysql_option pid-file "/var/run/mysqld/mysqld.pid" mysqld mysqld_safe
mypidfile="$result"

 

如果你對shell很熟,那麼可以忽略下麵步驟,如果不熟悉,那麼我們可以手工調試一下(# sh -x mysqld),看看它是如何獲取相關變數的值的呢?

 

 

clip_image002[4]

 

 

[root@gettestlnx02 ~]# file /usr/bin/my_print_defaults
/usr/bin/my_print_defaults: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
[root@gettestlnx02 ~]# /usr/bin/my_print_defaults mysqld
[root@gettestlnx02 ~]# 

 

 

如上所示,因為/usr/bin/my_print_defaults mysqld輸出為空,所以result為空值, 所以result被授予${default}的值,而defualt=$2,其實就是第二個變數,如下所示,第二個變數被標記為紅色。

 

get_mysql_option datadir "/var/lib/mysql" mysqld

datadir="$result"

 

 

clip_image003[4]

 

另外,my.cnf的位置是會影響腳本輸出結果的。如下所示:(不在幾個預設路徑的話,my_print_defaults是沒有輸出結果的)

 

[root@gettestlnx02 ~]# ls /tmp/my.cnf
/tmp/my.cnf
[root@gettestlnx02 ~]# /usr/bin/my_print_defaults mysqld
[root@gettestlnx02 ~]# mv /tmp/my.cnf  /etc/my.cnf
[root@gettestlnx02 ~]# /usr/bin/my_print_defaults mysqld
--datadir=/var/lib/mysql
--socket=/var/lib/mysql/mysql.sock
--symbolic-links=0
--log-error=/var/log/mysqld.log
--pid-file=/var/run/mysqld/mysqld.pid

 

 

 

clip_image004[4]

 

 

接下來,我們將配置文件my.cnf挪回原位(/etc/my.cnf),然後更改資料庫數據存儲目錄(從/var/lib/mysql挪動到/data/mysqldata/mysql 步驟從略),然後我們再做下麵測試:

 

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

-Advertisement-
Play Games
更多相關文章
  • 情況:本地的虛擬機 被 Shell攻擊連接時 連接時間過長 解決方法: 1> 查看ssh服務(Linux 遠程登錄服務) 是否正常運行 2>查看ssh配置文件 /etc/ssh/sshd_conig (看紅色部分是否為yes 或者是否打開 然後改成 no) 3>重啟sshd服務。 ...
  • 埠概述 在STM32中,每個I/O埠可以由軟體配置成為輸入/輸出模式。複位期間或剛複位後,I/O埠被配置成浮空輸入模式。所有的GPIO引腳有一個內部弱上拉和弱下拉,當配置為輸入時, 它們可以被激活或者是斷開。 所有的埠都有外部中斷的能力。 AF功能:對於復用功能,埠必須配置成復用功能輸出模 ...
  • 此方法不需要修改Tomcat配置 親測,可用 1.在tomcat bin目錄下添加文件clear_log.sh 內容如下: #!/bin/shd=`date +%Y-%m-%d`d7=`date -d'7 day ago' +%Y-%m-%d`cp /opt/apache-tomcat-8.5.9/ ...
  • 1、列出當前系統上所有已經登錄的用戶的用戶名,註意:同一個用戶登錄多次,則只顯示一次即可。 2、取出最後登錄到當前系統的用戶的相關信息。 3、取出當前系統上被用戶當作其預設shell的最多的那個shell。 4、將/etc/passwd中的第三個欄位數值最大的後10個用戶的信息全部改為大寫後保存至/ ...
  • 1.虛擬機把磁碟大小進行改動 2.sudo apt-get install gparted 3.打開安裝好的應用 4.進行分區改動 5.理論刪除sda2和sda5重整後邊即可,但此時sda2和sda5可能會處在啟用交互的狀態: 6.右鍵禁止後依次刪除sda5和sda2,重新分配sda1後,把預留的位 ...
  • 一、高通sensor架構: linux驅動由淺入深系列:高通sensor架構實例分析之一(整體概覽+AP側代碼分析) linux驅動由淺入深系列:高通sensor架構實例分析之二(adsp驅動代碼結構) Linux驅動由淺入深系列:高通sensor架構實例分析之三(adsp上報數據詳解、校準流程詳解 ...
  • 一、概述 本篇文章轉載來著官網線上文檔,文章主要介紹SQL Server數據類型轉換相關語法、隱式轉換、Date樣式等。 語法 Syntax for CAST: CAST ( expression AS data_type [ ( length ) ] ) Syntax for CONVERT: C ...
  • window eclipse連接hadoop集群,本地運行wordcount,報以下錯誤,嘗試網路上的方法無果,如:換64JDK,添加hadoop_home,path,以及在hadoop\bin和c:\windows\system32下放hadoop.dll。 解決:刪除hadoop\bin\had ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...