使用 systemd 管理 MySQL 服务
前言
systemd 是 Linux 系统推出的初始化(init)系统,MySQL 使用 RPM 或者 Debian 包安装 MySQL 会默认使用 systemd 来管理 MySQL 服务,不需要额外配置,但是二进制安装还需要运维人员手动配置。
1. 安装 MySQL
1.1 下载安装包
从下方链接中,选择需要下载安装包的版本,下载 MySQL 二进制安装包。
1.2 下载自动化脚本
下方是我的 Github 地址,代码可以直接 Copy 下来:
或者直接在服务器上 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 自动化部署脚本,详细的可参考:
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