2.5.9 使用 systemd 管理 MySQL 服务器
如果您使用 RPM 或 Debian 包安装 MySQL,以下 Linux 平台上的服务器启动和关闭将由 systemd 管理:
-
RPM 包平台:
-
Enterprise Linux variants 版本 7 及更高
-
SUSE Linux Enterprise Server 12 及更高
-
Fedora 29 及更高
-
-
Debian 家族平台:
-
Debian 平台
-
Ubuntu 平台
-
如果您从通用二进制分发安装 MySQL,在使用 systemd 的平台上,您可以手动配置 systemd 支持 MySQL,按照MySQL 8.4 安全部署指南中的 post-installation 设置部分中的说明。
如果您从源代码分发安装 MySQL,在使用 systemd 的平台上,您可以通过配置 distribution 使用-DWITH_SYSTEMD=1
CMake 选项来获得 systemd 支持 MySQL。请参阅Section 2.8.7, “MySQL 源代码配置选项”。
以下讨论将涵盖这些主题:
在使用 systemd 支持 MySQL 的平台上,脚本,如mysqld_safe 和 System V 初始化脚本,是不必要的且不安装的。例如,mysqld_safe 可以处理服务器重启,但是 systemd 提供了相同的功能,并且以一致的方式管理其他服务,而不是使用特定的应用程序。
systemd 支持 MySQL 的平台上不使用 mysqld_safe 的一个结果是,不支持使用 [mysqld_safe]
或 [safe_mysqld]
部分在选项文件中的使用,这可能会导致未预期的行为。
由于 systemd 可以管理多个 MySQL 实例,在使用 systemd 支持 MySQL 的平台上,mysqld_multi 和 mysqld_multi.server 是不必要的且不安装。
systemd 提供了自动 MySQL 服务器启动和关闭的功能。它还启用了使用 systemctl 命令进行手动服务器管理的功能。例如:
$> systemctl {start|stop|restart|status} mysqld
Alternatively, 使用 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 平台):单元文件支持脚本。这脚本帮助创建错误日志文件,只有当日志位置匹配模式 (/var/log/mysql*.log
在 RPM 平台上,/var/log/mysql/*.log
在 Debian 平台上) 时。在其他情况下,错误日志目录必须可写或错误日志文件必须存在且可写,以便 mysqld 进程。
要添加或更改 systemd 选项以便 MySQL,可以使用以下方法:
-
使用本地 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服务器可用的数量,请使用
LimitNOFILE
在override.conf
中,而不是open_files_limit
系统变量或mysqld或--open-files-limit
选项。 -
要将最大核心文件大小设置为MySQL服务器可用的大小,请使用
LimitCore
在override.conf
中,而不是--core-file-size
选项。 -
要将MySQL服务器的调度优先级设置为某个值,请使用
Nice
在override.conf
中,而不是--nice
选项。
一些MySQL参数是通过环境变量配置的:
-
LD_PRELOAD
:如果MySQL服务器应该使用特定的内存分配库,请设置这个变量。 -
NOTIFY_SOCKET
:这个环境变量指定了mysqld使用的套接字,以便与systemd通信通知MySQL服务器启动完成和服务状态变化。systemd在启动mysqld服务时设置这个变量。MySQL服务器读取变量设置并将其写入定义的位置。MySQL 8.4 中,mysqld 使用
Type=notify
过程启动类型。(Type=forking
在 MySQL 5.7 中使用。) 使用Type=notify
,systemd 自动配置 socket 文件,并将NOTIFY_SOCKET
环境变量的路径导出。 -
TZ
:将该变量设置为指定服务器的默认时区。
有多种方式可以指定环境变量值,以供 MySQL 服务器进程由 systemd 管理:
-
在
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
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 实例。
由于 systemd 具有管理多个 MySQL 实例的能力,在支持 systemd 的平台上,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@
实例。卸载或升级包之前,您必须手动停止任何额外实例。
因为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文件,之前描述的。Note在systemd平台上,使用
[mysqld_safe]
和[safe_mysqld]
选项组不受支持,并可能导致未预期的行为。 -
对于某些mysqld_safe选项,有些mysqld命令有替代方案。例如,mysqld_safe启用
--syslog
日志记录的选项已经弃用。要将错误日志输出到系统日志中,请参阅第7.4.2.8节,“Error Logging to the System Log”中的指令。 -
mysqld_safe选项不被mysqld理解,可以在
override.conf
或环境变量中指定。例如,使用mysqld_safe,如果服务器应该使用特定的内存分配库,这可以使用--malloc-lib
选项指定。对于使用systemd管理服务器的安装,可以将LD_PRELOAD
环境变量设置为相应的值,而不是使用mysqld_safe,如前所述。