重學MySQL系列(二):一文讓你瞭解MySQL啓動整個過程

原創做者,公衆號【程序員讀書】,歡迎關注公衆號,轉載文章請註明出處哦。mysql

平時咱們在開發應用程序的時候,更可能是以客戶端(Client)的身份鏈接到一臺已經啓動好的MySQL服務器,所以咱們對於如何啓動一個MySQL服務器,如何設置啓動參數,以及在啓動完成後如何更改MySQL的行爲等操做並無太多的瞭解。程序員

而實際上,MySQL服務器啓動或運行過程當中各項啓動參數的設置,對MySQL的行爲與性能有相當重要的影響,所以在這篇文章中,咱們一塊兒探究一下有關MySQL服務器啓動和關閉、配置文件與系統變量一些細節。sql

在類Unix操做系統上啓動與關閉MySQL

雖然MySQL支持多種不一樣的平臺和操做系統,好比Windows,Mac OS,但做爲數據庫服務器,MySQL更多的時候仍是運行在類Unix操做系統上,好比Centos、Ubuntu。數據庫

在類Unix操做系統中,有許多種方式來啓動MySQL,咱們既能夠手動運行MySQL,也能夠將MySQL設置爲系統的標準服務,在系統啓動時自動運行。windows

設置啓動帳號

在啓動MySQL前,首先要考慮的是用哪個登陸帳號來運行MySQL,若是不作設置的話,通常會把咱們當前登陸的帳號做爲MySQL的啓動帳號。安全

設置啓動帳號的注意事項

咱們這裏講的是要本身設置啓動帳號的狀況,其實有一些安裝方式會自動幫咱們設置好啓動帳號的,這時候咱們就不須要再本身設置了。bash

不使用root帳號做爲MySQL啓動帳號

root在類Unix操做系統中是無所不能的存在,因此通常不要使用root去啓動一些服務軟件,否則的話,若是服務被黑客入侵,那麼黑客即可以輕易得到root權限,進而徹底控制咱們的服務器,這是很是危險的。服務器

應該始終用同一個帳號來啓動MySQL

應該以同一個帳號來啓動服務器軟件,若是咱們在啓動服務軟件時使用不一樣的帳號,那麼這個軟件所生成的一些文件就屬於不一樣的帳號,這時候軟件所管理的文件權限將變得亂七八糟,權限混亂。session

應該使用低權限的帳號來運行MySQL

不使用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的啓動項的內容,後面有更詳細的講解。

啓動MySQL

在Linux中通常有如下幾種啓動MySQL服務器的方式,下面咱們來一一介紹一下。

mysqld

mysqld命令是MySQL的主程序,經過運行mysqld命令能夠啓動一個MySQL守護進程,即MySQL服務器,經過mysqld來啓動MySQL服務器是最直接簡單,但同時也是最不經常使用的方式。

# 在MySQL安裝目錄的bin目錄下執行
$ mysqld
複製代碼

mysqld_safe

mysqld_safe是MySQL的啓動腳本,mysqld_safe添加了一些安全功能,在發生錯誤時重啓服務器以及將運行時信息記錄到錯誤日誌中,因此通常更推薦使用mysqld_safe來啓動MySQL服務器。

# 查看mysqld_safe支持的選項
$ mysqld_safe --help
複製代碼

須要注意的是,在一些平臺中並不會安裝mysqld_safe腳本,這是由於這些平臺在系統上支持mysql的啓動與關閉,所以mysqld_safe便不須要了。

mysql.server

mysql.server也是一個用於管理MySQL服務器的腳本,其底層調用的是mysqld_safe腳本。

啓動MySQL

$ mysql.server start
複製代碼

關閉MySQL

$ mysql.server stop
複製代碼

mysqld_safe同樣,在一些支持mysql啓動與關閉的平臺上,並不會安裝mysql.server腳本。

mysqld_multi

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

前面咱們已經演示兩種關閉MySQL服務器的方式,固然,咱們也能夠經過使用mysqladmin命令來關閉MySQL服務器,如:

mysqladmin -p -u root shutdown
複製代碼

在Windows上啓動與關閉MySQL

在Windows操做系統要啓動MySQL服務器有兩種方式,一種方式是像Linux同樣,直接經過命令行啓動,另外一種方式是把MySQL註冊爲一個Windows服務,這種方式可使用MySQL隨着Windows啓動而啓動,並且還能夠經過界面啓動。

命令行啓動與閉

mysqld
複製代碼

與Linux操做系統同樣,咱們可使用mysqladmin命令關閉一個正在運行的MySQL服務器

mysqladmin -p -u root shutdown
複製代碼

經過Windows服務啓動與關閉

在windows操做系統中,除上面的本身運行命令啓動外,也能夠經過Windows服務的方式來管理MySQL。

註冊Windows服務

使用下面的命令能夠將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服務

若是想刪除Windows服務,可使用上面的命令,把服務停掉,而後再執行下面的命令:

sc delete mysql
複製代碼

設置啓動項

上面咱們演示啓動MySQL服務器時,在啓動命令後面沒有跟任何參數,這意味着使用MySQL會使用本身程序內默認的參數,若是咱們想修改這些參數,在使用啓動命令時能夠一一指定。

好比,默認的MySQL監聽的是3306端口,咱們能夠啓動時,將端口更改成3307,如:

$ mysqld -P3307
複製代碼

使用下面的命令能夠查看mysqld的所有選項參數:

$ mysqld --verbose --help
複製代碼

對於mysqld_safemysql.servermysqld_multi,也能夠像mysqld同樣查看選項參數,好比:

mysqld_safe --help
複製代碼

MySQL的選項參數支持長選項和短選項兩種,長選項的參數比較長,像--user,--posrt這種稱爲長選項,而-P,-u這種稱爲短選項,如:

mysqld --user=mysql --port=3307
複製代碼

MySQL的配置文件

上面咱們講了經過啓動項參數來控制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相關配置文件

對於類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相關配置文件

而對於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目錄。

--default-extra-file

雖然MySQL在啓動的時候會按順序加載前面所說的配置文件,不過在啓動時也能夠經過--default-extra-file選項指定其餘的配置文件,如:

$ mysqld --default-extra-file=/home/test/config/my.cnf
複製代碼

mylogin.cnf

MySQL的配置文件通常是純文本文件,用通常文本文件編輯器就可能編輯,但mylogin.cnf文件是個例外,mylogin.cnf文件是使用mysql_config_editor程序生成的的一個加密文件,mylogin.cnf文件只對客戶端命令(mysql,mysqladmin等)有效,該文件只能包含user,host,password,socket等與客戶端登陸有關的選項。

如何寫一個MySQL配置文件

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服務器。

歡迎掃碼關注,共同窗習進步

相關文章
相關標籤/搜索