优秀的编程知识分享平台

网站首页 > 技术文章 正文

如何在 CentOS7 下改造MySQL开机启动服务?

nanyue 2024-10-20 07:49:10 技术文章 6 ℃

背景

CentOS7 下的 service 命令都被重定向到 systemctl 了,PerconaMySQL 安装完成后,会自动添加开机启动服务,它的服务脚本文件为 mysql.service,如果需要对该服务脚本进行改造,添加 numa 控制,该怎么办呢?本文来探讨这个问题。

问题

搜索 MySQL 开机启动服务文件,得到结果如下:

find / -name mysql.service
/etc/systemd/system/mysql.service

我希望修改该文件,于是进入目录,准备下载到本机,但是每次都下载失败,仔细观察发现它的文件名称前面有一个回形针图标,说明它是一个软链接。

分析

事实上,mysql.service 它真正的文件路径为 /usr/lib/systemd/system/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
Alias=mysql.service

[Service]
User=mysql
Group=mysql

Type=forking

PIDFile=/var/run/mysqld/mysqld.pid

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

# Execute pre and post scripts as root
PermissionsStartOnly=true

# Needed to create system tables
ExecStartPre=/usr/bin/mysqld_pre_systemd

# Start main service
ExecStart=/usr/bin/numactl --cpubind=0 --membind=0 /usr/sbin/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 = 5000

Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=false

这是 systemd 统一的 service 配置,install 标签的 Alias=mysql.service 说明了我们常用的 service mysql 就是这个服务,它真正的服务名称是mysqld,这就可以解释为什么有些MySQL的服务名称为 mysqld 了。

第一步, 编辑 /etc/systemd/system/mysql.service,修改 ExecStart 配置,添加内核绑定逻辑:

ExecStart=/usr/bin/numactl --cpubind=0 --membind=0 /usr/sbin/mysqld
–daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS

由于这里是配置,而不是直接执行的命令,所以命令名称都需要全路经,不能直接用 numactl 命令,否则会报错导致启动失败。

这个链接文件修改之后,它真正的文件mysqld.service也自动修改了。

其次, 修改开机启动服务文件后,需要执行reload命令,才能生效。

systemctl daemon-reload
service mysql restart

启示录

顺便看了一下 systemd 的知识,它的目录为 /usr/lib/systemd/system,其下有大量以 service 为后缀的文件,就是所有的开机启动服务文件。内容都有相同的模版,大概就明白了mysql 的开机启动服务是怎么回事儿了。

最近发表
标签列表