原創做者,公衆號【程序員讀書】,歡迎關注公衆號,轉載文章請註明出處哦。mysql
平時咱們在開發應用程序的時候,更可能是以客戶端(Client)的身份鏈接到一臺已經啓動好的MySQL服務器,所以咱們對於如何啓動一個MySQL服務器,如何設置啓動參數,以及在啓動完成後如何更改MySQL的行爲等操做並無太多的瞭解。程序員
而實際上,MySQL服務器啓動或運行過程當中各項啓動參數的設置,對MySQL的行爲與性能有相當重要的影響,所以在這篇文章中,咱們一塊兒探究一下有關MySQL服務器啓動和關閉、配置文件與系統變量一些細節。sql
雖然MySQL支持多種不一樣的平臺和操做系統,好比Windows,Mac OS,但做爲數據庫服務器,MySQL更多的時候仍是運行在類Unix操做系統
上,好比Centos、Ubuntu。數據庫
在類Unix操做系統中,有許多種方式來啓動MySQL,咱們既能夠手動運行MySQL,也能夠將MySQL設置爲系統的標準服務,在系統啓動時自動運行。windows
在啓動MySQL前,首先要考慮的是用哪個登陸帳號來運行MySQL,若是不作設置的話,通常會把咱們當前登陸的帳號做爲MySQL的啓動帳號。安全
咱們這裏講的是要本身設置啓動帳號的狀況,其實有一些安裝方式會自動幫咱們設置好啓動帳號的,這時候咱們就不須要再本身設置了。bash
root在類Unix操做系統中是無所不能的存在,因此通常不要使用root去啓動一些服務軟件,否則的話,若是服務被黑客入侵,那麼黑客即可以輕易得到root權限,進而徹底控制咱們的服務器,這是很是危險的。服務器
應該以同一個帳號來啓動服務器軟件,若是咱們在啓動服務軟件時使用不一樣的帳號,那麼這個軟件所生成的一些文件就屬於不一樣的帳號,這時候軟件所管理的文件權限將變得亂七八糟,權限混亂。session
不使用root帳號啓動MySQL,因此須要建立一些低權限的帳號來做爲啓動帳號,這樣的話,即便被黑客攻擊,形成的破壞也在有限的控制範圍以內。socket
若是須要本身指定MySQL服務器的運行帳號,可使用下面的建立進行建立,好比下面咱們建立一個名爲mysql的帳號:
# 下面兩條命令須要使用root來執行
useradd -g mysql mysql
複製代碼
若是以前使用過其餘帳號啓動過MySQL,還須要將MySQL的數據目錄的用戶及用戶組爲mysql這個帳號全部,如:
# 下面兩條命令須要使用root來執行
$ chown -R mysql /usr/local/mysql/data
$ chgrp -R mysql /usr/local/mysql/data
複製代碼
在配置文件是指定啓動帳號,好比咱們能夠/etc/my.cnf文件中增長下面的選項:
[mysqld]
user=mysql
複製代碼
這樣在啓動時MySQL會將mysql做爲啓動帳號。
關於MySQL的配置文件方面的內容,後面有更詳細的講解。
也能夠直接在啓動項中指啓動帳號,如:
#以mysql做爲啓動用戶
mysqld -u mysql
複製代碼
關於MySQL的啓動項的內容,後面有更詳細的講解。
在Linux中通常有如下幾種啓動MySQL服務器的方式,下面咱們來一一介紹一下。
mysqld命令是MySQL的主程序,經過運行mysqld命令能夠啓動一個MySQL守護進程,即MySQL服務器,經過mysqld來啓動MySQL服務器是最直接簡單,但同時也是最不經常使用的方式。
# 在MySQL安裝目錄的bin目錄下執行
$ mysqld
複製代碼
mysqld_safe
是MySQL的啓動腳本,mysqld_safe
添加了一些安全功能,在發生錯誤時重啓服務器以及將運行時信息記錄到錯誤日誌中,因此通常更推薦使用mysqld_safe
來啓動MySQL服務器。
# 查看mysqld_safe支持的選項
$ mysqld_safe --help
複製代碼
須要注意的是,在一些平臺中並不會安裝mysqld_safe
腳本,這是由於這些平臺在系統上支持mysql的啓動與關閉,所以mysqld_safe
便不須要了。
mysql.server也是一個用於管理MySQL服務器的腳本,其底層調用的是mysqld_safe腳本。
啓動MySQL
$ mysql.server start
複製代碼
關閉MySQL
$ mysql.server stop
複製代碼
與mysqld_safe
同樣,在一些支持mysql啓動與關閉的平臺上,並不會安裝mysql.server腳本。
mysqld_multi
是MySQL提供的用於管理多個MySQL服務器的腳本,能夠同時啓動或中止多個MySQL服務器,當咱們運行mysqld_multie
腳本時,該腳本會在配置文件中查找名稱爲[mysqldN]的選項,N能夠是任意的正整數。
mysqld_multi
的其完整用法以下所示:
# GNR表示咱們上面提到的N
mysqld_multi [options] {start|stop|reload|report} [GNR[,GNR] ...]
複製代碼
如今咱們定義一個以下所示的配置文件:
[mysqld1]
socket = /tmp/mysql.sock2
port = 3306
pid-file = /usr/local/mysql/data2/hostname.pid2
datadir = /usr/local/mysql/data2
language = /usr/local/mysql/share/mysql/english
user = unix_user1
[mysqld2]
mysqld = /path/to/mysqld_safe
ledir = /path/to/mysqld-binary/
mysqladmin = /path/to/mysqladmin
socket = /tmp/mysql.sock3
port = 3307
pid-file = /usr/local/mysql/data3/hostname.pid3
datadir = /usr/local/mysql/data3
language = /usr/local/mysql/share/mysql/swedish
user = unix_user2
複製代碼
使用下面的命令能夠配置文件中定義的全部服務器:
mysqld_multi start
複製代碼
也能夠單獨啓動某個服務器,如:
mysqld_multi start 1
複製代碼
與mysqld_safe
同樣,在一些支持mysql啓動與關閉的平臺上,並不會安裝mysqld_multi腳本。
前面咱們已經演示兩種關閉MySQL服務器的方式,固然,咱們也能夠經過使用mysqladmin命令來關閉MySQL服務器,如:
mysqladmin -p -u root shutdown
複製代碼
在Windows操做系統要啓動MySQL服務器有兩種方式,一種方式是像Linux同樣,直接經過命令行啓動,另外一種方式是把MySQL註冊爲一個Windows服務,這種方式可使用MySQL隨着Windows啓動而啓動,並且還能夠經過界面啓動。
mysqld
複製代碼
與Linux操做系統同樣,咱們可使用mysqladmin命令關閉一個正在運行的MySQL服務器
mysqladmin -p -u root shutdown
複製代碼
在windows操做系統中,除上面的本身運行命令啓動外,也能夠經過Windows服務的方式來管理MySQL。
使用下面的命令能夠將MySQL註冊爲Windows服務:
mysqld --install
複製代碼
若是你不想MySQL服務在開機時自動啓動,可使用下面的命令:
mysqld --install-manual
複製代碼
使用上面的命令,註冊的服務名爲mysqld,咱們也能夠自定義服務名,如:
# service_name爲自定義的服務名
mysqld --install service_name
複製代碼
也能夠在註冊Windows服務的時候,指定加載的配置文件,如:
mysqld --install service_name --default-file=filename
複製代碼
使用上面的命令,咱們把MySQL註冊爲Windows服務,所以咱們可使用下面的命令啓動MySQL:
net start mysql
複製代碼
若是MySQL已經註冊爲Windows服務,也可使用下面的命令關閉MySQL。
net stop mysql
複製代碼
若是想刪除Windows服務,可使用上面的命令,把服務停掉,而後再執行下面的命令:
sc delete mysql
複製代碼
上面咱們演示啓動MySQL服務器時,在啓動命令後面沒有跟任何參數,這意味着使用MySQL會使用本身程序內默認的參數,若是咱們想修改這些參數,在使用啓動命令時能夠一一指定。
好比,默認的MySQL監聽的是3306端口,咱們能夠啓動時,將端口更改成3307,如:
$ mysqld -P3307
複製代碼
使用下面的命令能夠查看mysqld的所有選項參數:
$ mysqld --verbose --help
複製代碼
對於mysqld_safe
、mysql.server
、mysqld_multi
,也能夠像mysqld同樣查看選項參數,好比:
mysqld_safe --help
複製代碼
MySQL的選項參數支持長選項和短選項兩種,長選項的參數比較長,像--user,--posrt這種稱爲長選項,而-P,-u這種稱爲短選項,如:
mysqld --user=mysql --port=3307
複製代碼
上面咱們講了經過啓動項參數來控制MySQL服務器的行爲,這種方式雖然簡單直接,但若是須要指定的啓動參數不少,那每次運行MySQL時,就須要在命令行敲一大堆的參數,很是不方便。
因此在MySQL中,還支持使用 配置文件(或者叫選項文件) 來保存啓動項,當咱們配置文件中指定相應的選項後,在啓動MySQL時,就會將配置文件中的選項做爲啓動項,好比咱們前面的示例的/etc/my.cnf文件:
[mysqld]
user=mysql
複製代碼
以--no-defaults選項啓動的MySQL程序除.mylogin.cnf外,不讀取任何選項文件。
$ mysqld --no-defaults
複製代碼
若是配置文件中指定的選項與在命令行中指定的選項相同,則以命令行中指定的選項爲優先,好比咱們在配置文件中指user=mysql,但在命令行以--user=mysql做爲啓動參數,如:
mysqld --user=test
複製代碼
這樣則以test做爲MySQL的啓動帳號。
MySQ配置文件通常以cnf爲後綴名,不過在Windows中也能夠ini爲後綴名,下面咱們來看看配置文件的加載順序。
對於類Unix操做系統中而方,會按照如下的順序加載配置文件:
文件路徑與名稱 | 相應說明 |
---|---|
/etc/my.cnf | 全局有效 |
/etc/mysql/my.cnf | 全局有效 |
SYSCONFDIR/my.cnf | 全局有效 |
$MYSQL_HOME/my.cnf | 特定於服務器的選項(僅限服務器) |
defaults-extra-file | 在命令行中指定的額外配置文件路徑 |
~/.my.cnf | 用戶特定選項,~表示當前用戶家目錄 |
~/.mylogin.cnf | 用戶特定的登陸路徑選項(僅限客戶端),~表示當前用戶家目錄 |
SYSCONFDIR表示在MySQL源碼安裝使用CMake編譯時經過DSYSCONFDIR選項指定的目錄,若是不指定,默認爲源碼的etc目錄,$MYSQL_HOME是咱們能夠本身指定的環境變量。
而對於Windows操做系統而言,啓動MySQL時會按照如下的順序加載各個配置文件:
文件路徑與名稱 | 解釋說明 |
---|---|
%WINDIR%\my.ini,%WINDIR%\my.cnf | 全局有效 |
C:\my.ini, C:\my.cnf | 全局有效 |
BASEDIR\my.ini, BASEDIR\my.cnf | 全局有效 |
defaults-extra-file | 在命令行中指定的額外配置文件路徑 |
%APPDATA%\MySQL.mylogin.cnf | 登陸路徑選項(對客戶端命令有效) |
%WINDIR%通常是指C:\WINDOWS目錄,固然咱們也能夠經過下面的命令查看:
C:\> echo %WINDIR%
複製代碼
%APPDATA%的值是Windows操做系統用於存放應用程序數據目錄,一樣能夠在命令行查看:
C:\> echo %APPDATA%
複製代碼
BASEDIR是MySQL的基本安裝目錄,若是咱們安裝的是MySQL5.7,則這個目錄通常是指C:\PROGRAMDIR\MySQL\MySQL 5.7 Server,PROGRAMDIR表示Program Files目錄。
雖然MySQL在啓動的時候會按順序加載前面所說的配置文件,不過在啓動時也能夠經過--default-extra-file
選項指定其餘的配置文件,如:
$ mysqld --default-extra-file=/home/test/config/my.cnf
複製代碼
MySQL的配置文件通常是純文本文件,用通常文本文件編輯器就可能編輯,但mylogin.cnf文件是個例外,mylogin.cnf文件是使用mysql_config_editor
程序生成的的一個加密文件,mylogin.cnf文件只對客戶端命令(mysql,mysqladmin等)有效,該文件只能包含user,host,password,socket等與客戶端登陸有關的選項。
MySQL配置的格式通常爲一個分組(group)下能夠有多個opt_name=value
或單獨opt_name
的選項,以下所示:
[group]
opt_name1=value1
opt_name2=value2
opt_name3
...
opt_nameN=valueN
[group]
opt_name1=value1
opt_name2=value2
opt_name3
...
opt_nameN=valueN
複製代碼
用#或;能夠註釋一行選項,如:
[mysql]
;user=mysql
#port=3306
複製代碼
group須要用中括號([])包含起來,表示一個選項組,其取值經常使用的有server、mysqld、mysqld_safe
、client、mysql、mysqladmin、mysqldump,分別對應不一樣的MySQL命令。
不過server和client,server選項組表示服務器命令的選項,因此mysqld,mysqld_safe
等服務器命令能夠讀取[server]選項組的配置,而client而對應客戶端命令的配置,因此mysql,mysqladmin,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
複製代碼
對於已經啓動起來的MySQL服務器來講,已經不能經過啓動項或配置文件來更改MySQL服務器的行爲,這時候可能經過設置MySQL的系統變量來作到這一點。
經過命令行客戶端登陸MySQL服務器後,咱們能夠經過下面的命令打印MySQL的系統變量:
mysql> show variables
複製代碼
因爲直接show variables命令會將全部的系統變量打印出來,因此咱們能夠加上like
來篩選出系統變量,如:
mysql> show variables like '%character_set_client%'
複製代碼
MySQL系統變量根據做用範圍的不一樣可分爲:全局系統變量(global variable)和會話系統變量(session variable)。
全局系統變量(global variable):對全部連到到服務器的客戶端都有用。
會話系統變量(session variable):只有當前鏈接會話發生做用。
經過SET
語句能夠設置系統變量,SET
後面跟GLOBAL
爲設置全局系統變量,SESSION
爲會話系統變量語法以下:
SET [GLOBAL|SESSION] var_name = var_value;
複製代碼
也可使用下面的語法:
SET [@@(GLOBAL|SESSION).]var_name = var_value;
複製代碼
簡單示例:
mysql> set global character_set_client=utf8;
複製代碼
若是咱們在設置系統變量時,不指定global或session,則默認爲設置會話系統變量,如:
mysql> set character_set_client=utf8;
複製代碼
查看不一樣做用範圍的系統變量
mysql> show global variables like 'character_set_client';
複製代碼
經過上面的瞭解,咱們知道,在啓動MySQL時,經過啓動項或都配置文件的各類參數,咱們能夠控制MySQL服務器的各類行爲,而即便MySQL服務器已經啓動完成,咱們仍然能夠經過系統變量來控制MySQL服務器。
歡迎掃碼關注,共同窗習進步