如果您在以下 Linux 平台上使用 RPM 或 Debian 软件包安装 MySQL,则服务器启动和关闭由 systemd 管理:
RPM 包平台:
Enterprise Linux 变体版本 7 及更高版本
SUSE Linux Enterprise Server 12 及更高版本
Fedora 29 及更高版本
Debian 系列平台:
Debian 平台
Ubuntu 平台
如果您在使用 systemd 的平台上从通用二进制分发版安装 MySQL,则可以按照MySQL 8.0 安全部署指南 的安装后设置部分中提供的说明手动配置对 MySQL 的 systemd 支持 。
如果您从使用 systemd 的平台上的源分发安装 MySQL,请通过使用
CMake选项配置分发来获得对 MySQL 的 systemd 支持。请参阅
第 2.9.7 节,“MySQL 源配置选项”。
-DWITH_SYSTEMD=1
以下讨论涵盖了这些主题:
在安装了对 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是不必要的,因此没有安装。
systemd 提供自动 MySQL 服务器启动和关闭。它还使用 systemctl命令启用手动服务器管理。例如:
$> systemctl {start|stop|restart|status} mysqld
或者,使用与 System V 系统兼容的服务命令(参数颠倒):
$> service mysqld {start|stop|restart|status}
对于systemctl命令(和替代服务命令),如果 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 进程的用户是可写的。
要为 MySQL 添加或更改 systemd 选项,可以使用以下方法:
使用本地化的 systemd 配置文件。
安排 systemd 为 MySQL 服务器进程设置环境变量。
设置
MYSQLD_OPTS
系统变量。
要使用本地化的 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 选项文件来获取它们。指定值的参数必须使用 systemd 指定,否则只能使用mysqld_safe已知的选项设置,因为没有相应的 mysqld参数。
有关使用 systemd 而不是 mysqld_safe的更多信息,请参阅 从 mysqld_safe 迁移到 systemd。
您可以在 中设置以下参数
override.conf
:
要设置 MySQL 服务器可用的文件描述符的数量,请使用
LimitNOFILE
inoverride.conf
而不是 mysqldopen_files_limit
的系统变量或 mysqld_safe的 选项。--open-files-limit
要设置最大核心文件大小,请使用
LimitCore
inoverride.conf
而不是 mysqld_safe--core-file-size
的选项。要设置 MySQL 服务器的调度优先级,请使用
Nice
inoverride.conf
而不是 mysqld_safe--nice
的选项 。
一些 MySQL 参数是使用环境变量配置的:
LD_PRELOAD
:如果 MySQL 服务器应使用特定的内存分配库,则设置此变量。NOTIFY_SOCKET
:此环境变量指定mysqld用于与 systemd 通信启动完成和服务状态更改通知的套接字。它是在 mysqld服务启动时由 systemd 设置的。mysqld服务读取变量设置并写入定义的位置 。在 MySQL 8.0 中,mysqld使用
Type=notify
进程启动类型。(Type=forking
在 MySQL 5.7 中使用。)Type=notify
systemd 自动配置套接字文件并将路径导出到NOTIFY_SOCKET
环境变量。TZ
:设置此变量以指定服务器的默认时区。
有多种方法可以指定由 systemd 管理的 MySQL 服务器进程使用的环境变量值:
使用文件
Environment
中的行override.conf
。有关语法,请参阅前面讨论中描述如何使用此文件的示例。指定
/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
本节介绍如何为多个 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
and的实例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]
or
选项组中):[safe_mysqld]
一些mysqld_safe选项也被mysqld理解并且可以从
[mysqld_safe]
or[safe_mysqld]
选项组移动到[mysqld]
组。这 不包括--pid-file
、--open-files-limit
或--nice
。要指定这些选项,请使用override.conf
systemd 文件,如前所述。笔记在 systemd 平台上,不支持使用
[mysqld_safe]
和[safe_mysqld]
选项组,这可能会导致意外行为。对于某些mysqld_safe选项,有替代的mysqld过程。例如,用于启用日志记录 的mysqld_safe选项是,它已被弃用。要将错误日志输出写入系统日志,请使用第 5.4.2.8 节“将错误记录到系统日志”中的说明。
syslog
--syslog
mysqld不理解的 mysqld_safe选项可以在
override.conf
或 环境变量中指定。例如,对于mysqld_safe,如果服务器应使用特定的内存分配库,则使用该--malloc-lib
选项指定。对于使用 systemd 管理服务器的安装,安排设置LD_PRELOAD
环境变量,如前所述。