有幾種方法可以指定MySQL程序的選項:
- 在程序名稱後的命令行上列出選項。這對於應用於程序的特定調用的選項來說很常見。
- 在程序啓動時讀取的選項文件中列出選項。這對於希望程序每次運行都使用的選項很常見。
- 列出環境變量中的選項。對於要在程序每次運行時應用的選項,此方法很有用。
選項是按順序處理的,因此,如果多次指定選項,則最後出現的選項優先。以下命令使mysql連接到在localhost上運行的服務器:
mysql -h example.com -h localhost
有一個例外:對於mysqld,該選項的第一個實例 --user 用作安全預防措施,以防止在命令行中覆蓋選項文件中指定的用戶。
如果給出了衝突或相關的選項,則後面的選項優先於前面的選項。以下命令以“ no column names ”模式運行 mysql:
mysql --column-names --skip-column-names
MySQL程序首先通過檢查環境變量,然後通過處理選項文件,然後通過檢查命令行來確定給出哪些選項。由於後面的選項優先於前面的選項,因此處理順序意味着環境變量的優先級最低,而命令行選項的優先級最高。
通過在選項文件中爲程序指定默認選項值,可以利用MySQL程序處理選項的方式。這樣一來,您可以避免在每次運行程序時都鍵入它們,同時可以根據需要使用命令行選項覆蓋默認值。
在舊版本的MySQL中,程序選項可以完整或以任何明確的前綴指定。例如,可以將mysqldump的 --compress 選項指定爲 --compr,但不能寫做 --comp ,因爲後者含義模棱兩可。在MySQL 5.7中,不再支持選項前綴,僅接受完整選項。這是因爲在爲程序實現新選項時,前綴可能會引起問題,而當前明確的前綴將來可能會變得模棱兩可。
示例:
--key-buffer選項現在必須被指定爲--key-buffer-size
--skip-grant選項現在必須被指定爲--skip-grant-tables
1. 在命令行上使用選項
在命令行上指定的程序選項遵循一些規則,其中需要注意的幾條規則如下:
- 對於需要取值的長選項,請使用=號分隔選項名稱和值。對於需要取值的短選項,選項值可以緊跟在選項字母后面,或者在中間加一個空格: -hlocalhost 和 -h localhost 是相同的。該規則的例外是用於指定MySQL密碼的選項,該選項可以用 --password=pass_val 或 --password 的格式給出。在後一種情況下(沒有給定密碼值),程序會以交互方式提示您輸入密碼。密碼選項也可以縮寫爲 -ppass-val 或 -p 。但是,對於縮寫形式,如果密碼值是給定的,則它必須在選項字母后面沒有中間空格:如果選項字母后面有空格,程序無法判斷後面的參數應該是密碼值還是其他類型的參數。因此,以下兩個命令具有兩個完全不同的含義:
mysql -ptest
mysql -p test
第一個命令指示mysql使用密碼值test,但不指定默認數據庫。第二條命令mysql提示輸入密碼值並將test用作默認數據庫。
- 在選項名稱中,破折號(-)和下劃線(_)可以互換使用。例如, --skip-grant-tables和 --skip_grant_tables 是等效的(但是,前劃線不能作爲下劃線)。
- MySQL服務器具有某些只能在啓動時指定的命令選項,以及一組系統變量,其中一些可以在啓動時,運行時或同時設置。統變量名稱使用下劃線而不是破折號,並且在臨時引用時(例如,使用 SET 或SELECT語句),必須使用下劃線:
SET GLOBAL general_log = ON;
SELECT @@GLOBAL.general_log;
服務器啓動時,系統變量的語法與命令選項的語法相同,因此在變量名稱中,破折號和下劃線可以互換使用。例如,--general_log=ON和 --general-log=ON是等效的。(對於在選項文件中設置的系統變量也是如此。)
- 對於採用數字值的選項,可以使用K、M或G(大寫或小寫)作爲後綴來指定該值,以指示1024、10242或10243的乘數。例如,以下命令告訴mysqladmin ping服務器1024次,每次ping之間睡眠10秒:
mysqladmin --count=1K --sleep=10 ping
- 在將文件名指定爲選項值時,請避免使用~Shell元字符。可能不會按您預期的那樣解釋它。
在命令行中給定包含空格的選項值時,必須用引號引起來。例如, --execute(或-e)選項可與mysql一起使用,以將一個或多個用分號分隔的SQL語句傳遞給服務器。當使用該選項時,mysql執行選項值中的語句並退出。聲明必須用引號引起來。例如:
# mysql -S /var/lib/mysql-replica02/mysql.sock -e "SELECT VERSION();SELECT NOW()"
+-----------+
| VERSION() |
+-----------+
| 5.7.23 |
+-----------+
+---------------------+
| NOW() |
+---------------------+
| 2020-01-13 15:21:45 |
+---------------------+
注意:長格式(--execute)後跟等號(=)。
要在語句中使用帶引號的值,您必須轉義內部的引號,或在語句內使用與引號本身不同的引號。命令處理器的功能決定了您可以選擇使用單引號還是雙引號以及轉義引號字符的語法。例如,如果命令處理器支持使用單引號或雙引號引起來的引用,則可以在語句周圍使用雙引號,並對語句內的所有帶引號的值使用單引號。
2. 使用選項文件
大多數MySQL程序可以從選項文件(有時稱爲配置文件)中讀取啓動選項。選項文件提供了一種方便的方法來指定常用選項,這樣就不必在每次運行程序時都在命令行上輸入它們。
注意:以–no-defaults選項開頭的MySQL程序除 .mylogin.cnf 以外不讀取選項文件。
許多選項文件是使用任何文本編輯器創建的純文本文件。.mylogin.cnf 文件是個例外,它包含登錄路徑選項。這是由mysql_config_editor實用程序創建的加密文件。
MySQL按照以下討論中描述的順序查找選項文件,並讀取所有存在的文件。如果您要使用的選項文件不存在,請使用剛剛討論的適當方法來創建它。
2.1 選項文件處理順序
在Unix和類似Unix的系統上,MySQL程序以指定的順序從下表中顯示的文件中讀取啓動選項(首先列出的文件先讀取)。
File Name | Purpose |
---|---|
/etc/my.cnf | Global options |
/etc/mysql/my.cnf | Global options |
SYSCONFDIR/my.cnf | Global options |
$MYSQL_HOME/my.cnf | Server-specific options (server only) |
defaults-extra-file | The file specified with --defaults-extra-file, if any |
~/.my.cnf | User-specific options |
~/.mylogin.cnf | User-specific login path options (clients only) |
在上表中,~代表當前用戶的主目錄($HOME的值)
DATADIR通常是 /usr/local/mysql/data,儘管這可能因平臺或安裝方法而異。該值是在編譯MySQL時內置的數據目錄位置,而不是在mysqld啓動時用 --datadir 選項指定的位置。
2.2 選項文件語法(重要)
選項文件語法的以下說明適用於您手動編輯的文件。不包括使用mysql_config_editor創建並加密的 .mylogin.cnf。
在選項文件中指定選項的語法類似於命令行語法,但是,在選項文件中,您省略了選項名稱中的前兩個破折號,並且每行僅指定了一個選項。例如, --quick與 --host=localhost 在命令行上應被指定爲 quick與host=localhost,並且在選項文件單獨的行。
選項文件中的空行將被忽略。非空行可以採用以下任何形式:
- #comment, ;comment
註釋行以#或 ;開頭。一個#註釋也可以從行的中部開始。 - [group]
group是要爲其設置選項的程序或組的名稱。在組行之後,所有選項設置行都將應用於命名組,直到選項文件末尾或給出另一組。選項組名稱不區分大小寫。 - opt_name
這與命令行上的 --opt_name 等效。 - opt_name=value
這與命令行上的 --opt_name=value 等效。在選項文件中,您可以在 = 字符周圍留有空格,這在命令行上是不正確的。該值可以選擇用單引號或雙引號引起來,如果該值包含註釋字符 #,則使用引號很有用。
前導和尾隨空格會自動從選項名稱和值中刪除。
如果選項組名稱與程序名稱相同,則該組中的選項專門適用於該程序。例如,[mysqld]和[mysql] 組分別應用於mysqld服務器和 mysql客戶端程序。
MySQL發行版中提供的所有客戶端程序都會讀取[client]選項組(但mysqld不會讀取)。
[client]組使您能夠指定應用於所有客戶端的選項。例如,[client]用於指定連接到服務器的密碼的適當組(但請確保選項文件只能由您自己訪問,這樣其他人就無法發現您的密碼)。請確保不要將選項放入[client]組,除非您使用的所有客戶端程序都能識別該選項。如果試圖運行不理解該選項的程序,則會在顯示錯誤消息後退出。
首先列出常規選項組,然後列出特定組。例如,一個[client]組更爲通用,因爲它被所有客戶端程序讀取,而一個[mysqldump]組僅由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=8M
[mysqldump]
quick
這是一個典型的用戶選項文件:
[client]
# The following password will be sent to all standard MySQL clients
password="my password"
[mysql]
no-auto-rehash
connect_timeout=2
要從特定的MySQL發行版系列創建供mysqld服務器只讀的選項組,請使用名稱爲[mysqld-5.6]、[mysqld-5.7]等的組。以下組指示該 sql_mode設置僅由具有5.7.x版本號的MySQL服務器使用:
[mysqld-5.7]
sql_mode=TRADITIONAL
2.3 選項文件包含
可以在選項文件中使用!include指令來包括其他選項文件,!includedir在特定目錄中搜索選項文件。例如,要包含 /home/mydir/myopt.cnf 文件,請使用以下指令:
!include /home/mydir/myopt.cnf
要搜索/home/mydir目錄並讀取在此找到的選項文件,請使用以下指令:
!includedir /home/mydir
MySQL不保證目錄中選項文件的讀取順序。
注意:在Unix系統上使用 !includedir 指令會尋找.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指令,則在處理選項文件時,無論這些指令在文件中出現的位置如何,都將處理由這些指令命名的文件。
爲了使包含指令起作用,不應在引號中指定文件路徑,並且文件路徑不應包含轉義序列。
示例:
查詢原key_buffer_size:
mysql> SHOW VARIABLES LIKE '%key_buffer_size%';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8388608 |
+-----------------+---------+
在/etc/my.cnf添加:
!include /home/mydir/myopt.cnf
並按照上面內容填寫myopt.cnf內容,重啓mysqld。
mysql> SHOW VARIABLES LIKE '%key_buffer_size%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| key_buffer_size | 16777216 |
+-----------------+----------+
值已經變過來了。
3. 使用選項設置程序變量
許多MySQL程序都有內部變量,可以在運行時使用該 SET 語句設置。
大多數程序變量也可以在服務器啓動時通過使用與指定程序選項相同的語法進行設置。例如,mysql有一個 max_allowed_packet變量來控制其通信緩衝區的最大大小。要將mysql的max_allowed_packet變量 設置 爲16MB,請使用以下命令之一:
mysql --max_allowed_packet=16777216
mysql --max_allowed_packet=16M
第一個命令以字節爲單位指定值。第二個以兆字節爲單位指定值。數值後綴可以爲 K,M或 G(大寫或小寫)。
在選項文件中,變量設置沒有前導破折號:
[mysql]
max_allowed_packet=16777216
或者
[mysql]
max_allowed_packet=16M
如果願意,可以將變量名中的下劃線指定爲破折號。以下選項組是等效的。兩者都將服務器密鑰緩衝區的大小設置爲512MB:
[mysqld]
key_buffer_size=512M
[mysqld]
key-buffer-size=512M
在調用mysql時可以使用後綴設置變量,但不能使用表達式來設置變量 。在mysql命令行,您可以使用SET表達式來分配變量的值,而爲變量添加後綴則不正確。例如,以下第一行在程序調用時是合法的,但第二行不是:
shell> mysql --max_allowed_packet=16M
shell> mysql --max_allowed_packet=16*1024*1024
相反,以下第二行在運行時是合法的,但第一行則不是:
mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;
今天效率很低啊,頻繁走神,寫了一天,最後刪了一半,文章成了現在的亞子。
參考文檔
https://dev.mysql.com/doc/refman/5.7/en/program-options.html