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_multi和 mysqld_multi.server 是不必要的,也不会安装。
systemd 概述
systemd 提供自动的 MySQL 服务器启动和关闭。它还使用 systemctl 命令启用手动服务器 Management。例如:
systemctl {start|stop|restart|status} mysqld
或者,使用 service 命令(具有相反的参数),该命令与 System V 系统兼容:
service mysqld {start|stop|restart|status}
Note
对于 systemctl 或 service 命令,如果 MySQL 服务名称不是mysqld
,请使用适当的名称。例如,在基于 Debian 和 SLES 的系统上使用mysql
而不是mysqld
。
对 systemd 的支持包括以下文件:
-
mysqld.service
(RPM 平台),mysql.service
(Debian 平台):systemd 服务单元配置文件,其中包含有关 MySQL 服务的详细信息。 -
[email protected]
(RPM 平台),[email protected]
(Debian 平台):类似于mysqld.service
或mysql.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
并同时更改PIDFile
和ExecStart
来命名 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
而不是mysqld或mysqld_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_multi和 mysqld_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 名为replica01
和replica02
的两个实例,请将以下内容添加到选项文件中:
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 自动使用另一个单位文件:
-
[email protected]
而非mysqld.service
(RPM 平台) -
[email protected]
而非mysql.service
(Debian 平台)
在单元文件中,%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]
选项组,这可能会导致意外行为。
-
对于某些mysqld_safe选项,有类似的mysqld选项。例如,不支持启用
syslog
日志记录的mysqld_safe选项是--syslog。对于mysqld,请改为启用log_syslog系统变量。有关详细信息,请参见第 5.4.2 节“错误日志”。 -
可以在
override.conf
或环境变量中指定mysqld无法理解的mysqld_safe选项。例如,对于mysqld_safe,如果服务器应使用特定的内存分配库,则使用--malloc-lib选项指定该库。对于使用 systemdManagement 服务器的安装,如前所述,安排设置LD_PRELOAD
环境变量。