MySQL 的許多程序都可以從選項文件(有時也被稱為配置文件)中讀取啟動選項。選項文件提供了一種方便的方式來指定常用的選項,這樣你就不必每次運行程序時都在命令行上輸入這些選項。
要確定一個程序是否讀取選項文件,你可以使用?--help?選項來調用它。(對于?mysqld,你需要使用?--verbose?和?--help。)如果程序讀取選項文件,幫助消息會指示它查找哪些文件以及它識別哪些選項組。
當使用?--no-defaults?選項啟動 MySQL 程序時,它會忽略除?.mylogin.cnf?之外的所有默認選項文件。.mylogin.cnf?文件是一個特殊的配置文件,用于存儲由?mysql_config_editor?實用程序加密的登錄憑據(如用戶名和密碼)。客戶端程序可以使用?--login-path?選項來指定從?.mylogin.cnf?文件中讀取的登錄路徑。
另一方面,如果在啟動 MySQL 服務器時禁用了?persisted_globals_load?系統變量,則服務器將不會加載?mysqld-auto.cnf?文件。
許多 MySQL 的選項文件都是使用任何文本編輯器創建的純文本文件。但是,也存在一些例外情況,這些例外情況如下:
- .mylogin.cnf?文件是?mysql_config_editor?實用程序創建的加密文件,用于存儲登錄路徑選項。這些“登錄路徑”是允許僅包含特定選項(如?host、user、password、port?和?socket)的選項組。客戶端程序使用?--login-path?選項來指定從?.mylogin.cnf?文件中讀取哪個登錄路徑。
? ? ? 要指定一個不同的登錄路徑文件名,可以設置?MYSQL_TEST_LOGIN_FILE?環境變量。然? ? ? ? ? ? ? 而,這個變量實際上主要用于?mysql-test-run.pl?測試實用程序。不過,它也? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 被?mysql_config_editor?和 MySQL 客戶端程序(如?mysql?和?mysqladmin)所識別。
- mysqld-auto.cnf?文件位于 MySQL 服務器的數據目錄中,它是一個 JSON 格式的文件,用于存儲通過?SET PERSIST?或?SET PERSIST_ONLY?語句設置的持久化系統變量。這個文件是在服務器執行這些語句時自動創建的。這些持久化系統變量在服務器重啟后仍然保持有效,因為它們被存儲在?mysqld-auto.cnf?文件中。因此,mysqld-auto.cnf?文件的管理應該完全由 MySQL 服務器來處理,而不需要或不應該由管理員手動編輯。
- 選項文件處理順序
- 選項文件語法
- 選項文件Inclusions
1 選項文件處理順序
MySQL 在啟動時或運行客戶端工具時會按照特定的順序查找選項文件,并讀取存在的任何文件。
在 Windows 上,MySQL 程序按照以下順序讀取啟動選項文件(列表中先列出的文件先被讀取,后面讀取的文件具有更高的優先級):
在上面的表中,%WINDIR%?表示您的 Windows 目錄的位置。這通常位于?C:\WINDOWS(在較新的 Windows 版本中可能是?C:\Windows)。要確定?WINDIR?環境變量的確切位置,您可以使用以下命令之一(取決于您的命令行環境):
C:\>?echo?%WINDIR%
%APPDATA%?環境變量代表 Windows 應用程序數據目錄的位置。要確定其確切位置,您可以使用以下命令之一(取決于您的命令行環境):
C:\>?echo?%APPDATA%
當使用 MySQL Installer 安裝 MySQL 8.0 時,BASEDIR?通常代表 MySQL 的基礎安裝目錄。對于 Windows 系統,這個目錄通常位于?C:\PROGRAMDIR\MySQL\MySQL Server 8.0,其中?PROGRAMDIR?代表程序目錄(對于英文版的 Windows 通常是?Program Files)。
雖然 MySQL Installer 將大部分文件放置在?PROGRAMDIR,但它將配置文件?my.ini(或在某些系統中可能是?my.cnf)放置在?C:\ProgramData\MySQL\MySQL Server 8.0\?目錄下。
DATADIR?在 MySQL 中代表數據目錄,即 MySQL 存儲其數據庫文件(如表、索引等)的目錄。這個目錄的位置在 MySQL 編譯時就已經內置了默認值,但可以在啟動?mysqld?進程時通過?--datadir?選項來指定。
mysqld-auto.cnf?文件通常與?my.cnf?或?my.ini?配置文件一起使用,但包含了一些由 MySQL Installer 自動生成的設置,如數據目錄(datadir)、套接字文件(socket)和 PID 文件(pid-file)的路徑。
在 Unix 和 Unix-like 系統上,MySQL 程序按照以下表格中指定的順序讀取啟動選項(先列出的文件先被讀取,后讀取的文件具有更高的優先級)。
在 Unix 平臺上,MySQL 故意忽略具有全局可寫權限(world-writable)的配置文件,這是一種安全措施。
在上表中,~?代表當前用戶的home目錄(即?$HOME?變量的值)。
SYSCONFDIR?表示在構建 MySQL 時通過 CMake 的?SYSCONFDIR?選項指定的目錄。默認情況下,這個目錄是編譯時內置的安裝目錄下的?etc?目錄。
MYSQL_HOME?是一個環境變量,它包含了特定于服務器的?my.cnf?配置文件所在的目錄的路徑。當?MYSQL_HOME?沒有被設置時,如果您使用?mysqld_safe?腳本來啟動 MySQL 服務器,mysqld_safe?會將?MYSQL_HOME?設置為?BASEDIR,即 MySQL 的基礎安裝目錄。BASEDIR?通常包含了 MySQL 的二進制文件、庫文件和其他核心組件。
DATADIR表示MySQL數據目錄。用于查找mysqld-auto.cnf,其默認值是MySQL編譯時內置的數據目錄位置,但可以通過--datadir進行更改,該datadir指定為在處理mysqld-auto.com.cnf之前處理的選項文件或命令行選項。
如果找到給定選項的多個實例,則最后一個實例優先,但有一個例外:對于mysqld,--user選項的第一個實例用作安全預防措施,以防止選項文件中指定的用戶在命令行上被重寫。
2 ?選項文件語法
以下選項文件語法說明適用于手動編輯的文件。這不包括使用mysql_config_editor創建并加密的.mylogin.cnf和服務器以JSON格式創建的mysqld-auto.cnf。
MySQL 程序的任何可以在命令行中給出的長選項也可以在選項文件中給出。如果您想查看某個程序可用的選項列表,可以使用?--help?選項來運行該程序。
選項文件中指定選項的語法與在命令行中指定選項的語法相似,但有一些重要的區別。在選項文件中,您省略了選項名前面的兩個短橫線(--),并且每個選項單獨寫在一行上。例如,如果您在命令行中使用了?--quick?和?--host=localhost,那么在選項文件中,您應該將它們分別寫在單獨的一行上,并且去掉前面的?--。對于形如?--loose-opt_name?的選項,在選項文件中,您應該將其寫為?loose-opt_name。
在MySQL的選項文件中,空行會被忽略,而非空行可以采取以下幾種形式:
- #comment?或?;comment
注釋行以?#?或?;?開頭。在行中間也可以使用?#?開始注釋。
- [group]
group?是您想要為其設置選項的程序或組的名稱。在組行之后,任何選項設置行都將應用于指定的組,直到選項文件的末尾或另一個組行被給出。選項組名稱不區分大小寫。
- opt_name
這等價于命令行上的?--opt_name。
- opt_name=value
這等價于命令行上的?--opt_name=value。在選項文件中,等號(=)周圍可以有空格,這在命令行上是不允許的。值可以選擇性地用單引號或雙引號括起來,這在值包含?#?注釋字符時特別有用。
在MySQL的選項文件中,選項名和值的前導和尾隨空格會自動被刪除。這意味著您可以在編寫選項文件時添加額外的空格來增強可讀性,而不必擔心這些空格會影響選項的實際值。
在選項值中,您可以使用轉義序列來表示一些特殊字符。MySQL選項文件中支持的轉義序列包括:
- \b:退格(backspace)字符
- \t:制表符(tab)
- \n:換行符(newline)
- \r:回車符(carriage return)
- \\:反斜杠(backslash)字符
- \s:空格(space)字符
在選項文件中,這些轉義規則的應用方式是:
- 如果一個反斜杠后面跟著一個有效的轉義序列字符,那么它會被轉換為該序列所代表的字符。例如,\s?會被轉換為空格字符。
- 如果一個反斜杠后面沒有跟著一個有效的轉義序列字符,那么反斜杠將保持不變。例如,\S?會被保留為?\?和?S?這兩個字符。
前面的規則意味著一個實際的反斜杠字符(backslash,?\),需要使用兩個反斜杠(\\)來表示,因為單個反斜杠會被解釋為轉義字符的開始。但是,如果反斜杠后面沒有跟隨有效的轉義序列字符,那么它將被保留為一個單獨的反斜杠字符。
選項文件中的轉義序列規則與SQL語句中字符串字面量中的轉義序列規則略有不同。
在SQL語句的字符串字面量中,如果反斜杠后面跟的不是一個有效的轉義序列字符,那么這個反斜杠會被忽略,后面的字符將按原樣處理。例如,在SQL字符串中,\x?會被解釋為?x,因為?x?不是一個有效的轉義序列字符。
然而,在MySQL的選項文件中,情況有所不同。在選項文件中,如果反斜杠后面沒有跟隨一個有效的轉義序列字符,那么反斜杠將保持不變。這意味著,如果您在選項文件中寫入?option=\x,它將被解釋為?option=\x,而不是?option=x。
Windows路徑名中的轉義規則在MySQL選項文件中非常重要,因為Windows使用\作為路徑名分隔符。在MySQL選項文件中,如果\后面跟著一個轉義序列字符,那么它必須被寫作\\。如果\后面沒有跟著轉義序列字符,那么它可以被寫作\\或\。另外,在Windows路徑名中也可以使用/,它會被當作\來處理。
如果您想在MySQL選項文件中指定一個基于C:\Program Files\MySQL\MySQL Server 8.0的基礎目錄,以下是一些示例:
basedir="C:\Program Files\MySQL\MySQL Server 8.0"?basedir="C:\\Program Files\\MySQL\\MySQL Server 8.0"?basedir="C:/Program Files/MySQL/MySQL Server 8.0"?basedir=C:\\Program\sFiles\\MySQL\\MySQL\sServer\s8.0
如果選項組名與程序名相同,那么該組中的選項就專門應用于那個程序。例如,[mysqld]組中的選項專門用于配置mysqld服務器,而[mysql]組中的選項則專門用于配置mysql客戶端。
[client]組中的選項確實會被MySQL分發中的所有客戶端程序讀取,但不會被mysqld服務器讀取。
對于使用C API的第三方客戶端程序如何使用選項文件,這些程序通常會使用mysql_options()函數來設置運行時參數。
[client]選項組允許您指定應用于所有MySQL客戶端的選項。例如,[client]組是設置連接服務器所需密碼的合適位置。但是,您必須確保選項文件(如my.cnf或my.ini)只能由您自己訪問,以防止其他人發現您的密碼。
將選項放入[client]組時要特別小心,因為只有當所有您使用的客戶端程序都識別該選項時,它才是安全的。如果某個客戶端程序不理解該選項,它可能會在顯示錯誤消息后退出。
組織選項組的一個好方法是首先列出更一般的組,然后列出更具體的組。這樣做可以確保更具體的選項能夠覆蓋更一般的選項。如果您在[client]組中設置了一個選項,然后在[mysqldump]組中設置了相同的選項但值不同,那么[mysqldump]組中的值將覆蓋[client]組中的值。這是因為mysqldump在讀取其配置時,會先讀取[client]組中的通用選項,然后再讀取[mysqldump]組中的特定選項。由于[mysqldump]組是更具體的,所以它的選項會覆蓋[client]組中的相同選項。
這里是一個典型的通用選項文件:
[client]?port=3306?socket=/tmp/mysql.sock?[mysqld]?port=3306?socket=/tmp/mysql.sock?key_buffer_size=16M?max_allowed_packet=128M?[mysqldump]?Quick
這里是一個典型的用戶選項文件:
[client]?# The following password is sent to all standard MySQL clients?password="my password"?[mysql]?no-auto-rehash?connect_timeout=2
要在MySQL的配置文件中為特定MySQL發布系列的mysqld服務器創建僅讀的選項組,您可以使用類似于[mysqld-5.7]、[mysqld-8.0]這樣的命名方式。如果您想要指定sql_mode設置僅由8.0.x版本的MySQL服務器使用,您應該創建一個名為[mysqld-8.0]的選項組,并在其中設置sql_mode。
[mysqld-8.0]?sql_mode=TRADITIONAL
3 選項文件?Inclusions
在MySQL的配置文件中,您可以使用!include指令來包含其他配置文件,以及!includedir指令來搜索特定目錄以包含該目錄中的配置文件。這有助于組織復雜的配置,或者根據環境或版本包含不同的配置設置。
例如,要包含/home/mydir/myopt.cnf文件,您可以在主配置文件中使用以下!include指令:
!include /home/mydir/myopt.cnf
要搜索/home/mydir目錄并讀取在其中找到的選項文件,請使用以下指令:
!includedir /home/mydir
MySQL無法保證讀取目錄中選項文件的順序。
使用找到并包含的任何文件!includedir指令在Unix操作系統上的文件名必須以.cnf結尾。在Windows上,此指令檢查擴展名為.ini或.cnf的文件。
像編寫任何其他選項文件一樣,編寫包含的選項文件的內容。也就是說,它應該包含多組選項,每個選項前面都有一行[group],指示應用這些選項的程序。
在處理包含的文件時,僅使用當前程序正在查找的組中的那些選項。其他組將被忽略。假設my.cnf文件包含以下行:
!include /home/mydir/myopt.cnf
假設/home/mydir/myopt.cnf如下所示:
[mysqladmin]?force?[mysqld]?key_buffer_size=16M
如果my.cnf由mysqld處理,則僅使用/home/mydir/myopt.cnf中的[mysqld]組。如果文件由mysqladmin處理,則只使用[mysqladmin]組。如果文件由任何其他程序處理,則不會使用/home/mydir/myopt.cnf中的任何選項。
這個includedir指令的處理方式類似,只是讀取命名目錄中的所有選項文件。
如果選項文件包含!include或!includedir,無論選項文件出現在文件中的什么位置,只要處理選項文件,都會處理由這些指令命名的文件。
為了使包含指令起作用,文件路徑不應在引號內指定,并且不應具有轉義序列。例如,my.ini中提供的以下語句讀取選項文件myots.ini:
!include C:/ProgramData/MySQL/MySQL Server/myopts.ini!include C:\ProgramData\MySQL\MySQL Server\myopts.ini!include C:\\ProgramData\\MySQL\\MySQL Server\\myopts.ini
在Windows上,如果!include/path/to/extra.ini是文件中的最后一行,請確保在末尾附加一行換行符;否則,該行將被忽略。
?
?