如果您在下列 Linux 平台上使用 RPM 或 Debian 套件安裝 MySQL,則伺服器的啟動和關閉將由 systemd 管理。
RPM 套件平台
Enterprise Linux 變體版本 7 及更高版本
SUSE Linux Enterprise Server 12 及更高版本
Fedora 29 及更高版本
Debian 系列平台
Debian 平台
Ubuntu 平台
如果您在使用 systemd 的平台上從通用二進位發行版安裝 MySQL,您可以按照MySQL 8.4 安全部署指南的安裝後設定章節中提供的說明,手動設定 MySQL 的 systemd 支援。
如果您在使用 systemd 的平台上從原始碼發行版安裝 MySQL,請使用 -DWITH_SYSTEMD=1
CMake 選項設定發行版,以取得 MySQL 的 systemd 支援。請參閱第 2.8.7 節「MySQL 原始碼設定選項」。
以下討論涵蓋這些主題
在安裝 MySQL 的 systemd 支援的平台上,例如 mysqld_safe 等腳本和 System V 初始化腳本是不必要的,且不會安裝。例如,mysqld_safe 可以處理伺服器重新啟動,但 systemd 提供相同的功能,並以與管理其他服務一致的方式進行,而不是使用應用程式特定的程式。
在為伺服器管理使用 systemd 的平台上不使用 mysqld_safe 的一個含義是,選項檔案中不支援使用 [mysqld_safe]
或 [safe_mysqld]
區段,且可能會導致意外行為。
因為 systemd 具有在安裝 MySQL 的 systemd 支援的平台上管理多個 MySQL 執行個體的能力,因此 mysqld_multi 和 mysqld_multi.server 是不必要的,且不會安裝。
systemd 提供自動 MySQL 伺服器啟動和關閉。它也允許使用 systemctl 命令進行手動伺服器管理。例如
$> systemctl {start|stop|restart|status} mysqld
或者,使用 service 命令 (引數反轉),它與 System V 系統相容
$> service mysqld {start|stop|restart|status}
對於 systemctl 命令 (和替代的 service 命令),如果 MySQL 服務名稱不是 mysqld
,則使用適當的名稱。例如,在以 Debian 為基礎和 SLES 系統上,使用 mysql
而不是 mysqld
。
對 systemd 的支援包括這些檔案
mysqld.service
(RPM 平台)、mysql.service
(Debian 平台):systemd 服務單元設定檔案,其中包含有關 MySQL 服務的詳細資訊。mysqld@.service
(RPM 平台)、mysql@.service
(Debian 平台):類似mysqld.service
或mysql.service
,但用於管理多個 MySQL 執行個體。mysqld.tmpfiles.d
:包含資訊以支援tmpfiles
功能的檔案。此檔案安裝的名稱為mysql.conf
。mysqld_pre_systemd
(RPM 平台)、mysql-system-start
(Debian 平台):單元檔案的支援腳本。此腳本僅在記錄位置符合模式時,才協助建立錯誤記錄檔 (RPM 平台的/var/log/mysql*.log
,Debian 平台的/var/log/mysql/*.log
)。在其他情況下,錯誤記錄目錄必須可寫入,或者執行 mysqld 處理序的使用者必須存在可寫入的錯誤記錄。
若要新增或變更 MySQL 的 systemd 選項,可以使用這些方法
使用本機化的 systemd 設定檔案。
安排 systemd 為 MySQL 伺服器處理序設定環境變數。
設定
MYSQLD_OPTS
systemd 變數。
若要使用本機化的 systemd 設定檔案,請建立 /etc/systemd/system/mysqld.service.d
目錄 (如果不存在)。在該目錄中,建立一個包含 [Service]
區段的檔案,其中列出所需的設定。例如
[Service]
LimitNOFILE=max_open_files
Nice=nice_level
LimitCore=core_file_limit
Environment="LD_PRELOAD=/path/to/malloc/library"
Environment="TZ=time_zone_setting"
此處的討論使用 override.conf
作為此檔案的名稱。較新版本的 systemd 支援下列命令,它會開啟編輯器,並允許您編輯檔案
systemctl edit mysqld # RPM platforms
systemctl edit mysql # Debian platforms
每當您建立或變更 override.conf
時,請重新載入 systemd 設定,然後告知 systemd 重新啟動 MySQL 服務
systemctl daemon-reload
systemctl restart mysqld # RPM platforms
systemctl restart mysql # Debian platforms
使用 systemd,override.conf
設定方法必須用於某些參數,而不是 MySQL 選項檔案中的 [mysqld]
、[mysqld_safe]
或 [safe_mysqld]
群組中的設定
對於某些參數,必須使用
override.conf
,因為 systemd 本身必須知道其值,而且它無法讀取 MySQL 選項檔案以取得這些值。有些參數只能透過 mysqld_safe 的選項設定,但因為沒有對應的 mysqld 參數,所以必須使用 systemd 設定。
關於使用 systemd 而非 mysqld_safe 的更多資訊,請參閱從 mysqld_safe 遷移到 systemd。
您可以在 override.conf
中設定以下參數
若要設定 MySQL 伺服器可用的檔案描述符數量,請在
override.conf
中使用LimitNOFILE
,而不是open_files_limit
系統變數(針對 mysqld)或--open-files-limit
選項(針對 mysqld_safe)。若要設定最大核心檔案大小,請在
override.conf
中使用LimitCore
,而不是--core-file-size
選項(針對 mysqld_safe)。若要設定 MySQL 伺服器的排程優先順序,請在
override.conf
中使用Nice
,而不是--nice
選項(針對 mysqld_safe)。
有些 MySQL 參數是使用環境變數來配置的
LD_PRELOAD
:如果 MySQL 伺服器應使用特定的記憶體配置函式庫,請設定此變數。NOTIFY_SOCKET
:此環境變數指定 mysqld 用於與 systemd 通訊,以通知啟動完成和服務狀態變更的 Socket。當啟動 mysqld 服務時,systemd 會設定此變數。 mysqld 服務會讀取變數設定並寫入至定義的位置。在 MySQL 9.0 中,mysqld 使用
Type=notify
處理程序啟動類型。(MySQL 5.7 中使用Type=forking
。) 使用Type=notify
時,systemd 會自動配置一個 Socket 檔案,並將路徑匯出至NOTIFY_SOCKET
環境變數。TZ
:設定此變數以指定伺服器的預設時區。
有多種方法可以指定 systemd 管理的 MySQL 伺服器處理程序所使用的環境變數值
在
override.conf
檔案中使用Environment
行。關於語法,請參閱前面討論中描述如何使用此檔案的範例。在
/etc/sysconfig/mysql
檔案中指定值(如果該檔案不存在,請建立它)。使用以下語法指派值LD_PRELOAD=/path/to/malloc/library TZ=time_zone_setting
修改
/etc/sysconfig/mysql
後,重新啟動伺服器以使變更生效systemctl restart mysqld # RPM platforms systemctl restart mysql # Debian platforms
若要指定 mysqld 的選項,而無需直接修改 systemd 設定檔,請設定或取消設定 MYSQLD_OPTS
systemd 變數。例如
systemctl set-environment MYSQLD_OPTS="--general_log=1"
systemctl unset-environment MYSQLD_OPTS
MYSQLD_OPTS
也可以在 /etc/sysconfig/mysql
檔案中設定。
修改 systemd 環境後,重新啟動伺服器以使變更生效
systemctl restart mysqld # RPM platforms
systemctl restart mysql # Debian platforms
對於使用 systemd 的平台,如果資料目錄為空,則會在伺服器啟動時初始化資料目錄。如果資料目錄是暫時消失的遠端掛載,這可能會是一個問題:掛載點會顯示為空的資料目錄,然後會初始化為新的資料目錄。若要抑制此自動初始化行為,請在 /etc/sysconfig/mysql
檔案中指定以下行(如果該檔案不存在,請建立它)
NO_INIT=true
本節說明如何為多個 MySQL 實例配置 systemd。
由於 systemd 具有在安裝 systemd 支援的平台上管理多個 MySQL 實例的能力,因此不需要安裝 mysqld_multi 和 mysqld_multi.server。
若要使用多實例功能,請修改 my.cnf
選項檔案,以包含每個實例的索引鍵選項配置。這些檔案位置很典型
/etc/my.cnf
或/etc/mysql/my.cnf
(RPM 平台)/etc/mysql/mysql.conf.d/mysqld.cnf
(Debian 平台)
例如,若要管理兩個名為 replica01
和 replica02
的實例,請將類似以下的內容新增至選項檔案
RPM 平台
[mysqld@replica01]
datadir=/var/lib/mysql-replica01
socket=/var/lib/mysql-replica01/mysql.sock
port=3307
log-error=/var/log/mysqld-replica01.log
[mysqld@replica02]
datadir=/var/lib/mysql-replica02
socket=/var/lib/mysql-replica02/mysql.sock
port=3308
log-error=/var/log/mysqld-replica02.log
Debian 平台
[mysqld@replica01]
datadir=/var/lib/mysql-replica01
socket=/var/lib/mysql-replica01/mysql.sock
port=3307
log-error=/var/log/mysql/replica01.log
[mysqld@replica02]
datadir=/var/lib/mysql-replica02
socket=/var/lib/mysql-replica02/mysql.sock
port=3308
log-error=/var/log/mysql/replica02.log
此處顯示的複本名稱使用 @
作為分隔符號,因為這是 systemd 唯一支援的分隔符號。
然後透過一般 systemd 命令管理實例,例如
systemctl start mysqld@replica01
systemctl start mysqld@replica02
若要啟用實例在啟動時執行,請執行以下操作
systemctl enable mysqld@replica01
systemctl enable mysqld@replica02
也支援使用萬用字元。例如,此命令會顯示所有複本實例的狀態
systemctl status 'mysqld@replica*'
若要在同一部機器上管理多個 MySQL 實例,systemd 會自動使用不同的單元檔案
mysqld@.service
而不是mysqld.service
(RPM 平台)mysql@.service
而不是mysql.service
(Debian 平台)
在單元檔案中,%I
和 %i
參考在 @
標記之後傳入的參數,並用於管理特定實例。對於如下的命令
systemctl start mysqld@replica01
systemd 會使用如下的命令啟動伺服器
mysqld --defaults-group-suffix=@%I ...
結果是會讀取 [server]
、[mysqld]
和 [mysqld@replica01]
選項群組,並將其用於該服務實例。
在 Debian 平台上,AppArmor 會阻止伺服器讀取或寫入 /var/lib/mysql-replica*
或預設位置以外的任何內容。若要解決此問題,您必須在 /etc/apparmor.d/usr.sbin.mysqld
中自訂或停用設定檔。
在 Debian 平台上,MySQL 解除安裝的封裝指令碼目前無法處理 mysqld@
實例。在移除或升級封裝之前,您必須先手動停止任何額外的實例。
由於 mysqld_safe 未安裝在使用 systemd 來管理 MySQL 的平台上,因此先前為該程式指定的選項(例如,在 [mysqld_safe]
或 [safe_mysqld]
選項群組中)必須透過其他方式指定
某些 mysqld_safe 選項也為 mysqld 所理解,並且可以從
[mysqld_safe]
或[safe_mysqld]
選項群組移至[mysqld]
群組。這不包含--pid-file
、--open-files-limit
或--nice
。若要指定這些選項,請使用先前所述的override.conf
systemd 檔案。注意在 systemd 平台上,不支援使用
[mysqld_safe]
和[safe_mysqld]
選項群組,這可能會導致意外行為。對於某些 mysqld_safe 選項,有替代的 mysqld 程序。例如,用於啟用
syslog
記錄的 mysqld_safe 選項為--syslog
,此選項已過時。若要將錯誤記錄輸出寫入至系統記錄,請使用第 7.4.2.8 節「記錄錯誤到系統記錄」中的指示。mysqld_safe 無法被 mysqld 理解的選項可以在
override.conf
或環境變數中指定。例如,使用 mysqld_safe,如果伺服器應使用特定的記憶體配置函式庫,則會使用--malloc-lib
選項來指定。對於使用 systemd 管理伺服器的安裝,請安排改為設定LD_PRELOAD
環境變數,如先前所述。