錯誤信息
ERROR 1053 (HY000): Server shutdown in progress
根因分析
- MySQL 服務正在關閉/重啟:維護窗口、OOM Killer、系統更新、手動重啟
- 客戶端連接池持有失效連接:服務端已重啟,連接池未感知
- 長事務/大查詢阻塞關閉流程:
innodb_fast_shutdown=0 等待提交/回滾
- 資源耗盡導致進程被殺:OOM、磁盤滿、文件描述符耗盡
快速排查步驟
1. 確認服務狀態
systemctl status mysqld
# 或
service mysql status
# 輸出應為 active (running)
2. 查看錯誤日誌
tail -100 /var/log/mysql/error.log
# 關鍵字:Shutdown, InnoDB: Starting shutdown, Received signal, Out of memory
3. 檢查系統日誌
journalctl -u mysqld -n 50 --no-pager
dmesg -T | grep -i -e mysql -e oom -e kill
4. 確認端口監聽
ss -ltnp | grep 3306
netstat -ltnp | grep 3306
分場景解決方案
場景 A:虛擬主機/共享主機
- 無法控制服務端,立即提交工單 聯系服務商
- 檢查是否有定時備份/維護窗口導致定時重啟
場景 B:自建/雲服務器(有 root 權限)
- 重啟服務:
systemctl restart mysqld
- 若頻發,檢查
/etc/my.cnf:innodb_fast_shutdown = 1(默認,快速關閉)
- 監控內存:
free -h、ps aux --sort=-%mem | head
- 設置監控告警:Prometheus + node_exporter + mysqld_exporter
場景 C:應用層連接池問題
# HikariCP (Java) 配置示例
spring.datasource.hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 300000 # 5 分鐘空閒回收
max-lifetime: 1200000 # 20 分鐘強制換新
connection-test-query: SELECT 1
validation-timeout: 5000
# PHP PDO 長連接注意
$pdo = new PDO(..., [PDO::ATTR_PERSISTENT => true]);
// 必須配合 mysqlnd 的 mysqli.reconnect 或定期 ping
預防措施
| 措施 | 配置/動作 |
| 優雅關閉 | innodb_fast_shutdown=1(默認),避免 0 模式全量刷盤 |
| 防 OOM | vm.overcommit_memory=1、配置 Swap、限制 innodb_buffer_pool_size ≤ 物理內存 70% |
| 連接池驗證 | 空閒檢查、最大生命周期、驗證查詢 |
| 健康檢查 | k8s livenessProbe: mysqladmin ping;應用啟動檢查 |
| 備份窗口錯峰 | 避開業務高峰,避免備份鎖表導致假性 shutdown |
應急恢復腳本
#!/bin/bash
# auto_restart_mysql.sh - 放入 cron 每分鐘檢查
if ! mysqladmin ping --silent; then
echo "$(date) MySQL down, restarting..." | tee -a /var/log/mysql_auto_restart.log
systemctl restart mysqld
sleep 10
if mysqladmin ping --silent; then
echo "$(date) Restart OK" | tee -a /var/log/mysql_auto_restart.log
else
echo "$(date) Restart FAILED, ALERT!" | tee -a /var/log/mysql_auto_restart.log
# 發送告警:郵件/鉤子/短信
fi
fi