2.5.10 使用 systemdManagementMySQL 服务器

如果在以下 Linux 平台上使用 RPM 或 Debian 软件包安装 MySQL,则服务器的启动和关闭由 systemdManagement:

  • RPM 软件包平台:

  • 企业 Linux 变体版本 7 及更高版本

    • SUSE Linux Enterprise Server 12 及更高版本
  • Debian 家庭平台:

  • Debian platforms

    • Ubuntu platforms

如果从通用二进制发行版在使用 systemd 的平台上安装 MySQL,则可以按照MySQL 5.7 安全部署指南的“安装后设置”部分中提供的说明,手动配置对 MySQL 的 systemd 支持。

如果在使用 systemd 的平台上从源发行版安装 MySQL,请通过使用-DWITH_SYSTEMD=1 CMake 选项配置发行版来获取 MySQL 的 systemd 支持。参见第 2.9.7 节“ MySQL 源配置选项”

以下讨论涵盖了这些主题:

Note

在安装了对 MySQL 的 systemd 支持的平台上,不需要诸如mysqld_safe和 System V 初始化脚本之类的脚本,也不会安装它们。例如,mysqld_safe可以处理服务器重新启动,但是 systemd 提供了相同的功能,并且以与其他服务的 Management 一致的方式进行了此操作,而不是使用特定于应用程序的方式。

由于 systemd 能够在安装了 MySQL 的 systemd 支持的平台上 Management 多个 MySQL 实例,因此mysqld_multimysqld_multi.server 是不必要的,也不会安装。

systemd 概述

systemd 提供自动的 MySQL 服务器启动和关闭。它还使用 systemctl 命令启用手动服务器 Management。例如:

systemctl {start|stop|restart|status} mysqld

或者,使用 service 命令(具有相反的参数),该命令与 System V 系统兼容:

service mysqld {start|stop|restart|status}

Note

对于 systemctlservice 命令,如果 MySQL 服务名称不是mysqld,请使用适当的名称。例如,在基于 Debian 和 SLES 的系统上使用mysql而不是mysqld

对 systemd 的支持包括以下文件:

  • mysqld.service(RPM 平台),mysql.service(Debian 平台):systemd 服务单元配置文件,其中包含有关 MySQL 服务的详细信息。

  • [email protected](RPM 平台),[email protected](Debian 平台):类似于mysqld.servicemysql.service,但用于 Management 多个 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
PIDFile=/path/to/pid/file
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参数,因此必须使用 systemd 指定用于指定只能使用mysqld_safe已知选项设置的值的参数。

有关使用 systemd 而不是mysqld_safe的其他信息,请参见从 mysqld_safe 迁移到 systemd

您可以在override.conf中设置以下参数:

  • 要指定进程 ID 文件:

  • 从 MySQL 5.7.10 开始:使用override.conf并同时更改PIDFileExecStart来命名 PID 文件路径名。 MySQL 选项文件中进程 ID 文件的任何设置都将被忽略。要修改ExecStart,必须首先将其清除。例如:

[Service]
PIDFile=/var/run/mysqld/mysqld-custom.pid
ExecStart=
ExecStart=/usr/sbin/mysqld --pid-file=/var/run/mysqld/mysqld-custom.pid $MYSQLD_OPTS
  • 在 MySQL 5.7.10 之前:在override.conf中使用PIDFile而不是mysqldmysqld_safe--pid-file选项。 systemd 必须知道 PID 文件的位置,以便它可以重新启动或停止服务器。如果在 MySQL 选项文件中指定了 PID 文件值,则该值必须与PIDFile值匹配,否则 MySQL 启动可能会失败。

  • 要设置可用于 MySQL 服务器的文件 Descriptors 的数量,请在override.conf中使用LimitNOFILE而不是mysqld使用open_files_limit系统变量或mysqld_safe使用--open-files-limit选项。

  • 要设置最大核心文件大小,请在override.conf中使用LimitCore而不是mysqld_safe使用--core-file-size选项。

  • 要设置 MySQL 服务器的调度优先级,请在override.conf中使用Nice而不是mysqld_safe使用--nice选项。

一些 MySQL 参数是使用环境变量配置的:

  • LD_PRELOAD:如果 MySQL 服务器应使用特定的内存分配库,请设置此变量。

  • TZ:设置此变量以指定服务器的默认时区。

有多种方法可以指定环境变量值,以供 systemdManagement 的 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 的平台,如果服务器启动时为空,则将初始化数据目录。如果数据目录是一个临时挂载的远程挂载,则可能是一个问题:挂载点似乎是一个空的数据目录,然后将其初始化为新的数据目录。从 MySQL 5.7.20 开始,要禁止这种自动初始化行为,请在/etc/sysconfig/mysql文件中指定以下行(如果该文件不存在,则创建该文件):

NO_INIT=true

使用 systemd 配置多个 MySQL 实例

本节介绍如何为 MySQL 的多个实例配置 systemd。

Note

由于 systemd 可以在安装了 systemd 支持的平台上 Management 多个 MySQL 实例,因此mysqld_multimysqld_multi.server 是不必要的,也不会安装。从 RPM 平台的 MySQL 5.7.13 开始,从 Debian 平台的 5.7.19 开始,这是正确的。

要使用多实例功能,请修改my.cnf选项文件以包括每个实例的关键选项的配置。这些文件位置是典型的:

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

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

例如,要 Management 名为replica01replica02的两个实例,请将以下内容添加到选项文件中:

RPM platforms:

[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 platforms:

[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 命令来 Management 实例,例如:

systemctl start mysqld@replica01
systemctl start mysqld@replica02

要使实例在引导时运行,请执行以下操作:

systemctl enable mysqld@replica01
systemctl enable mysqld@replica02

还支持使用通配符。例如,此命令显示所有副本实例的状态:

systemctl status 'mysqld@replica*'

为了在同一台机器上 Management 多个 MySQL 实例,systemd 自动使用另一个单位文件:

在单元文件中,%I%i引用@标记后传入的参数,并用于 Management 特定实例。对于这样的命令:

systemctl start mysqld@replica01

systemd 使用以下命令启动服务器:

mysqld --defaults-group-suffix=@%I ...

结果是[server][mysqld][mysqld@replica01]选项组被读取并用于该服务实例。

Note

在 Debian 平台上,AppArmor 阻止服务器读取或写入/var/lib/mysql-replica*或默认位置以外的任何内容。要解决此问题,您必须自定义或禁用/etc/apparmor.d/usr.sbin.mysqld中的配置文件。

Note

在 Debian 平台上,用于 MySQL 卸载的打包脚本当前无法处理mysqld@个实例。在删除或升级软件包之前,必须先手动停止所有其他实例。

从 mysqld_safe 迁移到 systemd

由于未在使用 systemd 来 ManagementMySQL 的平台上安装mysqld_safe,因此必须以其他方式指定先前为该程序指定的选项(例如,在[mysqld_safe][safe_mysqld]选项组中):

  • mysqld也可以理解某些mysqld_safe选项,并且可以将它们从[mysqld_safe][safe_mysqld]选项组移至[mysqld]组。 包括--pid-file--open-files-limit--nice。要指定这些选项,请使用override.conf systemd 文件,如前所述。

Note

在系统平台上,不支持使用[mysqld_safe][safe_mysqld]选项组,这可能会导致意外行为。