native支持systemd是MySQL 5.7的新特性之一,我们之前在《MySQL 5.7.17 Group Replication部署实践》中编译安装MySQL时并没有开启这个特性。 本篇记录一下编译安装MySQL5.7并开启systemd的一些注意事项。

MySQL 5.7编译的选项可以参考MySQL Source-Configuration Options

1
2
3
4
5
6
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/var/lib/mysql \
-DSYSCONFDIR=/etc \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=<boost_source_dir> \
-DWITH_SYSTEMD=1
  • 通过编译选项-DWITH_SYSTEMD=1开启了systemd

MySQL Source-Configuration Options中描述了SYSTEMD_PID_DIR选项的默认值为/var/run/mysqld

而/var/run(即/run)是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的内容会被清楚。 因此我们编译安装的开启了systemd的MySQL,除了提供systemd的Unit文件外,还需要提供/usr/lib/tmpfiles.d中的mysql.conf的配置文件。

/usr/lib/tmpfiles.d/mysql.conf:

1
d /var/run/mysqld 0755 mysql mysql  -

/etc/systemd/system/mysqld.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[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/local/mysql/bin/mysqld_pre_systemd

# 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 = 5000

Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=false

参考