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 系统上稳定运行。
到此这篇关于MySQL 8.0 systemd 服务配置指南的文章就介绍到这了,更多相关MySQL systemd 服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
