Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Managing MySQL Server with systemd

2.5.9 使用systemd管理MySQL Server

如果您使用RPM或Debian软件包在以下Linux平台上安装MySQL,服务器启动和关闭将由systemd管理:

  • RPM软件包平台:

    • Enterprise Linux变体版本7及更高版本

    • SUSE Linux Enterprise Server 12及更高版本

    • Fedora 29及更高版本

  • Debian家族平台:

    • Debian平台

    • Ubuntu平台

如果您从通用二进制分布在使用systemd的平台上安装MySQL,可以按照安全部署指南中的说明手动配置systemd支持MySQL。

如果您从源代码分布在使用systemd的平台上安装MySQL,可以使用 -DWITH_SYSTEMD=1 CMake 选项来获得systemd支持MySQL。见 第 2.8.7 节,“MySQL 源代码配置选项”

以下讨论涵盖以下主题:

Note

在安装了systemd支持MySQL的平台上,脚本如 mysqld_safe 和System V初始化脚本是不必要的,不会被安装。例如, mysqld_safe 可以处理服务器重启,但systemd提供了相同的功能,并且以与管理其他服务一致的方式进行。

在使用systemd管理服务器的平台上,不使用 mysqld_safe 的一个结果是,使用 [mysqld_safe][safe_mysqld] 部分在选项文件中不受支持,可能会导致意外行为。

因为systemd可以在安装了systemd支持MySQL的平台上管理多个MySQL实例, mysqld_multimysqld_multi.server 是不必要的,不会被安装。

systemd概述

systemd提供自动MySQL服务器启动和关闭。它还启用了使用 systemctl 命令的手动服务器管理。例如:

$> systemctl {start|stop|restart|status} mysqld

或者,使用 service 命令(参数反转),与System V系统兼容:

$> service mysqld {start|stop|restart|status}
Note

对于 systemctl 命令(和替代的 service 命令),如果MySQL服务名称不是 mysqld,则使用适当的名称。例如,在Debian-based和SLES系统上使用 mysql 而不是 mysqld

systemd支持包括以下文件:

  • mysqld.service(RPM平台),mysql.service(Debian平台):systemd服务单元配置文件,包含MySQL服务的详细信息。

  • mysqld@.service(RPM平台),mysql@.service(Debian平台):类似于 mysqld.servicemysql.service,但用于管理多个MySQL实例。

  • mysqld.tmpfiles.d:包含tmpfiles功能支持信息的文件。该文件安装在 mysql.conf 名称下。

  • mysqld_pre_systemd (RPM 平台),mysql-system-start (Debian 平台):支持单元文件的脚本。此脚本仅在错误日志文件的位置匹配模式时创建错误日志文件 (/var/log/mysql*.log for RPM 平台,/var/log/mysql/*.log for Debian 平台)。在其他情况下,错误日志目录必须可写或错误日志必须存在并且对运行 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 参数。

有关使用 systemd 而不是 mysqld_safe 的更多信息,请参阅 从 mysqld_safe 迁移到 systemd

您可以在 override.conf 中设置以下参数:

  • 要设置 MySQL 服务器可用的文件描述符数量,请使用 LimitNOFILEoverride.conf 中,而不是使用 open_files_limit 系统变量或 --open-files-limit 选项。

  • 要设置核心文件的最大大小,请使用 LimitCoreoverride.conf 中,而不是使用 --core-file-size 选项。

  • 要设置 MySQL 服务器的调度优先级,请使用 Niceoverride.conf 中,而不是使用 --nice 选项。

某些 MySQL 参数是使用环境变量配置的:

  • LD_PRELOAD:如果 MySQL 服务器应该使用特定的内存分配库,请设置此变量。

  • NOTIFY_SOCKET:该环境变量指定了 mysqld 用于与 systemd 通信的套接字,以通知启动完成和服务状态更改。它是由 systemd 设置的,当 mysqld 服务启动时。该 mysqld 服务读取变量设置并写入定义的位置。

    在 MySQL 8.3 中,mysqld 使用 Type=notify 进程启动类型。(在 MySQL 5.7 中使用 Type=forking。)使用 Type=notify,systemd 自动配置套接字文件并将路径导出到 NOTIFY_SOCKET 环境变量中。

  • TZ:设置该变量以指定服务器的默认时区。

有多种方式可以指定环境变量值供 MySQL 服务器进程使用,managed by systemd:

  • 使用 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

要指定 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

使用 systemd 配置多个 MySQL 实例

本节描述如何使用 systemd 配置多个 MySQL 实例。

Note

由于 systemd 具有管理多个 MySQL 实例的能力,因此 mysqld_multimysqld_multi.server 不是必需的,不会被安装。

要使用多实例功能,修改 my.cnf 选项文件,以配置每个实例的关键选项。这些文件位置通常是:

  • /etc/my.cnf/etc/mysql/my.cnf(RPM 平台)

  • /etc/mysql/mysql.conf.d/mysqld.cnf(Debian 平台)

例如,要管理两个实例名为 replica01replica02,可以在选项文件中添加以下内容:

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] 选项组被读取并用于该服务实例。

Note

在 Debian 平台上,AppArmor 防止服务器读取或写入 /var/lib/mysql-replica*,或者除了默认位置以外的任何其他位置。为解决此问题,您必须自定义或禁用 /etc/apparmor.d/usr.sbin.mysqld 中的配置文件。

Note

在 Debian 平台上,MySQL 卸载包脚本当前无法处理 mysqld@ 实例。在删除或升级包之前,您必须手动停止任何额外的实例。

从 mysqld_safe 迁移到 systemd

因为 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 日志记录是 --syslog,该选项已弃用。要将错误日志输出写入系统日志,请按照 第 7.4.2.8 节“错误日志记录到系统日志” 中的说明进行操作。

  • mysqld_safe 选项不被 mysqld 所理解,可以在 override.conf 或环境变量中指定。例如,使用 mysqld_safe,如果服务器应该使用特定的内存分配库,这可以使用 --malloc-lib 选项指定。对于使用 systemd 管理服务器的安装,可以按照之前的描述设置 LD_PRELOAD 环境变量。