文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式 Letter) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  使用 systemd 管理 MySQL 伺服器

2.5.9 使用 systemd 管理 MySQL 伺服器

如果您在下列 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_multimysqld_multi.server 是不必要的,且不會安裝。

systemd 概觀

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.servicemysql.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

若要新增或變更 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

使用 systemd 設定多個 MySQL 實例

本節說明如何為多個 MySQL 實例配置 systemd。

注意

由於 systemd 具有在安裝 systemd 支援的平台上管理多個 MySQL 實例的能力,因此不需要安裝 mysqld_multimysqld_multi.server

若要使用多實例功能,請修改 my.cnf 選項檔案,以包含每個實例的索引鍵選項配置。這些檔案位置很典型

  • /etc/my.cnf/etc/mysql/my.cnf (RPM 平台)

  • /etc/mysql/mysql.conf.d/mysqld.cnf (Debian 平台)

例如,若要管理兩個名為 replica01replica02 的實例,請將類似以下的內容新增至選項檔案

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

由於 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 環境變數,如先前所述。