暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

2.5.9使用systemd管理MySQL服务器

原创 由迪 2020-10-20
4569

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

  • RPM软件包平台:
    • 企业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能够在安装了MySQL的systemd支持的平台上管理多个MySQL实例,因此mysqld_multimysqld_multi.server是不必要的,也不会安装。

系统概述

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

systemctl {start|stop|restart|status} mysqld
复制

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

service mysqld {start|stop|restart|status}
复制

注意

对于systemctlservice命令,如果MySQL服务名称不是mysqld,则使用适当的名称。例如,使用mysql而不是 mysqld在基于Debian的系统和SLES系统上使用。

对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 进程的用户,错误日志必须存在且可写。

为MySQL配置systemd

要为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 必须使用某些参数的配置方法,而不是在一个设置[mysqld][mysqld_safe][safe_mysqld]在MySQL选项文件组:

  • 对于某些参数,override.conf必须使用它,因为systemd本身必须知道它们的值,并且它无法读取MySQL选项文件来获取它们。
  • 由于没有对应的mysqld参数,因此必须使用systemd指定 用于指定只能使用mysqld_safe已知的选项设置的值的参数。

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

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

一些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服务器进程使用:

  • Environmentoverride.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_OPTSsystemd变量。例如:

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_multimysqld_multi.server是不必要的,也不会安装。

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

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

例如,要管理名为replica01和的两个实例 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

由于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文件。

    注意

    在系统平台上,不支持使用 [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环境变量,如前所述。如果在以下Linux平台上使用RPM或Debian软件包安装MySQL,则服务器的启动和关闭由systemd管理:

  • RPM软件包平台:

    • 企业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能够在安装了MySQL的systemd支持的平台上管理多个MySQL实例,因此mysqld_multimysqld_multi.server是不必要的,也不会安装。

系统概述

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

systemctl {start|stop|restart|status} mysqld
复制

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

service mysqld {start|stop|restart|status}
复制

注意

对于systemctlservice命令,如果MySQL服务名称不是mysqld,则使用适当的名称。例如,使用mysql而不是 mysqld在基于Debian的系统和SLES系统上使用。

对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 进程的用户,错误日志必须存在且可写。

为MySQL配置systemd

要为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 必须使用某些参数的配置方法,而不是在一个设置[mysqld][mysqld_safe][safe_mysqld]在MySQL选项文件组:

  • 对于某些参数,override.conf必须使用它,因为systemd本身必须知道它们的值,并且它无法读取MySQL选项文件来获取它们。
  • 由于没有对应的mysqld参数,因此必须使用systemd指定 用于指定只能使用mysqld_safe已知的选项设置的值的参数。

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

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

一些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服务器进程使用:

  • Environmentoverride.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_OPTSsystemd变量。例如:

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_multimysqld_multi.server是不必要的,也不会安装。

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

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

例如,要管理名为replica01和的两个实例 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

由于mysqld_safe未安装在使用systemd来管理MySQL的平台上,因此必须以其他方式指定先前为该程序指定的选项(例如,在 [mysqld_safe][safe_mysqld]选项组中):

最后修改时间:2020-10-27 12:47:51
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论