MySQL 8.0 systemd 服務配置指南
服務創(chuàng)建概述
systemd 是現(xiàn)代 Linux 系統(tǒng)的初始化系統(tǒng)和服務管理器,用于控制服務的啟動、停止和管理。為 MySQL 創(chuàng)建 systemd 服務可以實現(xiàn):
? 自動啟動和停止
? 服務狀態(tài)監(jiān)控
? 開機自啟
? 日志統(tǒng)一管理
? 資源限制控制
服務配置文件詳解
創(chuàng)建 /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 # 環(huán)境變量 Environment="MYSQLD_OPTS=--defaults-file=/data1/mysql/my.cnf" EnvironmentFile=-/etc/sysconfig/mysql # 可執(zhí)行文件路徑 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 創(chuàng)建必要的輔助腳本
ExecStartPre 腳本? /data1/mysql/bin/mysqld_pre_systemd:
#!/bin/bash
# MySQL systemd 服務預啟動腳本
set -e
# 檢查目錄權限
if [ ! -d "/data1/mysql/data" ]; then
echo "創(chuàng)建數(shù)據(jù)目錄..."
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 數(shù)據(jù)目錄為空,如需初始化請執(zhí)行:"
echo "sudo -u mysql /data1/mysql/bin/mysqld --defaults-file=/data1/mysql/my.cnf --initialize-insecure"
fi
exit 0
設置執(zhí)行權限:
chmod +x /data1/mysql/bin/mysqld_pre_systemd chown mysql:mysql /data1/mysql/bin/mysqld_pre_systemd
3.2 創(chuàng)建環(huán)境配置文件
可選配置? /etc/sysconfig/mysql:
# MySQL 系統(tǒng)環(huán)境配置 # 可以通過此文件設置額外的 mysqld 參數(shù) # 字符集設置 export LANG=en_US.UTF-8 # 性能優(yōu)化參數(shù) # MYSQLD_OPTS="$MYSQLD_OPTS --innodb_buffer_pool_size=2G" # 調(diào)試參數(shù) # MYSQLD_OPTS="$MYSQLD_OPTS --log-error-verbosity=3"
3.3 目錄結構與權限設置
# 創(chuàng)建必要的目錄 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 # 查看服務狀態(tài) 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 高級狀態(tài)檢查
# 檢查服務是否活躍 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 和內(nèi)存限制 CPUQuota=200% MemoryLimit=4G MemorySwapMax=2G # I/O 限制 IOWeight=default CPUShares=1024 # 進程限制 TasksMax=infinity
5.2 多實例配置
如果有多個 MySQL 實例,可以創(chuàng)建模板服務:
創(chuàng)建模板文件? /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 自定義啟動腳本
創(chuàng)建啟動腳本? /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
# 執(zhí)行 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 最小權限原則
# 創(chuàng)建專用用戶和組 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 狀態(tài) sudo sestatus # 設置 MySQL 目錄上下文 sudo semanage fcontext -a -t mysqld_db_t "/data1/mysql(/.*)?" sudo restorecon -Rv /data1/mysql # 創(chuàng)建自定義 SELinux 模塊(如果需要) AppArmor 配置(Ubuntu/Debian): bash 復制 # 創(chuàng)建 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 監(jiān)控和告警
創(chuàng)建監(jiān)控腳本? /usr/local/bin/mysql-monitor.sh:
#!/bin/bash
# MySQL 服務監(jiān)控腳本
SERVICE="mysql"
MAX_RESTARTS=3
RESTART_COUNT_FILE="/var/run/mysql-restart-count"
# 檢查服務狀態(tài)
if ! systemctl is-active --quiet $SERVICE; then
echo "$(date): MySQL 服務停止,嘗試重啟..." >> /var/log/mysql-monitor.log
# 記錄重啟次數(shù)
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 重啟次數(shù)超過 $MAX_RESTARTS 次" >> /var/log/mysql-monitor.log
# 發(fā)送告警
# mail -s "MySQL 服務異常" admin@example.com
fi
else
# 重置重啟計數(shù)
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
?? 快速部署腳本
創(chuàng)建一鍵部署腳本 /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. 創(chuàng)建 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 "? 服務文件創(chuàng)建完成"
# 3. 重載 systemd
systemctl daemon-reload
echo "? systemd 配置重載完成"
# 4. 啟用服務
systemctl enable mysql
echo "? MySQL 服務已啟用開機自啟"
# 5. 啟動服務
if systemctl start mysql; then
echo "? MySQL 服務啟動成功"
echo "服務狀態(tài):"
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 # 查看狀態(tài)"
echo " sudo systemctl stop mysql # 停止服務"
echo " sudo systemctl restart mysql # 重啟服務"
echo " sudo journalctl -u mysql -f # 查看日志"
賦予執(zhí)行權限并運行:
chmod +x /tmp/deploy-mysql-service.sh sudo /tmp/deploy-mysql-service.sh
通過以上配置,您可以獲得一個穩(wěn)定、安全且易于管理的 MySQL 服務。systemd 提供了豐富的監(jiān)控和管理功能,配合適當?shù)臋嘞藓桶踩渲茫梢源_保 MySQL 數(shù)據(jù)庫在 Linux 系統(tǒng)上穩(wěn)定運行。
到此這篇關于MySQL 8.0 systemd 服務配置指南的文章就介紹到這了,更多相關MySQL systemd 服務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- mysql服務性能優(yōu)化—my.cnf_my.ini配置說明詳解(16G內(nèi)存)
- mysql 主從服務器的簡單配置
- MySQL數(shù)據(jù)庫服務器端核心參數(shù)詳解和推薦配置
- 簡單實現(xiàn)MySQL服務器的優(yōu)化配置方法
- win2003服務器下配置 MySQL 群集(Cluster)的方法
- MySQL數(shù)據(jù)庫優(yōu)化經(jīng)驗詳談(服務器普通配置)
- 使用mysqld_multi實現(xiàn)單系統(tǒng)中配置多個MySQL服務器實例
- MySQL配置主從服務器(一主多從)
- mysql主從服務器配置特殊問題
- Mysql服務器的安裝配置與啟動關閉方法詳解
相關文章
Ubuntu中遠程連接Mysql數(shù)據(jù)庫的詳細圖文教程
Ubuntu是一個以桌面應用為主的Linux發(fā)行版操作系統(tǒng),這篇文章主要為大家詳細介紹了Ubuntu中遠程連接Mysql數(shù)據(jù)庫的詳細圖文教程,有需要的小伙伴可以參考下2025-04-04
MySql?InnoDB存儲引擎之Buffer?Pool運行原理講解
緩沖池是用于存儲InnoDB表,索引和其他輔助緩沖區(qū)的緩存數(shù)據(jù)的內(nèi)存區(qū)域。緩沖池的大小對于系統(tǒng)性能很重要。更大的緩沖池可以減少磁盤I/O來多次訪問同一表數(shù)據(jù)。在專用數(shù)據(jù)庫服務器上,可以將緩沖池大小設置為計算機物理內(nèi)存大小的百分之802023-01-01
Win10安裝mysql8.0.15 winx64及連接服務器過程中遇到的問題
這篇文章主要介紹了Win10安裝mysql8.0.15 winx64及連接服務器過程中遇到的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
MySQL使用binlog日志恢復數(shù)據(jù)的方法步驟
binlog日志是用于記錄所有修改數(shù)據(jù)庫內(nèi)容的操作,本文主要介紹了MySQL使用binlog日志恢復數(shù)據(jù)的方法步驟,具有一定的參考價值,感興趣的可以了解一下2025-03-03

