使用systemd管理MySQL服务器

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

1、RPM 包平台

  • 企业Linux版本7及更高版本

  • SUSELinuxEnterprise Server 12及更高版本

  • Fedora 29及更高版本

2、Debian家族平台

  • Debian平台

  • Ubuntu平台

如果您是从使用systemd的平台上的通用二进制版本安装的MySQL,您可以按照后手动配置systemd支持MySQL。

如果您是从使用systemd的平台上的源码分发版本安装的MySQL,请通过使用-DWITH_SYSTEMD=1 CMake选项配置分布来获得systemd对MySQL的支持。

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

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

因为systemd能够在安装了systemd支持MySQL的平台上管理多个MySQL实例,所以不需要mysqld_multi和mysqld_multi. server,也不会安装。

systemd概述

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

bash 复制代码
$> systemctl {start|stop|restart|status} mysqld

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

bash 复制代码
$> service mysqld {start|stop|restart|status}

对于systemctl命令(以及替代服务命令),如果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对于每1k展现的收入平台,/var/log/mysql/*.log对于Debian平台)。在其他情况下,错误日志文件目录必须是可写的,或者错误日志必须存在并且对于运行mysqld进程的用户是可写的。

为MySQL配置systemd

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

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

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

  • 设置MYSQLD_OPTSsystemd变量。

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

bash 复制代码
[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支持以下命令,该命令将打开一个编辑器并允许您编辑该文件:

bash 复制代码
systemctl edit mysqld  # RPM platforms
systemctl edit mysql   # Debian platforms

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

bash 复制代码
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选项文件来获取它们。

  • 必须使用systemd指定指定值(否则只能使用mysqld_safe已知的选项设置)的参数,因为没有相应的mysqld参数。

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

  • 要设置MySQL服务器可用的文件描述符数量,请在override.conf中使用LimitNOFILE,而不是mysqld的open_files_limit系统变量或--open-files-limit选项用于mysqld_safe。
  • 要设置最大核心文件大小,请使用override.conf中的LimitCore,而不是mysqld_safe的--core-file-size选项。
  • 要设置MySQL服务器的调度优先级,请使用override.conf中的Nice,而不是mysqld_safe的--nice选项。

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

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

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

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

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

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

  • override.conf文件中使用Environment行。有关语法,请参阅前面讨论中描述如何使用此文件的示例。

  • 指定/etc/sysconfig/mysql文件中的值(如果文件不存在,则创建该文件)。使用以下语法赋值:

    bash 复制代码
    LD_PRELOAD=/path/to/malloc/library
    TZ=time_zone_setting

    修改/etc/sysconfig/mysql后,重新启动服务器以使更改生效:

    bash 复制代码
    systemctl restart mysqld  # RPM platforms
    systemctl restart mysql   # Debian platforms

要指定mysqld的选项而不直接修改systemd配置文件,请设置或取消设置MYSQLD_OPTSsystemd变量。例如:

bash 复制代码
systemctl set-environment MYSQLD_OPTS="--general_log=1"
systemctl unset-environment MYSQLD_OPTS

MYSQLD_OPTS也可以在/etc/sysconfig/mysql文件中进行设置。

修改systemd环境后,重新启动服务器以使更改生效:

bash 复制代码
systemctl restart mysqld  # RPM platforms
systemctl restart mysql   # Debian platforms

对于使用systemd的平台,如果数据目录在服务器启动时为空,则数据目录将被初始化。如果数据目录是暂时消失的远程挂载,这可能是一个问题:挂载点似乎是一个空数据目录,然后将其初始化为一个新的数据目录。要抑制这种自动初始化行为,请在/etc/sysconfig/mysql文件中指定以下行(如果文件不存在,则创建该文件):

bash 复制代码
NO_INIT=true
使用systemd配置多个MySQL实例

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

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

RPM平台:

bash 复制代码
[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平台:
bash 复制代码
[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命令管理实例,例如:

bash 复制代码
systemctl start mysqld@replica01
systemctl start mysqld@replica02

要使实例在启动时运行,请执行以下操作:

bash 复制代码
systemctl enable mysqld@replica01
systemctl enable mysqld@replica02

还支持使用通配符。例如,此命令显示所有副本实例的状态:

bash 复制代码
systemctl status 'mysqld@replica*'

为了管理同一台机器上的多个MySQL实例,systemd自动使用不同的单元文件:

  • mysqld@.service而不是mysqld.service(RPM

  • mysql@.service而不是mysql.service(Debian平台)

在单元文件中,%I%i引用@标记后传入的参数,用于管理特定实例。

bash 复制代码
systemctl start mysqld@replica01

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

bash 复制代码
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]选项组中)必须以另一种方式指定:

1、一些mysqld_safe选项也可以被mysqld理解,并且可以从[mysqld_safe]或[safe_mysqld]选项组移动到[mysqld]组。这不包括--pid-file、--open-files-limit或--nice。要指定这些选项,请使用前面描述的override.confsystemd文件。在systemd平台上,不支持使用[mysqld_safe][safe_mysqld]选项组,这可能会导致意外行为。

2、对于某些mysqld_safe选项,有替代的mysqld过程。例如,启用syslog日志记录的mysqld_safe选项是--syslog,已弃用。

3、mysqld_safe可以在override.conf或环境变量中指定mysqld无法理解的选项。例如,对于mysqld_safe,如果服务器应该使用特定的记忆分配库,则使用--malloc-lib选项指定。对于使用systemd管理服务器的安装,请安排设置LD_PRELOAD环境变量,如前所述。

相关推荐
勤奋的凯尔森同学13 分钟前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
月光水岸New39 分钟前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山67540 分钟前
数据库基础1
数据库
我爱松子鱼43 分钟前
mysql之规则优化器RBO
数据库·mysql
丁卯4041 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
chengooooooo1 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser2 小时前
【SQL】多表查询案例
数据库·sql
Galeoto2 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231113 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql