Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

2.5.9 使用 systemd 管理 MySQL 服务器

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

  • RPM 包平台:

    • Enterprise Linux variants 版本 7 及更高

    • SUSE Linux Enterprise Server 12 及更高

    • Fedora 29 及更高

  • Debian 家族平台:

    • Debian 平台

    • Ubuntu 平台

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

如果您从源代码分发安装 MySQL,在使用 systemd 的平台上,您可以通过配置 distribution 使用-DWITH_SYSTEMD=1 CMake 选项来获得 systemd 支持 MySQL。请参阅Section 2.8.7, “MySQL 源代码配置选项”

以下讨论将涵盖这些主题:

Note

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

systemd 支持 MySQL 的平台上不使用 mysqld_safe 的一个结果是,不支持使用 [mysqld_safe][safe_mysqld] 部分在选项文件中的使用,这可能会导致未预期的行为。

由于 systemd 可以管理多个 MySQL 实例,在使用 systemd 支持 MySQL 的平台上,mysqld_multimysqld_multi.server 是不必要的且不安装。

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

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

Alternatively, 使用 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 服务详细信息。

  • 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 在 RPM 平台上,/var/log/mysql/*.log 在 Debian 平台上) 时。在其他情况下,错误日志目录必须可写或错误日志文件必须存在且可写,以便 mysqld 进程。

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

  • 使用本地 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系统变量或mysqld--open-files-limit选项。

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

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

一些MySQL参数是通过环境变量配置的:

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

  • NOTIFY_SOCKET:这个环境变量指定了mysqld使用的套接字,以便与systemd通信通知MySQL服务器启动完成和服务状态变化。systemd在启动mysqld服务时设置这个变量。MySQL服务器读取变量设置并将其写入定义的位置。

    MySQL 8.4 中,mysqld 使用Type=notify 过程启动类型。(Type=forking 在 MySQL 5.7 中使用。) 使用Type=notify,systemd 自动配置 socket 文件,并将NOTIFY_SOCKET 环境变量的路径导出。

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

有多种方式可以指定环境变量值,以供 MySQL 服务器进程由 systemd 管理:

  • 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

为了在不修改 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

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

Note

由于 systemd 具有管理多个 MySQL 实例的能力,在支持 systemd 的平台上,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管理MySQL时不安装在平台上,之前为该程序指定的选项(例如,在[mysqld_safe][safe_mysqld]选项组中)必须以其他方式指定:

  • 一些mysqld_safe选项也被mysqld理解,可以将其从[mysqld_safe][safe_mysqld]选项组移动到[mysqld]组。这不包括--pid-file--open-files-limit--nice。要指定这些选项,请使用override.confsystemd文件,之前描述的。

    Note

    在systemd平台上,使用[mysqld_safe][safe_mysqld]选项组不受支持,并可能导致未预期的行为。

  • 对于某些mysqld_safe选项,有些mysqld命令有替代方案。例如,mysqld_safe启用--syslog日志记录的选项已经弃用。要将错误日志输出到系统日志中,请参阅第7.4.2.8节,“Error Logging to the System Log”中的指令。

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