如果您在下列 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 的選項設定,若要設定這些參數,必須使用 systemd,因為 mysqld 沒有對應的參數。
關於使用 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 8.4 中,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@
執行個體。在移除或升級套件之前,您必須先手動停止任何額外的執行個體。
由於在使用 systemd 管理 MySQL 的平台上未安裝 mysqld_safe,因此先前為該程式指定的選項(例如,在 [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
環境變數,如先前所述。