- 1 1. 介绍
- 2 2. 如何设置和更改 MySQL 密码
- 3 3. 忘记 MySQL 密码时如何重置
- 4 4. 更改 MySQL 密码时的常见错误排查
- 5 5. MySQL 安全加固和推荐设置
- 6 6. 常见问题解答 (FAQ)
- 7 7. 结论
1. 介绍
MySQL 密码管理的重要性
MySQL 是全球广泛使用的数据库管理系统。然而,它的 安全管理基础 在于 正确的密码配置和管理。如果没有适当的密码管理,您可能会面临以下 风险:
- 未授权访问:弱密码会使系统容易受到外部攻击。
- 数据泄露:敏感信息可能被恶意用户获取。
- 系统篡改:数据的删除或修改可能影响网站和应用的正常运行。
为避免这些风险,必须 设置强密码并定期更换。本文将详细说明 MySQL 密码管理的以下方面:
✅ 如何为新用户设置密码
✅ 如何为已有用户更改密码
✅ 如何重置忘记的密码
✅ 如何检查密码强度
✅ 常见错误及解决方案
✅ 提升安全性的推荐设置
阅读本文后,您将掌握 正确管理 MySQL 密码所需的知识和技能,请务必阅读至文末。
2. 如何设置和更改 MySQL 密码
创建新用户并设置密码
本节介绍如何在 MySQL 中创建新用户并设置密码。
1. 登录 MySQL
首先,以 MySQL 管理员(如 root 用户)的身份登录。
mysql -u root -p
-u root 是 以 root 用户登录 的选项,-p 会显示 密码提示。
2. 创建新用户并设置密码
使用 CREATE USER 命令创建新用户并设置密码。
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'secure_password';
'newuser'@'localhost':指定用户名(newuser)以及用户可以连接的主机(localhost)。'secure_password':要设置的密码(请确保使用强密码)。
3. 授予适当的权限
必须为新用户授予数据库权限。例如,授予所有权限:
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost' WITH GRANT OPTION;
ALL PRIVILEGES:授予所有权限。*.*:允许访问所有数据库和表。WITH GRANT OPTION:允许该用户将权限授予其他用户。
4. 应用权限
执行 FLUSH PRIVILEGES 以使更改生效。
FLUSH PRIVILEGES;
现在,您已经成功创建了一个带有安全密码和适当权限的新用户。
更改已有用户的密码
本节介绍如何更改已有 MySQL 用户的密码。
1. 登录 MySQL
使用管理员权限登录。
mysql -u root -p
2. 使用 ALTER USER 更改密码(MySQL 5.7 及以后版本)
ALTER USER 'existinguser'@'localhost' IDENTIFIED BY 'new_secure_password';
'existinguser'@'localhost':要修改的用户名和主机。'new_secure_password':新的密码。
3. 使用 SET PASSWORD 更改密码(MySQL 5.6 及以前版本)
SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('new_secure_password');
使用 PASSWORD() 函数可确保密码在存储前被正确加密。
4. 应用更改
别忘了执行 FLUSH PRIVILEGES;。
FLUSH PRIVILEGES;
现在,您可以使用此方法安全地更改已有用户的密码。

3. 忘记 MySQL 密码时如何重置
即使忘记了 MySQL 密码,也可以通过正确的步骤进行重置。本节将说明在 Windows、Linux 和 macOS 上重置密码的方法。
在 Windows 上,重置 MySQL root 密码的常用方法是使用 skip-grant-tables 选项。
1. 停止 MySQL 服务
首先,停止 Windows 上正在运行的 MySQL 服务。
net stop mysql
或者,您可以打开 services.msc 并手动 停止 MySQL 服务。
2. 使用 mysqld --skip-grant-tables 启动 MySQL
mysqld --skip-grant-tables --skip-networking
3. 登录 MySQL
mysql -u root
4. 设置新密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
或对于 MySQL 5.6 及更早版本,使用 SET PASSWORD。
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_secure_password');
5. 重启 MySQL
net stop mysql
net start mysql
如何在 Linux / Mac 上重置 MySQL 密码
1. 停止 MySQL 服务
sudo systemctl stop mysql
2. 以 --skip-grant-tables 模式启动 MySQL
sudo mysqld_safe --skip-grant-tables --skip-networking &
3. 登录 MySQL
mysql -u root
4. 重置密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
5. 重启 MySQL
sudo systemctl start mysql
MySQL 8.0 及以后版本的密码重置方法的变化
在 MySQL 8.0 中,密码管理机制已更改,因此您应注意以下要点。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_secure_password';
这使您在需要时 继续使用传统的密码认证方式。
4. 更改 MySQL 密码时的常见错误排查
在尝试更改 MySQL 密码时,您可能会遇到错误。本节解释常见错误的原因和解决方案。
错误 1045 (28000):用户访问被拒绝
错误原因
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
当登录 MySQL 时,如果 密码不正确 或 权限不足,就会出现此错误。
解决方案
- 重新检查您输入的密码
- 指定正确的用户名和主机
SELECT User, Host FROM mysql.user;
- 重置密码(参见密码重置部分)
- 正确配置权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
错误 1133:在用户表中找不到匹配的行
错误原因
ERROR 1133: Can't find any matching row in the user table
当 指定的用户不存在 时会出现此错误。
解决方案
- 检查当前用户列表
SELECT User, Host FROM mysql.user;
- 重新创建用户
CREATE USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
- 指定正确的主机(适当地使用
localhost或%)
错误 1820:必须重置密码
错误原因
ERROR 1820: You must reset your password using ALTER USER statement before executing this statement.
当 密码已过期 时会出现此错误。
解决方案
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
禁用密码过期:
SET GLOBAL default_password_lifetime = 0;
错误 2059:插件 caching_sha2_password 无法加载
错误原因
ERROR 2059: Plugin caching_sha2_password could not be loaded
在 MySQL 8.0 及以后版本,默认认证插件已更改为 caching_sha2_password,这可能导致某些客户端出现错误。
解决方案
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_secure_password';
或者将以下内容添加到 MySQL 配置文件(my.cnf 或 my.ini)并重启 MySQL。
[mysqld]
default_authentication_plugin=mysql_native_password
重启 MySQL:
sudo systemctl restart mysql
5. MySQL 安全加固和推荐设置
加强 MySQL 安全对于提高数据库安全性并防止未经授权的访问和数据泄露至关重要。本节介绍推荐配置以增强 MySQL 安全。
设置强密码
在 MySQL 中使用弱密码会使您的系统成为攻击者的容易目标。配置设置以增加密码强度。
启用密码策略
检查当前密码策略:
SHOW VARIABLES LIKE 'validate_password%';
配置强密码策略:
SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
设置密码过期
定期更改密码可以增强安全性。
检查当前密码过期设置:
SHOW VARIABLES LIKE 'default_password_lifetime';
将密码过期设置为 90 天:
SET GLOBAL default_password_lifetime = 90;
加强 root 用户安全
限制 root 用户的远程访问
检查 root 用户的当前主机配置:
SELECT User, Host FROM mysql.user WHERE User = 'root';
禁用 root 的远程访问:
UPDATE mysql.user SET Host='localhost' WHERE User='root';
FLUSH PRIVILEGES;
创建备用管理员账户并禁用 root
CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'localhost' WITH GRANT OPTION;
RENAME USER 'root'@'localhost' TO 'disabled_root'@'localhost';
FLUSH PRIVILEGES;
限制 MySQL 远程连接
编辑配置文件(my.cnf 或 my.ini):
[mysqld]
bind-address = 127.0.0.1
在 Linux 上配置防火墙:
sudo ufw deny 3306
仅允许特定 IP 地址:
sudo ufw allow from 192.168.1.100 to any port 3306
删除不必要的账户和权限
检查当前用户列表:
SELECT User, Host FROM mysql.user;
删除匿名用户:
DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;
删除不必要的 test 数据库:
DROP DATABASE test;
FLUSH PRIVILEGES;
启用 MySQL 日志
启用错误日志:
[mysqld]
log_error = /var/log/mysql/error.log
启用通用查询日志:
general_log = 1
general_log_file = /var/log/mysql/general.log
重启 MySQL:
sudo systemctl restart mysql
6. 常见问题解答 (FAQ)
本节总结了与 MySQL 密码设置、修改和重置相关的常见问题和解决方案。
Q1: 恢复忘记的 MySQL root 密码的最简单方法是什么?
解决方案
- 停止 MySQL
sudo systemctl stop mysql
- 以
skip-grant-tables模式启动 MySQLsudo mysqld_safe --skip-grant-tables --skip-networking &
- 登录 MySQL
mysql -u root
- 设置新密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
- 重启 MySQL
sudo systemctl restart mysql
Q2: 如果看到“ERROR 1045 (28000): Access denied for user”该怎么办?
解决方案
- 验证您输入的密码
mysql -u root -p
- 确认用户是否存在
SELECT User, Host FROM mysql.user;
- 重置密码(参见前面的说明)
- 授予适当的权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
Q3: 在更改密码时,MySQL 5.6 和 8.0 之间有区别吗?
在 MySQL 5.6 及更早版本中更改密码
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_secure_password');
在 MySQL 8.0 及以后版本中更改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
在 MySQL 8.0 中,由于 caching_sha2_password 是默认的身份验证方法,较旧的客户端可能需要以下调整:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_secure_password';
问题 4:如何加强 MySQL 密码策略?
配置强密码策略
SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
问题 5:禁用 MySQL root 用户安全吗?
解决方案
- 创建管理员账户
CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'secure_password'; GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'localhost' WITH GRANT OPTION;
- 禁用 root 账户
RENAME USER 'root'@'localhost' TO 'disabled_root'@'localhost'; FLUSH PRIVILEGES;
问题 6:有没有工具可以安全管理 MySQL 密码?
解决方案
mysql_config_editor(官方 MySQL 工具)mysql_config_editor set --login-path=local --host=localhost --user=root --password
这使您可以在不显式输入密码的情况下登录。
mysql --login-path=local
- 密码管理器(Bitwarden、1Password、KeePass 等) * 有助于生成并安全存储强密码。
问题 7:我可以记录 MySQL 密码更改吗?
解决方案
启用通用查询日志
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/general.log
重启 MySQL:
sudo systemctl restart mysql
7. 结论
本文阐述了 MySQL 密码管理的 从基础到高级的全部内容。以下是关键要点的摘要以及 正确管理 MySQL 密码的检查清单。
MySQL 密码管理的关键要点
✅ 正确的密码配置和管理是安全的基石
✅ 创建新用户时设置强密码
✅ 定期更改密码并配置过期策略
✅ 了解忘记密码的恢复流程
✅ 在更改密码时正确排查错误
✅ 优化远程访问和 root 用户管理以加强安全
✅ 启用日志记录以追踪密码相关活动
MySQL 密码管理检查清单
| Checklist Item | Status |
|---|---|
| Have you set a strong root password for MySQL? | ✅ / ❌ |
Do you use the CREATE USER command when creating new users? | ✅ / ❌ |
Have you enabled the validate_password plugin and configured a strong password policy? | ✅ / ❌ |
| Do you regularly change passwords and set expiration policies? | ✅ / ❌ |
Have you disabled remote access for the root user? | ✅ / ❌ |
| Have you removed unnecessary or anonymous accounts? | ✅ / ❌ |
Do you understand how to reset passwords using skip-grant-tables mode? | ✅ / ❌ |
Do you understand how to resolve ERROR 1045 and ERROR 1820 during password changes? | ✅ / ❌ |
Have you enabled MySQL logs (general_log and error_log)? | ✅ / ❌ |
阅读本文后的推荐后续操作
- 审查当前的密码策略,并在必要时加强
SHOW VARIABLES LIKE 'validate_password%'; SET GLOBAL validate_password.policy = STRONG; SET GLOBAL validate_password.length = 12;
- 删除不必要的账户
DELETE FROM mysql.user WHERE User=''; DROP DATABASE test; FLUSH PRIVILEGES;
- 限制 root 用户的远程访问
UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;
- 配置定期密码过期
SET GLOBAL default_password_lifetime = 90;
- 启用日志记录以进行监控
[mysqld] log_error = /var/log/mysql/error.log general_log = 1 general_log_file = /var/log/mysql/general.log
重启 MySQL:
sudo systemctl restart mysql
进一步学习的相关文章
📌 MySQL 用户权限管理详细指南
📌 MySQL 备份与恢复流程
📌 如何优化 MySQL 数据库
📌 使用外部身份验证(LDAP 或 OAuth)配置 MySQL
最后思考
MySQL 密码管理是保护数据库安全的 必备知识。
运用本指南中涵盖的实践,确保 安全的数据库管理! 💪


