Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL systemd 服务

MySQL 8.0 systemd 服务配置指南

作者:南墙上的石头

本文主要介绍了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 服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文