文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  使用 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 的選項設定,若要設定這些參數,必須使用 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

使用 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

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