如果在以下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_multi和 mysqld_multi.server是不必要的,也不会安装。
系统概述
systemd提供自动的MySQL服务器启动和关闭。它还使用systemctl命令启用手动服务器管理 。例如:
systemctl {start|stop|restart|status} mysqld
复制
或者,使用与System V系统兼容的service命令(具有相反的参数):
service mysqld {start|stop|restart|status}
复制
注意
对于systemctl或 service命令,如果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
:包含支持此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服务器的文件描述符,使用次数
LimitNOFILE
的override.conf
,而不是open_files_limit
针对系统变量的mysqld或--open-files-limit
选项mysqld_safe的。 - 要设置最大核心文件大小,请使用
LimitCore
inoverride.conf
而不是mysqld_safe的--core-file-size
选项。 - 要设置MySQL服务器的调度优先级,请使用
Nice
inoverride.conf
而不是mysqld_safe的--nice
选项 。
一些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服务器进程使用:
-
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实例
本节介绍如何为MySQL的多个实例配置systemd。
注意
由于systemd能够在安装了systemd支持的平台上管理多个MySQL实例,因此 mysqld_multi和 mysqld_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_multi和 mysqld_multi.server是不必要的,也不会安装。
系统概述
systemd提供自动的MySQL服务器启动和关闭。它还使用systemctl命令启用手动服务器管理 。例如:
systemctl {start|stop|restart|status} mysqld
复制
或者,使用与System V系统兼容的service命令(具有相反的参数):
service mysqld {start|stop|restart|status}
复制
注意
对于systemctl或 service命令,如果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
:包含支持此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服务器的文件描述符,使用次数
LimitNOFILE
的override.conf
,而不是open_files_limit
针对系统变量的mysqld或--open-files-limit
选项mysqld_safe的。 - 要设置最大核心文件大小,请使用
LimitCore
inoverride.conf
而不是mysqld_safe的--core-file-size
选项。 - 要设置MySQL服务器的调度优先级,请使用
Nice
inoverride.conf
而不是mysqld_safe的--nice
选项 。
一些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服务器进程使用:
-
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实例
本节介绍如何为MySQL的多个实例配置systemd。
注意
由于systemd能够在安装了systemd支持的平台上管理多个MySQL实例,因此 mysqld_multi和 mysqld_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
环境变量,如前所述。