MySQL 8.0 systemd 服务配置指南
- 服务创建概述
systemd 是现代 Linux 系统的初始化系统和服务管理器,用于控制服务的启动、停止和管理。为 MySQL 创建 systemd 服务可以实现:
✅ 自动启动和停止
✅ 服务状态监控
✅ 开机自启
✅ 日志统一管理
✅ 资源限制控制
- 服务配置文件详解
创建 /etc/systemd/system/mysql.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
RequiresMountsFor=/data1/mysql/data
[Install]
WantedBy=multi-user.target
[Service]
# 服务基本信息
Type=notify
User=mysql
Group=mysql
# 环境变量
Environment="MYSQLD_OPTS=--defaults-file=/data1/mysql/my.cnf"
EnvironmentFile=-/etc/sysconfig/mysql
# 可执行文件路径
ExecStart=/data1/mysql/bin/mysqld $MYSQLD_OPTS
ExecStartPre=/data1/mysql/bin/mysqld_pre_systemd
ExecStop=/data1/mysql/bin/mysqladmin shutdown
# PID 管理
PIDFile=/data1/mysql/data/mysql.pid
# 资源限制
LimitNOFILE=65535
LimitNPROC=65535
LimitCORE=infinity
TimeoutSec=300
# 重启策略
Restart=on-failure
RestartPreventExitStatus=1
RestartSec=5
StartLimitBurst=3
StartLimitIntervalSec=60
# 安全设置
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict
ReadWritePaths=/data1/mysql/data /var/log/mysql
ReadOnlyPaths=/etc
InaccessiblePaths=/boot /root
# 日志配置
StandardOutput=journal
StandardError=journal
SyslogIdentifier=mysql
- 安装与配置步骤
3.1 创建必要的辅助脚本
ExecStartPre 脚本 /data1/mysql/bin/mysqld_pre_systemd:
#!/bin/bash
# MySQL systemd 服务预启动脚本
set -e
# 检查目录权限
if [ ! -d "/data1/mysql/data" ]; then
echo "创建数据目录..."
mkdir -p /data1/mysql/data
chown -R mysql:mysql /data1/mysql
fi
# 检查配置文件
if [ ! -f "/data1/mysql/my.cnf" ]; then
echo "错误: MySQL 配置文件不存在: /data1/mysql/my.cnf"
exit 1
fi
# 检查 socket 文件权限
if [ -S "/tmp/mysql.sock" ]; then
echo "清理旧的 socket 文件..."
rm -f /tmp/mysql.sock
fi
# 检查是否已初始化
if [ ! -f "/data1/mysql/data/mysql/user.frm" ] && \
[ ! -f "/data1/mysql/data/mysql.ibd" ]; then
echo "警告: MySQL 数据目录为空,如需初始化请执行:"
echo "sudo -u mysql /data1/mysql/bin/mysqld --defaults-file=/data1/mysql/my.cnf --initialize-insecure"
fi
exit 0
设置执行权限:
chmod +x /data1/mysql/bin/mysqld_pre_systemd
chown mysql:mysql /data1/mysql/bin/mysqld_pre_systemd
3.2 创建环境配置文件
可选配置 /etc/sysconfig/mysql:
# MySQL 系统环境配置
# 可以通过此文件设置额外的 mysqld 参数
# 字符集设置
export LANG=en_US.UTF-8
# 性能优化参数
# MYSQLD_OPTS="$MYSQLD_OPTS --innodb_buffer_pool_size=2G"
# 调试参数
# MYSQLD_OPTS="$MYSQLD_OPTS --log-error-verbosity=3"
3.3 目录结构与权限设置
# 创建必要的目录
sudo mkdir -p /var/log/mysql
sudo mkdir -p /var/run/mysql
# 设置正确的权限
sudo chown -R mysql:mysql /data1/mysql
sudo chown -R mysql:mysql /var/log/mysql
sudo chown -R mysql:mysql /var/run/mysql
# 设置目录权限
sudo chmod 750 /data1/mysql/data
sudo chmod 755 /data1/mysql/bin
- 服务管理命令
4.1 基本服务操作
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启用开机自启
sudo systemctl enable mysql
# 启动 MySQL 服务
sudo systemctl start mysql
# 查看服务状态
sudo systemctl status mysql
# 停止服务
sudo systemctl stop mysql
# 重启服务
sudo systemctl restart mysql
# 重新加载配置(不重启)
sudo systemctl reload mysql
# 查看服务日志
sudo journalctl -u mysql
sudo journalctl -u mysql -f # 实时跟踪日志
4.2 高级状态检查
# 检查服务是否活跃
sudo systemctl is-active mysql
# 检查是否启用开机自启
sudo systemctl is-enabled mysql
# 检查服务启动失败详情
sudo systemctl status mysql -l
# 查看完整的服务信息
sudo systemctl show mysql
4.3 日志管理命令
# 查看最近 100 行日志
sudo journalctl -u mysql -n 100
# 查看特定时间段的日志
sudo journalctl -u mysql --since "2026-02-10 10:00:00" --until "2026-02-10 12:00:00"
# 查看错误级别的日志
sudo journalctl -u mysql -p err
# 导出日志到文件
sudo journalctl -u mysql --since today > /tmp/mysql-today.log
- 高级配置选项
5.1 资源限制配置
在服务文件的 [Service]部分添加资源限制:
# CPU 和内存限制
CPUQuota=200%
MemoryLimit=4G
MemorySwapMax=2G
# I/O 限制
IOWeight=default
CPUShares=1024
# 进程限制
TasksMax=infinity
5.2 多实例配置
如果有多个 MySQL 实例,可以创建模板服务:
创建模板文件 /etc/systemd/system/mysql@.service:
[Unit]
Description=MySQL Server Instance %i
After=network.target
[Service]
Type=notify
User=mysql
Group=mysql
ExecStart=/data1/mysql/bin/mysqld --defaults-file=/data1/mysql/my-%i.cnf
PIDFile=/data1/mysql/data-%i/mysql.pid
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动不同实例:
sudo systemctl start mysql@3306
sudo systemctl start mysql@3307
5.3 自定义启动脚本
创建启动脚本 /usr/local/bin/mysql-wrapper:
#!/bin/bash
# MySQL 启动包装脚本
set -e
CONFIG_FILE="/data1/mysql/my.cnf"
MYSQLD="/data1/mysql/bin/mysqld"
MYSQLADMIN="/data1/mysql/bin/mysqladmin"
# 加载自定义配置
if [ -f "/etc/sysconfig/mysql-extra" ]; then
. /etc/sysconfig/mysql-extra
fi
# 检查配置文件
if [ ! -f "$CONFIG_FILE" ]; then
echo "错误: 配置文件不存在: $CONFIG_FILE" >&2
exit 1
fi
# 执行 MySQL
exec "$MYSQLD" --defaults-file="$CONFIG_FILE" "$@"
- 故障排除
6.1 常见问题解决
问题1:服务启动失败
# 查看详细错误信息
sudo systemctl status mysql
sudo journalctl -xe
# 手动测试启动
sudo -u mysql /data1/mysql/bin/mysqld --defaults-file=/data1/mysql/my.cnf --console
问题2:权限错误
# 检查文件所有权
sudo ls -la /data1/mysql/
# 修复权限
sudo chown -R mysql:mysql /data1/mysql
sudo chmod 750 /data1/mysql/data
问题3:端口冲突
# 检查端口占用
sudo netstat -tlnp | grep 3306
sudo ss -tlnp | grep 3306
# 杀死占用进程
sudo fuser -k 3306/tcp
6.2 诊断命令
# 检查 systemd 配置
sudo systemd-analyze verify /etc/systemd/system/mysql.service
# 检查依赖关系
sudo systemctl list-dependencies mysql
# 检查启动时间
sudo systemd-analyze critical-chain mysql
# 检查服务启动日志
sudo journalctl -u mysql -o cat | head -50
6.3 恢复默认配置
# 停止服务
sudo systemctl stop mysql
# 禁用服务
sudo systemctl disable mysql
# 删除服务文件
sudo rm /etc/systemd/system/mysql.service
# 重新加载 systemd
sudo systemctl daemon-reload
sudo systemctl reset-failed
- 安全最佳实践
7.1 最小权限原则
# 创建专用用户和组
sudo groupadd -r mysql
sudo useradd -r -g mysql -s /bin/false -d /data1/mysql mysql
# 设置目录权限
sudo chmod 750 /data1/mysql
sudo chmod 700 /data1/mysql/data
sudo chmod 600 /data1/mysql/my.cnf
7.2 SELinux/AppArmor 配置
SELinux 策略:
# 检查 SELinux 状态
sudo sestatus
# 设置 MySQL 目录上下文
sudo semanage fcontext -a -t mysqld_db_t "/data1/mysql(/.*)?"
sudo restorecon -Rv /data1/mysql
# 创建自定义 SELinux 模块(如果需要)
AppArmor 配置(Ubuntu/Debian):
bash
复制
# 创建 AppArmor 配置文件
sudo vim /etc/apparmor.d/usr.sbin.mysqld
# 重新加载配置
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
7.3 防火墙配置
# 开放 MySQL 端口
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload
# 或使用 firewalld 服务
sudo firewall-cmd --permanent --add-service=mysql
sudo firewall-cmd --reload
7.4 监控和告警
创建监控脚本 /usr/local/bin/mysql-monitor.sh:
#!/bin/bash
# MySQL 服务监控脚本
SERVICE="mysql"
MAX_RESTARTS=3
RESTART_COUNT_FILE="/var/run/mysql-restart-count"
# 检查服务状态
if ! systemctl is-active --quiet $SERVICE; then
echo "$(date): MySQL 服务停止,尝试重启..." >> /var/log/mysql-monitor.log
# 记录重启次数
if [ -f "$RESTART_COUNT_FILE" ]; then
COUNT=$(cat $RESTART_COUNT_FILE)
else
COUNT=0
fi
if [ $COUNT -lt $MAX_RESTARTS ]; then
systemctl restart $SERVICE
echo $((COUNT + 1)) > $RESTART_COUNT_FILE
else
echo "$(date): 警告: MySQL 重启次数超过 $MAX_RESTARTS 次" >> /var/log/mysql-monitor.log
# 发送告警
# mail -s "MySQL 服务异常" admin@example.com
fi
else
# 重置重启计数
echo 0 > $RESTART_COUNT_FILE
fi
添加到 cron:
# 每分钟检查一次
echo "* * * * * root /usr/local/bin/mysql-monitor.sh" | sudo tee /etc/cron.d/mysql-monitor
📁 配置文件完整示例
最终服务文件 /etc/systemd/system/mysql.service:
[Unit]
Description=MySQL 8.0 Database Server
Documentation=https://dev.mysql.com/doc/refman/8.0/en/
After=network.target
After=syslog.target
Wants=network.target
[Service]
Type=notify
User=mysql
Group=mysql
ExecStart=/data1/mysql/bin/mysqld --defaults-file=/data1/mysql/my.cnf
ExecStartPre=/data1/mysql/bin/mysqld_pre_systemd
ExecStop=/data1/mysql/bin/mysqladmin -u root -p shutdown
LimitNOFILE=65535
Restart=on-failure
RestartPreventExitStatus=1
RestartSec=5
TimeoutSec=300
PrivateTmp=true
[Install]
WantedBy=multi-user.target
🎯 快速部署脚本
创建一键部署脚本 /tmp/deploy-mysql-service.sh:
#!/bin/bash
# MySQL systemd 服务一键部署脚本
set -e
echo "=== MySQL systemd 服务部署开始 ==="
# 1. 检查权限
if [ "$EUID" -ne 0 ]; then
echo "请使用 root 用户运行此脚本"
exit 1
fi
# 2. 创建 systemd 服务文件
cat > /etc/systemd/system/mysql.service << 'EOF'
[Unit]
Description=MySQL Server
After=network.target
[Service]
Type=notify
User=mysql
Group=mysql
ExecStart=/data1/mysql/bin/mysqld --defaults-file=/data1/mysql/my.cnf
PIDFile=/data1/mysql/data/mysql.pid
TimeoutSec=300
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
echo "✅ 服务文件创建完成"
# 3. 重载 systemd
systemctl daemon-reload
echo "✅ systemd 配置重载完成"
# 4. 启用服务
systemctl enable mysql
echo "✅ MySQL 服务已启用开机自启"
# 5. 启动服务
if systemctl start mysql; then
echo "✅ MySQL 服务启动成功"
echo "服务状态:"
systemctl status mysql --no-pager -l
else
echo "❌ MySQL 服务启动失败"
journalctl -u mysql -n 20 --no-pager
exit 1
fi
echo ""
echo "=== 部署完成 ==="
echo "常用命令:"
echo " sudo systemctl status mysql # 查看状态"
echo " sudo systemctl stop mysql # 停止服务"
echo " sudo systemctl restart mysql # 重启服务"
echo " sudo journalctl -u mysql -f # 查看日志"
赋予执行权限并运行:
chmod +x /tmp/deploy-mysql-service.sh
sudo /tmp/deploy-mysql-service.sh
通过以上配置,您可以获得一个稳定、安全且易于管理的 MySQL 服务。systemd 提供了丰富的监控和管理功能,配合适当的权限和安全配置,可以确保 MySQL 数据库在 Linux 系统上稳定运行。
更多推荐




所有评论(0)