2.5.9 使用 systemd 管理 MySQL 服务器实例
- systemd 概述
- 为 MySQL 配置 systemd
- 使用 systemd 配置多个 MySQL 实例
- 从 mysqld_safe 迁移到 systemd
如果在以下 Linux 平台上使用 RPM 或 Debian 软件包安装 MySQL ,则服务器启动和关闭由 systemd 管理:
- RPM 包平台:
- Enterprise Linux variants version 7 及更高版本
- SUSE Linux Enterprise Server 12 及更高版本
- Fedora 29 及更高版本
- Debian 家族平台 :
- Debian 平台
- Ubuntu 平台
如果在使用 systemd 的平台上从通用二进制发行版安装 MySQL ,则可以按照 《 MySQL 8.0 安全部署指南》的安装后设置部分中提供的说明手动为 MySQL 配置 systemd 支持。
如果您在使用 systemd 的平台上从源发行版安装 MySQL ,请使用 -DWITH_systemd=1
CMake 选项配置该发行版,以获得对 MySQL 的 systemd 支持。请参阅 第 2.9.7 节“ MySQL 源配置选项” 。
注意
在安装了对 MySQL 的 systemd 支持的平台上, mysqld_safe 和 System V 初始化脚本等脚本是不必要的,也不会安装。例如, mysqld_safe 可以处理服务器重新启动,但 systemd 提供了相同的功能,并以与其他服务的管理一致的方式执行,而不是使用特定于应用程序的程序。
在使用 systemd 进行服务器管理的平台上不使用 mysqld_safe 的一个含义是不支持在选项文件中使用[mysqld_safe]或[safe_mysqld]节,这可能会导致意外行为。
因为 systemd 能够在安装了 systemd 支持 MySQL 的平台上管理多个 MySQL 实例, mysqld_multi 和 mysqld_multi.server 是不必要的,并且未安装。
译者注
实际上当前 RPM 包安装的 MySQL 仍然会安装 mysqld_safe ,而的确不会安装 mysqld_multi 了。
systemd 概述
systemd 提供 MySQL 服务器的自动启动和关闭功能。它还支持使用 systemctl
命令进行手动服务器管理。例如:
$> systemctl {start|stop|restart|status} mysqld
或者,使用与 System V 系统兼容的 service
命令(参数颠倒):
$> 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
要添加或更改 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 参数。
您可以在 override.conf
中设置以下参数:
- 要设置 MySQL 服务器可用的文件描述符数量,请在
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 服务器应该使用特定的内存分配库,则设置此变量。
- NOTIFY_SOCKET :此环境变量指定 mysqld 用于与 systemd 通信启动完成和服务状态更改通知的套接字。它是在 mysqld 服务启动时由 systemd 设置的。 mysqld 服务读取变量设置并写入定义的位置。
在 MySQL 8.0 中,mysqld 使用Type=notify
进程启动类型。( 在 MySQL 5.7 中使用Type=forking
。)使用Type=notify
, systemd 自动配置套接字文件并将路径导出到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
要在不直接修改 systemd 配置文件的情况下为 mysqld 指定选项,请设置或取消设置 MYSQLD_OPTS
systemd 变量。例如:
systemctl set-environment MYSQLD_OPTS="--general_log=1"
systemctl unset-environment MYSQLD_OPTS
也可以在 /etc/sysconfig/mysql
文件中设置 MYSQLD_OPTS
变量。
修改 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_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
引用 @
标记后传入的参数,并用于管理特定实例。
systemd 使用如下命令启动 MySQL 服务器:
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 也可以理解一些 mysqld_safe 选项,可以从
[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
,该选项已被弃用。要将错误日志输出写入系统日志,请使用 第5.4.2.8节 “错误日志记录到系统日志中” 的说明。 - mysqld 无法理解的 mysqld_safe 选项可以在
override.conf
或环境变量中指定。例如,对于 mysqld_safe ,如果服务器应该使用特定的内存分配库,则使用--malloc-lib
选项指定。对于使用 systemd 管理服务器的安装,请改为设置LD_PRELOAD
环境变量,如前所述。