# 2.5.9 使用 systemd 管理 MySQL 服务器

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

笔记

在安装了对 MySQL 的 systemd 支持的平台上,脚本如mysqld_安全的System V 初始化脚本是不必要的,也没有安装。例如,mysqld_安全的可以处理服务器重新启动,但 systemd 提供了相同的功能,并且以与其他服务的管理一致的方式而不是通过使用特定于应用程序的程序来处理。

不使用的一种含义mysqld_安全的在使用 systemd 进行服务器管理的平台上,使用[mysqld_safe]要么[安全_mysqld]选项文件中的部分不受支持,可能会导致意外行为。

因为 systemd 能够在安装了 systemd 支持 MySQL 的平台上管理多个 MySQL 实例,mysqld_多mysqld_多服务器是不必要的,没有安装。

# systemd 概述

systemd 提供自动 MySQL 服务器启动和关闭。它还可以使用系统控制命令。例如:

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

或者,使用服务命令(参数颠倒),与 System V 系统兼容:

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

笔记

为了系统控制命令(和替代服务命令),如果 MySQL 服务名称不是mysqld然后使用适当的名称。例如,使用mysql而不是mysqld在基于 Debian 和 SLES 的系统上。

对 systemd 的支持包括以下文件:

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

  • mysqld@.service(RPM 平台),mysql@.service(Debian 平台):喜欢mysqld.service要么mysql.service,但用于管理多个 MySQL 实例。

  • mysqld.tmpfiles.d:包含支持信息的文件临时文件特征。此文件安装在名称下mysql.conf.

  • mysqld_pre_systemd(RPM 平台),mysql-系统启动(Debian 平台):单元文件的支持脚本。仅当日志位置与模式匹配时,此脚本才有助于创建错误日志文件 (/var/log/mysql*.log对于 RPM 平台,/var/log/mysql/*.log对于 Debian 平台)。在其他情况下,错误日志目录必须是可写的,或者错误日志必须存在并且对于运行mysqld过程。

# 为 MySQL 配置 systemd

要为 MySQL 添加或更改 systemd 选项,可以使用以下方法:

  • 使用本地化的 systemd 配置文件。

  • 安排 systemd 为 MySQL 服务器进程设置环境变量。

  • 设置MYSQLD_OPTS系统变量。

    要使用本地化的 systemd 配置文件,请创建/etc/systemd/system/mysqld.service.d如果目录不存在。在该目录中,创建一个包含[服务]列出所需设置的部分。例如:

[Service]
LimitNOFILE=max_open_files
Nice=nice_level
LimitCore=core_file_limit
Environment="LD_PRELOAD=/path/to/malloc/library"
Environment="TZ=time_zone_setting"

这里的讨论使用覆盖.conf作为该文件的名称。较新版本的 systemd 支持以下命令,该命令会打开一个编辑器并允许您编辑文件:

systemctl edit mysqld  # RPM platforms
systemctl edit mysql   # Debian platforms

每当您创建或更改覆盖.conf,重新加载systemd配置,然后告诉systemd重启MySQL服务:

systemctl daemon-reload
systemctl restart mysqld  # RPM platforms
systemctl restart mysql   # Debian platforms

使用 systemd,覆盖.conf某些参数必须使用配置方法,而不是在一个[mysqld], [mysqld_safe], 要么[安全_mysqld]MySQL 选项文件中的组:

  • 对于某些参数,覆盖.conf必须使用,因为 systemd 本身必须知道它们的值,并且它无法读取 MySQL 选项文件来获取它们。

  • 指定值的参数,否则只能使用已知的选项设置mysqld_安全的必须使用 systemd 指定,因为没有对应的mysqld范围。

    有关使用 systemd 而不是mysqld_安全的, 看从 mysqld 迁移_对系统安全.

    您可以在中设置以下参数覆盖.conf

  • 要设置 MySQL 服务器可用的文件描述符的数量,请使用限制NOFILE覆盖.conf而不是open_files_limit系统变量mysqld要么--open-files-limit选项mysqld_安全的.

  • 要设置最大核心文件大小,请使用极限核心覆盖.conf而不是--核心文件大小选项mysqld_安全的.

  • 要设置 MySQL 服务器的调度优先级,请使用好的覆盖.conf而不是- 好的选项mysqld_安全的.

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

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

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

    在 MySQL 8.0 中,mysqld使用类型=通知进程启动类型。(类型=分叉在 MySQL 5.7 中使用。)与类型=通知,systemd会自动配置一个socket文件,并将路径导出到NOTIFY_SOCKET环境变量。

  • 太极:设置此变量以指定服务器的默认时区。

    有多种方法可以指定由 systemd 管理的 MySQL 服务器进程使用的环境变量值:

  • 采用环境中的行覆盖.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系统变量。例如:

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 实例

本节介绍如何为 MySQL 的多个实例配置 systemd。

笔记

因为 systemd 能够在安装了 systemd 支持的平台上管理多个 MySQL 实例,mysqld_多mysqld_多服务器是不必要的,没有安装。

要使用多实例功能,请修改我的.cnf选项文件以包含每个实例的关键选项配置。这些文件位置是典型的:

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

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

    例如,要管理两个名为副本01副本02,在选项文件中添加如下内容:

    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 平台)

    在单元文件中,%一世%一世引用后面传入的参数@标记并用于管理特定实例。对于这样的命令:

systemctl start mysqld@replica01

systemd 使用如下命令启动服务器:

mysqld --defaults-group-suffix=@%I ...

结果是[服务器],[mysqld], 和[mysqld@replica01]选项组被读取并用于该服务实例。

笔记

在 Debian 平台上,AppArmor 阻止服务器读取或写入/var/lib/mysql-副本*,或默认位置以外的任何内容。要解决此问题,您必须在/etc/apparmor.d/usr.sbin.mysqld.

笔记

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

# 从 mysqld 迁移_对系统安全

因为mysqld_安全的未安装在使用 systemd 管理 MySQL 的平台上,之前为该程序指定的选项(例如,在[mysqld_safe]要么[安全_mysqld]选项组)必须以另一种方式指定: