使用systemd管理MySQL服务器

本文适用Mysql 5.7。
    如果在以下Linux平台上使用RPM或Debian软件包安装MySQL,则服务器的启动和关闭由systemd管理:
RPM 包平台:
企业版Linux 7变体版及更高版本
SUSE Linux 企业版12及更高版本
Fedora 29 及更高版本
Debian包平台:
Debian 8 及更高版本
Ubuntu 16 及更高版本
    在安装了对MySQL的systemd支持的平台上,不需要脚本,例如mysqld_safe和System V初始化脚本。例如,mysqld_safe可以处理服务器的重启,但是systemd提供了相同的功能,并且与其他服务的管理一致,不使用特定方式管理。
    由于systemd能够在安装了MySQL的平台上管理多个MySQL实例,因此mysqld_multi和 mysqld_multi.server不是必须的,也不会安装。

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

systemctl {start|stop|restart|status} mysqld
1
    或者,使用与System V系统兼容的service命令(具有位置颠倒的参数):

service mysqld {start|stop|restart|status}
1
    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平台):单元文件的支持脚本。仅当日志位置与模式匹配(RPM平台和Debian平台的 /var/log/mysql/*.log)时,此脚本才有助于创建错误日志文件。在其他情况下,对于运行mysqld 进程的用户,错误日志目录必须是可写的,或者错误日志必须存在且可写。
1. 通用二进制包安装mysql后配置systemd管理
    如果使用通用二进制包安装mysql之后,需要手动systemd进行管理。

1.1 新增配置文件
    增加一个systemd单元配置文件,该文件详细描述了MySQL服务。文件名为mysqld.service,文件位于 /usr/lib/systemd/system 。

shell> cd /usr/lib/systemd/system
shell> touch mysqld.service
shell> chmod 644 mysqld.service
1
2
3
    将以下内容添加到 mysqld.service 文件:

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

# Have mysqld write its state to the systemd notify socket
Type=forking

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS 

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 10000

Restart=on-failure

RestartPreventExitStatus=1

# Set environment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1

PrivateTmp=false
1
 
    通过 journalctl 命令可以查看systemd的日志文件。查看mysqld相关日志信息,可以使用 journalctl -u mysqld。

1.2 使用systemctl管理
启动

shell> systemctl start mysqld
1
检查mysqld状态

shell> systemctl status mysqld
1
配置开机自启动

shell> systemctl enable mysqld.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service 
to /usr/lib/systemd/system/mysqld.service.
1
2
3
2. 为Mysql配置systemd
    现在使用上面的配置文件,已经可以满足基本的管理需求了。如果想做一些小调整,又不想修改mysqld.service或选项文件,也就是要为MySQL添加或更改systemd选项,可以使用以下方法:

使用本地化的systemd配置文件。
使用systemd为MySQL服务器进程设置环境变量。
设置 MYSQLD_OPTS 系统变量。
2.1 使用本地化的systemd配置文件
    要使用本地化的systemd配置文件,请创建 /etc/systemd/system/mysqld.service.d 目录(如果该目录不存在)。在该目录中,创建一个文件,其中包含 [Service] 列出所需设置的部分。例如:

[Service]
LimitNOFILE=max_open_files
PIDFile=/path/to/pid/file
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
1
2
    每当您创建或更改时 override.conf,请重新加载systemd配置,然后告诉systemd重新启动MySQL服务:

systemctl daemon-reload
systemctl restart mysqld  # RPM platforms
systemctl restart mysql   # Debian platforms
1
2
3
    使用systemd时,override.conf 配置方法必须配置明确的参数,而不是在MySQL配置文件中的[mysqld]或 [mysqld_safe]组中进行设置:

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

明确进程ID文件:
从MySQL 5.7.10开始:使用 override.conf,更改 PIDFile和 ExecStart来命名PID文件路径名。MySQL选项文件中进程ID文件的任何设置都将被忽略。要进行修改 ExecStart,必须先将其清除。例如:
[Service]
PIDFile=/var/run/mysqld/mysqld-custom.pid
ExecStart=
ExecStart=/usr/sbin/mysqld --pid-file=/var/run/mysqld/mysqld-custom.pid  $MYSQLD_OPTS
1
2
3
4
在MySQL 5.7.10之前:在override.conf中使用pid文件,而不是 mysqld或 mysqld_safe中的 --pid-file 选项 。systemd必须知道PID文件的位置,以便它可以重新启动或停止服务器。如果在MySQL选项文件中指定了PID文件值,则该值必须与PIDFile值匹配, 否则MySQL启动可能会失败。
要设置提供给MySQL服务器的文件描述符,使用override.conf中的LimitNOFILE,而不是mysqld的系统变量open_files_limit或mysqld_safe的选项 --open-files-limit。
要设置最大核心文件大小,请使用override.conf中的 LimitCore,而不是mysqld_safe的 --core-file-size 选项。
要设置MySQL服务器的调度优先级,请使用override.conf中的 Nice,而不是mysqld_safe的 --nice选项。
    示例如下:
    原打开文件数限制为32768

mysql>  show variables like 'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 32768 |
+------------------+-------+
1
2
3
4
5
6
    在override.conf文件中修改:

[Service]
LimitNOFILE=65535
1
2
    重启之后,显示为:

mysql>  show variables like 'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 65535 |
+------------------+-------+
 
2.2 使用systemd为MySQL服务器进程设置环境变量
    一些MySQL参数是使用环境变量配置的:

LD_PRELOAD:如果MySQL服务器应使用特定的内存分配库,请设置此变量。
TZ:设置此变量以指定服务器的默认时区。
    有多种方法可以指定环境变量值,以供systemd管理MySQL服务器进程:

在override.conf文件中使用Environment。有关语法,请参阅前面讨论中描述如何使用override.conf的示例。
在/etc/sysconfig/mysql文件中指定值 (如果文件不存在,则创建文件)。使用以下语法分配值:
LD_PRELOAD=/path/to/malloc/library
TZ=time_zone_setting
1
2
    修改之后/etc/sysconfig/mysql,重新启动服务器以使更改生效:

systemctl restart mysqld  # RPM platforms
systemctl restart mysql   # Debian platforms
1
2
    示例:
    查询现在时间为:

mysql> select localtime();
+---------------------+
| localtime()         |
+---------------------+
| 2020-01-08 13:52:40 |
+---------------------+
1
2
3
4
5
6
    在override.conf中进行修改:

[Service]
LimitNOFILE=65535
Environment="TZ=Asia/Tokyo"
1
2
3
    重启之后,查询时间为:

mysql> select localtime();
+---------------------+
| localtime()         |
+---------------------+
| 2020-01-08 14:53:37 |
+---------------------+
 

2.3 设置 MYSQLD_OPTS 系统变量
    要在不直接修改systemd配置文件的情况下为mysqld指定选项,请设置或取消设置 MYSQLD_OPTSsystemd变量。例如:

systemctl set-environment MYSQLD_OPTS="--general_log=1"
systemctl unset-environment MYSQLD_OPTS
1
2
    MYSQLD_OPTS也可以在/etc/sysconfig/mysql文件中设置 。
    修改systemd环境后,重新启动服务器以使更改生效:

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

NO_INIT=true
1
3. 使用systemd配置多个MySQL实例
    要使用多实例功能,请修改 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
1
2
    要使实例在系统boot引导时运行,请执行以下操作:

systemctl enable mysqld@replica01
systemctl enable mysqld@replica02
1
2
    还支持使用通配符。例如,此命令显示所有副本实例的状态:

systemctl status 'mysqld@replica*'
1
    为了在同一台机器上管理多个MySQL实例,systemd自动使用另一个单位文件:

mysqld@.service而不是 mysqld.service(RPM平台)
mysql@.service而不是 mysql.service(Debian平台)
    在单元文件,%I和%I用于引用在@符号之后传入的参数,用于管理特定实例。对于这样的命令:

systemctl start mysqld@replica01
1
    systemd使用以下命令启动服务器:

mysqld --defaults-group-suffix=@%I ...
1
    其结果是,[server], [mysqld],和 [mysqld@replica01]选项组被读取并用于服务的该实例。
    示例:
    (1)在/etc/my.cnf中添加以下内容,并确保相关文件夹存在,系统权限正确:

[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
 
    (2)初始化数据库

# bin/mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql-replica01
# bin/mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql-replica02
1
2
    现在可以登陆试试了。因为初始化时使用 --initialize-insecure 参数,所以无需root密码即可登陆。

# mysql -S /var/lib/mysql-replica02/mysql.sock  
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.23 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> select version();
+-----------+
| version() |
+-----------+
| 5.7.23    |
+-----------+
1 row in set (0.07 sec)
 
    (3)在/usr/lib/systemd/system中复制mysqld.service文件

cp mysqld.service mysqld@.service
1
    (4)在mysqld@.service中添加 --defaults-group-suffix=@%I :

ExecStart=/usr/local/mysql/bin/mysqld --defaults-group-suffix=@%I --daemonize --pid-file=/var/lib/mysql-%I/mysqld.pid $MYSQLD_OPTS
1
    可以同时修改 --pid-file 选项,使PIDFile分别位于各mysql实例的文件夹内。
    (5)重新加载systemd,可以使用systemcd来管理各个实例了:

# systemctl status mysqld* 也可以看所有的

# systemctl status mysqld@replica01
● mysqld@replica01.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld@.service; disabled; vendor preset: disabled)
   Active: active (running) since 四 2020-01-09 10:36:05 CST; 7s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 3286 ExecStart=/usr/local/mysql/bin/mysqld --defaults-group-suffix=@%I --daemonize --pid-file=/var/lib/mysql-%I/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
 Main PID: 3289 (mysqld)
   CGroup: /system.slice/system-mysqld.slice/mysqld@replica01.service
           └─3289 /usr/local/mysql/bin/mysqld --defaults-group-suffix=@replica01 --daemonize --pid-file=/var/lib/mysql-replica01/mysqld.pid

 
4. 从mysqld_safe迁移到systemd
    因为没有安装mysqld_safe,并且使用systemd来管理MySQL的平台,所以以前为mysqld_safe程序指定的选项(例如在 [mysqld_safe]选项组中的选项)必须通过其他方式明确:

有些能被mysqld理解的mysqld_safe选项,可以从[mysqld_safe]选项组移动到[mysqld]组。这类选项不包括 --pid-file, --open-files-limit 和 --nice。要指定这些选项,请使用override.conf,前面所述的systemd文件。
对于某些mysqld_safe选项,有类似的mysqld选项。例如,mysqld_safe中,用于启用日志记录的 --syslog 选项已被弃用。对于mysqld,请改为启用 log_syslog 系统变量。
mysqld无法理解的mysqld_safe选项可以在override.conf或环境变量中指定。例如,对于mysqld_safe,如果服务器应使用特定的内存分配库,则使用 --malloc-lib 选项指定该库 。对于使用systemd,请设置LD_PRELOAD环境变量,如上文所述。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值