如果在以下 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_multi 和 mysqld_multi.server 是不必要的,也不会被安装。
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.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 选项,可以使用以下方法
使用本地化的 systemd 配置文件。
安排 systemd 为 MySQL 服务器进程设置环境变量。
设置
MYSQLD_OPTSsystemd 变量。
要使用本地化的 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,而不是为 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 通信启动完成通知和服务状态更改的套接字。它由 systemd 在 mysqld 服务启动时设置。mysqld 服务读取变量设置并写入定义的位置。在 MySQL 9.0 中,mysqld 使用
Type=notify进程启动类型。(Type=forking用于 MySQL 5.7。)使用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
要为 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
本节介绍如何为多个 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.logDebian 平台
[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@replica01systemd 使用如下命令启动服务器
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.confsystemd 文件。注意在 systemd 平台上,不支持使用
[mysqld_safe]和[safe_mysqld]选项组,并且可能会导致意外行为。对于某些 mysqld_safe 选项,可以使用其他 mysqld 过程。例如,用于启用
syslog日志记录的 mysqld_safe 选项是--syslog,现已弃用。要将错误日志输出写入系统日志,请使用 第 7.4.2.8 节“错误日志记录到系统日志” 中的说明。mysqld 无法理解的 mysqld_safe 选项可以在
override.conf或环境变量中指定。例如,使用 mysqld_safe 时,如果服务器应使用特定的内存分配库,则使用--malloc-lib选项指定。对于使用 systemd 管理服务器的安装,请改为设置LD_PRELOAD环境变量,如前所述。