MySQL 密码重置教程
本教程适用于 MySQL 5.7+ 和 MySQL 8.0+,涵盖 Linux 服务器和 macOS 系统。
目录
1. 确认 MySQL 版本和安装方式
# 查看 MySQL 版本
mysql --version
# 查看 MySQL 安装位置
which mysql2. 停止 MySQL 服务
Linux (Ubuntu/Debian)
sudo systemctl stop mysql
# 或
sudo service mysql stopLinux (CentOS/RHEL)
sudo systemctl stop mysqld
# 或
sudo service mysqld stopmacOS (Homebrew 安装)
brew services stop mysqlmacOS (官方安装包)
sudo /usr/local/mysql/support-files/mysql.server stopDocker
docker stop <容器名或ID>3. 以安全模式启动 MySQL
安全模式会跳过权限验证,允许无密码登录。
Linux (Ubuntu/Debian/CentOS)
sudo mysqld_safe --skip-grant-tables &如果 mysqld_safe 不在 PATH 中:
# Ubuntu/Debian
sudo /usr/sbin/mysqld --skip-grant-tables --user=mysql &
# CentOS/RHEL
sudo /usr/sbin/mysqld --skip-grant-tables --user=mysql &macOS (官方安装包)
sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables &macOS (Homebrew)
/usr/local/opt/mysql/bin/mysqld_safe --skip-grant-tables &
# 或 (Apple Silicon)
/opt/homebrew/opt/mysql/bin/mysqld_safe --skip-grant-tables &等待 5-10 秒让 MySQL 完全启动。
4. 重置密码
4.1 连接到 MySQL
mysql -u root如果连接失败,尝试指定 socket:
# Linux
mysql -u root -S /var/run/mysqld/mysqld.sock
# macOS
mysql -u root -S /tmp/mysql.sock4.2 执行密码重置命令
连接成功后,在 MySQL 命令行中执行:
MySQL 8.0+
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';MySQL 5.7
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';MySQL 5.6 及更早版本
FLUSH PRIVILEGES;
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('你的新密码');4.3 退出 MySQL
EXIT;5. 重启 MySQL 服务
首先停止安全模式的 MySQL:
sudo killall mysqld mysqld_safe
# 或
sudo pkill mysqld然后正常启动 MySQL:
Linux (Ubuntu/Debian)
sudo systemctl start mysqlLinux (CentOS/RHEL)
sudo systemctl start mysqldmacOS (Homebrew)
brew services start mysqlmacOS (官方安装包)
sudo /usr/local/mysql/support-files/mysql.server start6. 验证新密码
mysql -u root -p输入新密码,如果成功登录则密码重置完成。
7. 常见问题排查
问题 1:Can't connect to server (2002 错误)
原因:MySQL 服务未运行或未监听正确的端口/socket。
解决方案:
# 检查 MySQL 是否运行
ps aux | grep mysql
# 检查端口监听
netstat -tlnp | grep 3306
# 或
ss -tlnp | grep 3306
# 检查 socket 文件
ls -la /var/run/mysqld/mysqld.sock # Linux
ls -la /tmp/mysql.sock # macOS问题 2:Access denied (1045 错误)
原因:密码错误或权限问题。
解决方案:确保在 --skip-grant-tables 模式下先执行 FLUSH PRIVILEGES;
问题 3:mysqld_safe 找不到
解决方案:
# 查找 mysqld_safe 位置
find / -name "mysqld_safe" 2>/dev/null
# 或直接使用 mysqld
sudo mysqld --skip-grant-tables --user=mysql &问题 4:MySQL 启动失败
解决方案:查看错误日志
# Linux
sudo cat /var/log/mysql/error.log | tail -50
# 或
sudo journalctl -u mysql --no-pager | tail -50
# macOS
sudo cat /usr/local/mysql/data/*.err | tail -50问题 5:忘记 root 主机限制
如果 root 用户被限制了主机访问,可以同时重置多个主机的密码:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY '新密码';
ALTER USER 'root'@'%' IDENTIFIED BY '新密码'; -- 允许任意主机连接附录:安全建议
- 使用强密码:至少 12 位,包含大小写字母、数字和特殊字符
- 限制 root 远程访问:生产环境避免使用
'root'@'%' - 定期更换密码:建议每 90 天更换一次
- 使用密码管理器:避免遗忘密码
快速参考命令
| 操作 | Ubuntu/Debian | CentOS/RHEL | macOS (Homebrew) | macOS (官方) | |
|---|---|---|---|---|---|
| 停止服务 | sudo systemctl stop mysql | sudo systemctl stop mysqld | brew services stop mysql | sudo /usr/local/mysql/support-files/mysql.server stop | |
| 启动服务 | sudo systemctl start mysql | sudo systemctl start mysqld | brew services start mysql | sudo /usr/local/mysql/support-files/mysql.server start | |
| 查看状态 | sudo systemctl status mysql | sudo systemctl status mysqld | brew services list | `ps aux \ | grep mysql` |
| 安全模式 | sudo mysqld_safe --skip-grant-tables & | 同左 | 同左 | sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables & |