使用 systemd 管理 MySQL 服务

文若1年前技术文章708

前言

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


相关文章

Elasticsearch数据规划

1.1 为什么数据规划很重要任何系统都有一套更为适用的规则或者其系统规格,前期的详细设计能为我们后期维护优化节约大量的精力。在我们实际的经验中,发现大部分问题(分片严重超规格,单个分片超大,索引map...

trino组件对接ldap(二)

trino组件对接ldap(二)

1、coordinater设置证书keytool -genkeypair -validity 36500 -ext SAN=IP:172.16.121.0,DNS:hadoop001  -alias ...

MongoDB的碎片化问题

一、碎片化问题1.1 为什么会出现碎片化的问题在生产业务中,一般会对集合数据进行频繁的增删改,常见的碎片化原因有:1、记录被remove,但是其空间没有被复用drop命令会直接删除集合的物理文件,空间...

oracle手工管理的不完全恢复

一)使用当前控制文件做不完全恢复示例1: 恢复过去某个时间点误删除的table(基于时间点的不完全恢复)前提:在这个状态下先在OS下做一个数据文件和控制文件的冷备。SQL> shutdown i...

MySQL 在线开启 GTID

MySQL 在线开启 GTID

描述生产环境上也会遇到需要开启 GTID ,有什么风险?如何在线开启?本篇 SOP 将介绍。GTID 限制由于基于 GTID 复制依赖于事务,所有开启 GTID 时,有些 MySQL 特性不支持:事务...

Hbase Rowkey设计方法

良好的 rowkey 设计,应当遵循以上四大原则,并且能让数据分散,从而避免热点问题。下面是几种常用的 rowkey 设计方法。1 Salt 加盐这里说的 Salt 加盐方法,是给每一个 rowkey...

发表评论    

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