使用 systemd 管理 MySQL 服务

文若1年前技术文章1011

前言

systemd 是 Linux 系统推出的初始化(init)系统,MySQL 使用 RPM 或者 Debian 包安装 MySQL 会默认使用 systemd 来管理 MySQL 服务,不需要额外配置,但是二进制安装还需要运维人员手动配置。

1. 安装 MySQL

1.1 下载安装包

从下方链接中,选择需要下载安装包的版本,下载 MySQL 二进制安装包。

https://downloads.mysql.com/archives/community/

1.2 下载自动化脚本

下方是我的 Github 地址,代码可以直接 Copy 下来:

https://github.com/COOH-791/mysql_lib/blob/main/MySQL_install.py

或者直接在服务器上 wget 下载:

wget https://github.com/COOH-791/mysql_lib/blob/main/MySQL_install.py

脚本可以指定:安装路径, 数据路径, 默认端口 三个重要的参数,如果有需要可以自行指定,也可以选择不指定,将会按照脚本的默认路径安装。

[root@172-16-104-57 mysql_opt]# python MySQL_install.py 
usage: MySQL_install.py [-h] [--path PATH] [--port PORT] [--datadir DATADIR]
                       [--basedir BASEDIR]

Random password: HOcZ9ldv$%mh

optional arguments:
 -h, --help            show this help message and exit
 --path PATH, -p PATH  MySQL binary installation package path.
 --port PORT           Install the port specified by MySQL, Default: 3306
 --datadir DATADIR     Data directory. Default to /data
 --basedir BASEDIR     Base directory. Default to /usr/local

-h: 输出 help -path & -p 就是 MySQL 安装包的路径(必须输入) -datadir & -d 就是 MySQL 数据路径 默认:/data -basedir & -b 就是 MySQL 安装路径 默认:/usr/local -port 就是 MySQL 的端口 默认:3306

1.3 安装 MySQL

python MySQL_install.py -p=mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz

使用屏幕上的命令进入 MySQL 修改 root 密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YouPassword';

添加环境变量:

-- 如果安装目录不在 /usr/local/mysql 先建一个软连接 
-- ln -s /安装目录 /usr/local/mysql
export PATH=$PATH:/usr/local/mysql/bin/
echo 'PATH=$PATH:/usr/local/mysql/bin/' >> /etc/profile

这里简单介绍 MySQL_install 自动化部署脚本,详细的可参考:MySQL 自动化部署

2. 配置 systemd

本小节,介绍配置 systemd 的 MySQL 服务。

2.1 配置含义介绍

systemd 配置项主要包含 3 部分,其具体含义如下。

[unit]

  • Description:服务描述。

  • Documentation:服务文档。

  • After:依赖的服务,只有在依赖的服务启动后才能启动当前服务。

[Install]

  • WantedBy:设置依赖关系,multi-user.target 相当于 System V 中的 init 3,既多用户模式。

[Service]

  • User:指定服务运行用户。

  • Group:指定用户的属组。

  • Type:指定服务启动类型。可设置的值有 simple、exec、forking、oneshot、dbus、notify 和 idle,默认为 simple。

    • forking:服务进程在启动过程中会调用 fork() 创建子进程,当服务启动完毕后,父进程会退出,而子进程将作为服务主进程运行,这也是传统 unix 服务的经典作法。建议设置 PIDFile,以便 systemd 识别服务主进程。在 MySQL 5.7 中,只能将 Type 设置为 forking。

    • notify:服务启动成功后,会调用 sd_notify() 通知 systemd。systemd 在收到通知后,会继续启动后续服务。相当于 forking 该方式更加精准,但需要代码层面的支持。MySQL 8.0 版本原生支持 notify 类型。

  • TimeoutSec:超时时长,包括 TimeoutStartSec 和 TimeoutStopSec。

    • TimeoutStartSec:服务启动时间的超时时长。如果服务在指定时间内没有启动成功,systemd 会认为服务启动失败,此时会执行关闭操作。

    • TimeoutStopSec:服务关闭超时时长,当执行 STOP 操作时,systemd 会立刻发出 SIGTERM 信号来关闭服务进程。如果在指定时间内没有关闭成功,则会发出 SIGKILL 信息强行杀死服务进程。如果将 TimeoutSec 设置为 0,则会关闭超时检测。

  • ExecStart:服务的启动命令。mysqld 必须是绝对路径。

  • EnvironmentFile:环境变量文件。可在该文件中配置服务启动时的环境变量。

  • Restart:指在什么情况下需要重启服务进程。可设置为 no、always、on-success、on-failure、on-abormal、on-abort 和 on-watchdog,默认为 on 表示不重启服务。如果设置为 on-failure 则会在以下场景下重启服务:进程意外退出(返回码非 0),接收到终止信号(包括 core dump,不包括 SIGHUP、SIGINT、SIGTERM 和 SIGPIPE 这四种信号),操作超时,配置的 Watchdog 被触发。

  • RestartPreventExitStatus:如果程序的返回码或者接收信号在该参数中定义了,即使满足 Restart 中定义的条件,也不会触发重启。

  • Environment:设置环境变量。这里的 MYSQLD_PARENT_PID 指的是 mysqld 父进程的 PID。在 MySQL 8.0 中,支持通过 restart 命令重启 MySQL 实例。在执行 restart 命令时,该进程会用来启动 mysqld。PID 为 1 的进程是 init 进程。在 MySQL 5.7 中,因为不支持 restart 命令,所以不用设置该参数。

  • PrivateTmp:是否使用私有的 tmp 目录。

2.2 配置 systemd

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

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
Type=notify
TimeoutSec=0
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS
# EnvironmentFile=/etc/sysconfig/mysql
LimitNOFILE=65535
Restart=on-failure
RestartPreventExitStatus=1
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false

reload 配置文件:

systemctl daemon-reload

2.3 管理 MySQL 服务

启动 MySQL:

systemctl start mysqld

关闭 MySQL:

systemctl stop mysqld

重启 MySQL:

systemctl restart mysqld

设置开机自启:

systemctl enable mysqld


相关文章

Clickhouse冷热数据分离实践

配置多卷存储策略使用Clickhouse的存储策略功能,可以实现冷热数据分离存储。我们可以将业务上访问频繁的数据放到热存储区(如高性能SSD磁盘),将业务上较少访问的数据放在冷存储区(如价格更便宜、空...

MySQL优化器特性(一)IN和Exists(semijoin)子查询优化策略

这篇文章中的SQL和执行计划在mysql 8.0.31环境下进行测试。测试的表结构和数据:表结构mysql> show create table tp\G...

压测实操--produce压测方案

压测实操--produce压测方案

环境信息:操作系统centos7.9,kafka版本为hdp集群中的2.0版本。 Producer相关参数使用Kafka自带的kafka-producer-perf-test.sh脚本进行压测,该脚本...

CDH配置HTTPS访问

CDH配置HTTPS访问

申请一台新的机器部署nginx,生成https/ssl证书的机器没有要求1.生成https/ssl证书[root@cdp01 ~]# mkdir -p /data/cert [root@cdp01 ...

Go 错误处理与单元测试

1、错误处理1.1 如何定义错误在 Go 语言中,无论是在类型检查还是编译过程中,都是将错误看做值来对待,和 string 或者 integer 这些类型值并不差别。声明一个 string 类型变量和...

某客户k3s网络故障案例

某客户k3s网络故障案例

1、出现问题     在我们吃饭的过程中,小丫告诉我客户的系统出现问题了,我们赶快吃完饭回去帮忙排查。当我们回去的时候,被告知问题已经被修复了,但是问题根源没有找到。故障原因给出的是:  服务重启后对...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。