内容简介:MySQL服务器的启动、停止和重启是DBA日常管理的基本操作,正确的操作方法对数据库的稳定性和安全性至关重要。本文风哥教程参考MySQL官方文档MySQL Server Administration部分,详细介绍MySQL服务器的启动、停止和重启方法,以及常见故障的排查和解决。学习交流加群风哥微信: itpux-com
Part01-基础概念与理论知识
1.1 MySQL启动流程概述
MySQL服务器的启动流程包括以下主要阶段:
- 初始化阶段:加载配置文件、初始化系统变量、分配内存空间
- 引擎初始化:初始化存储引擎(如InnoDB、MyISAM等)
- 网络监听:打开监听端口,等待客户端连接
- 就绪状态:服务器进入就绪状态,可以接受客户端连接
1.2 MySQL关闭流程概述
MySQL服务器的关闭流程包括以下主要阶段:
- 停止接受连接:不再接受新的客户端连接
- 处理现有连接:等待当前连接完成或超时
- 刷新缓冲区:将内存中的数据刷新到磁盘
- 关闭存储引擎:关闭所有存储引擎实例
- 释放资源:释放内存和其他系统资源
Part02-生产环境规划与建议
2.1 启动方式规划
生产环境中MySQL的启动方式选择需要考虑:
- 系统服务:使用systemd或initd管理MySQL服务,便于自动化和监控
- 直接启动:手动执行mysqld命令,适用于调试和特殊场景
- 安全启动:使用–defaults-file指定配置文件,避免使用默认配置
2.2 关闭策略规划
生产环境中MySQL的关闭策略需要考虑:
- 优雅关闭:使用mysqladmin shutdown或systemctl stop,等待事务完成
- 强制关闭:仅在紧急情况下使用,可能导致数据损坏
- 维护窗口:在业务低峰期进行关闭操作,减少对业务的影响
2.3 自动化管理规划
生产环境中MySQL的自动化管理需要考虑:
- 开机自启:配置MySQL服务开机自动启动,提高可用性
- 监控告警:监控MySQL服务状态,及时发现启动/停止异常
- 自动化脚本:编写启动/停止/重启脚本,提高管理效率
Part03-生产环境项目实施方案
3.1 启动MySQL服务器
MySQL服务器可以通过多种方式启动。
# systemctl start mysqld
# 查看启动状态
# systemctl status mysqld
● mysqld.service – MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2026-04-02 15:00:00 CST; 1min ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 12345 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 12346 (mysqld)
Status: “Server is operational”
Tasks: 38 (limit: 23456)
Memory: 1.2G
CGroup: /system.slice/mysqld.service
└─12346 /usr/sbin/mysqld
# 2. 使用init.d脚本启动MySQL
# service mysqld start
Starting mysqld (via systemctl): [ OK ]
# 3. 直接使用mysqld命令启动(调试用)
# mysqld –defaults-file=/etc/my.cnf &
[1] 12347
# 4. 使用mysqld_safe启动(带安全守护)
# mysqld_safe –defaults-file=/etc/my.cnf &
[1] 12348
160402 15:05:00 mysqld_safe Logging to ‘/mysql/logs/error.log’.
160402 15:05:00 mysqld_safe Starting mysqld daemon with databases from /mysql/data
3.2 停止MySQL服务器
MySQL服务器可以通过多种方式停止。
# systemctl stop mysqld
# 查看停止状态
# systemctl status mysqld
● mysqld.service – MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Tue 2026-04-02 15:10:00 CST; 1min ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 12346 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
Process: 12345 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 12346 (code=exited, status=0/SUCCESS)
Status: “Server shutdown complete”
# 2. 使用init.d脚本停止MySQL
# service mysqld stop
Stopping mysqld (via systemctl): [ OK ]
# 3. 使用mysqladmin停止MySQL
# mysqladmin -u root -p shutdown
Enter password:
# 4. 强制停止MySQL(不推荐)
# kill -9 $(ps aux | grep mysqld | grep -v grep | awk ‘{print $2}’)
3.3 重启MySQL服务器
MySQL服务器可以通过多种方式重启。
# systemctl restart mysqld
# 查看重启状态
# systemctl status mysqld
● mysqld.service – MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2026-04-02 15:15:00 CST; 1min ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 12349 ExecStop=/usr/sbin/mysqld-admin shutdown (code=exited, status=0/SUCCESS)
Process: 12350 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 12351 (mysqld)
Status: “Server is operational”
Tasks: 38 (limit: 23456)
Memory: 1.2G
CGroup: /system.slice/mysqld.service
└─12351 /usr/sbin/mysqld
# 2. 使用init.d脚本重启MySQL
# service mysqld restart
Restarting mysqld (via systemctl): [ OK ]
# 3. 先停止再启动(手动重启)
# systemctl stop mysqld
# systemctl start mysqld
3.4 检查MySQL状态
检查MySQL服务器的运行状态。
# systemctl status mysqld
● mysqld.service – MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2026-04-02 15:15:00 CST; 5min ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Main PID: 12351 (mysqld)
Status: “Server is operational”
Tasks: 38 (limit: 23456)
Memory: 1.2G
CGroup: /system.slice/mysqld.service
└─12351 /usr/sbin/mysqld
# 2. 使用mysqladmin检查状态
# mysqladmin -u root -p status
Enter password:
Uptime: 300 Threads: 2 Questions: 100 Slow queries: 0 Opens: 150 Flush tables: 1 Open tables: 100 Queries per second avg: 0.333
# 3. 检查MySQL进程
# ps aux | grep mysqld
mysql 12351 0.5 5.0 1234567 204800 ? Sl 15:15 0:02 /usr/sbin/mysqld
# 4. 检查MySQL端口
# netstat -tlnp | grep mysql
tcp6 0 0 :::3306 :::* LISTEN 12351/mysqld
tcp6 0 0 :::33060 :::* LISTEN 12351/mysqld
# 5. 登录MySQL检查
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.4.0 MySQL Community Server – GPL
mysql> SELECT VERSION();
+———–+
| VERSION() |
+———–+
| 8.4.0 |
+———–+
1 row in set (0.00 sec)
Part04-生产案例与实战讲解
4.1 启动故障排查
排查MySQL启动失败的常见问题。
问题描述:修改配置文件后MySQL启动失败
解决方法:检查配置文件语法和参数设置
# systemctl start mysqld
Job for mysqld.service failed because the control process exited with error code. See “systemctl status mysqld.service” and “journalctl -xe” for details.
# 查看详细错误信息
# journalctl -xe | grep mysqld
Apr 02 15:20:00 server1 systemd[1]: Starting MySQL Server…
Apr 02 15:20:00 server1 mysqld_pre_systemd[12352]: Failed to start mysql: Invalid argument
Apr 02 15:20:00 server1 systemd[1]: mysqld.service: Control process exited, code=exited status=1
Apr 02 15:20:00 server1 systemd[1]: Failed to start MySQL Server.
# 查看错误日志
# tail -n 50 /mysql/logs/error.log
2026-04-02T15:20:00.123456Z 0 [ERROR] [MY-010123] [Server] Fatal error in defaults handling. Program aborted
# 检查配置文件语法
# mysqld –defaults-file=/etc/my.cnf –validate-config
2026-04-02T15:21:00.123456Z 0 [ERROR] [MY-000077] [Server] /usr/sbin/mysqld: Error while setting value ’64G’ to ‘innodb_buffer_pool_size’
# 修复配置文件
# vi /etc/my.cnf
innodb_buffer_pool_size = 4G # 原来设置为64G,超过服务器内存
# 重新启动MySQL
# systemctl start mysqld
# 验证启动成功
# systemctl status mysqld
● mysqld.service – MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2026-04-02 15:22:00 CST; 1min ago
4.2 关闭故障排查
排查MySQL关闭失败的常见问题。
问题描述:执行关闭命令后MySQL长时间没有响应
解决方法:查看并终止长时间运行的事务
# systemctl stop mysqld
# 等待5分钟后仍未响应
# 另一个终端查看MySQL进程
# ps aux | grep mysqld
mysql 12351 0.1 5.0 1234567 204800 ? Sl 15:15 0:05 /usr/sbin/mysqld
# 查看错误日志
# tail -n 50 /mysql/logs/error.log
2026-04-02T15:30:00.123456Z 0 [System] [MY-011012] [Server] Received shutdown from user root. Shutting down mysqld (Version: 8.4.0).
2026-04-02T15:30:00.123456Z 0 [System] [MY-014900] [Server] Giving 3600 seconds to transaction(s) to complete
# 查看正在运行的事务
# mysql -u root -p -e “SHOW ENGINE INNODB STATUS\G” | grep -A 10 “TRANSACTIONS”
TRANSACTIONS
————
Trx id counter 12345
Purge done for trx’s n:o < 12340 undo n:o < 0 state: running but idle
History list length 100
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 12344, ACTIVE 1800 sec
2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 10, OS thread handle 1234567890123, query id 500 192.168.1.100 user1
UPDATE fgedu_users SET status = 'active' WHERE id = 1
# 终止长时间运行的事务
# mysql -u root -p -e "KILL 10;"
# 再次检查MySQL状态
# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Tue 2026-04-02 15:35:00 CST; 1min ago
4.3 自动化管理脚本
编写自动化脚本管理MySQL的启动、停止和重启。
# mysql_control.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# MySQL配置信息
MYSQL_USER=”root”
MYSQL_PASS=”password”
MYSQL_SOCKET=”/var/lib/mysql/mysql.sock”
LOG_FILE=”/mysql/logs/mysql_control.log”
# 日志函数
log() {
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – $1” >> $LOG_FILE
}
# 检查MySQL状态
check_status() {
if systemctl status mysqld > /dev/null 2>&1; then
return 0
else
return 1
fi
}
# 启动MySQL
start_mysql() {
log “Starting MySQL…”
if check_status; then
log “MySQL is already running”
echo “MySQL is already running”
return 0
fi
systemctl start mysqld
if [ $? -eq 0 ]; then
log “MySQL started successfully”
echo “MySQL started successfully”
return 0
else
log “Failed to start MySQL”
echo “Failed to start MySQL”
return 1
fi
}
# 停止MySQL
stop_mysql() {
log “Stopping MySQL…”
if ! check_status; then
log “MySQL is already stopped”
echo “MySQL is already stopped”
return 0
fi
systemctl stop mysqld
if [ $? -eq 0 ]; then
log “MySQL stopped successfully”
echo “MySQL stopped successfully”
return 0
else
log “Failed to stop MySQL”
echo “Failed to stop MySQL”
return 1
fi
}
# 重启MySQL
restart_mysql() {
log “Restarting MySQL…”
systemctl restart mysqld
if [ $? -eq 0 ]; then
log “MySQL restarted successfully”
echo “MySQL restarted successfully”
return 0
else
log “Failed to restart MySQL”
echo “Failed to restart MySQL”
return 1
fi
}
# 状态检查
status_mysql() {
if check_status; then
echo “MySQL is running”
mysqladmin -u $MYSQL_USER -p”$MYSQL_PASS” -S $MYSQL_SOCKET status
else
echo “MySQL is not running”
fi
}
# 主函数
case “$1” in
start)
start_mysql
;;
stop)
stop_mysql
;;
restart)
restart_mysql
;;
status)
status_mysql
;;
*)
echo “Usage: $0 {start|stop|restart|status}”
exit 1
;;
esac
# chmod +x /mysql/scripts/mysql_control.sh
# 启动MySQL
# /mysql/scripts/mysql_control.sh start
MySQL started successfully
# 检查状态
# /mysql/scripts/mysql_control.sh status
MySQL is running
Uptime: 10 Threads: 2 Questions: 10 Slow queries: 0 Opens: 100 Flush tables: 1 Open tables: 50 Queries per second avg: 1.000
# 重启MySQL
# /mysql/scripts/mysql_control.sh restart
MySQL restarted successfully
# 停止MySQL
# /mysql/scripts/mysql_control.sh stop
MySQL stopped successfully
Part05-风哥经验总结与分享
5.1 启动/停止最佳实践
- 使用系统服务:优先使用systemd或initd管理MySQL服务
- 定期备份:在重启或关闭前,确保已完成数据备份
- 维护窗口:在业务低峰期进行重启或关闭操作
- 监控告警:设置服务状态监控,及时发现异常
- 记录日志:记录每次启动/停止/重启的时间和原因
- 避免强制关闭:除非紧急情况,否则不要使用kill -9强制关闭
- 检查配置:修改配置文件后,先验证语法再重启
5.2 常见问题与解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 启动失败,报错”Can’t find file: ‘./mysql/plugin.frm'” | 数据目录权限错误或数据文件损坏 | 检查数据目录权限,确保mysql用户有读写权限;如果数据损坏,从备份恢复 |
| 启动失败,报错”Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock'” | 套接字文件路径错误或权限问题 | 检查配置文件中的socket参数,确保路径正确;检查套接字文件权限 |
| 关闭缓慢或无响应 | 长时间运行的事务或锁等待 | 查看正在运行的事务,终止长时间运行的事务 |
| 重启后无法登录 | 密码错误或权限问题 | 使用skip-grant-tables参数启动,重置root密码;检查用户权限 |
| 启动后内存占用过高 | 缓冲池等内存参数设置过大 | 调整innodb_buffer_pool_size等内存参数,合理分配内存 |
from MySQL:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
