MySQL中root用户密码管理的三种场景完全指南

 更新时间:2026年02月24日 08:56:21   作者:Seal^_^  
在MySQL数据库的日常运维中,root用户密码管理是最基础也最重要的操作之一,本文将针对三种常见场景,分别给出详细的操作步骤,涵盖MySQL 5.6、5.7、8.0三个主流版本,感兴趣的小伙伴可以了解下

引言

在MySQL数据库的日常运维中,root用户密码管理是最基础也最重要的操作之一。无论是刚部署完MySQL需要设置初始密码,还是定期更新密码,抑或是悲剧地忘记了密码,都需要我们熟练掌握相应的操作技巧。

本文将针对三种常见场景,分别给出详细的操作步骤,涵盖MySQL 5.6、5.7、8.0三个主流版本。

场景一:首次部署MySQL,设置root用户密码

方式一:在初始化数据库时设置

MySQL提供了两种初始化方式,区别在于是否生成随机临时密码。

1.--initialize方式(生成随机临时密码)

# 初始化数据库,生成随机临时密码
mysqld --initialize \
  --user=mysql \
  --datadir=/data/3306/data \
  --basedir=/usr/local/mysql

# 查看生成的临时密码
grep 'temporary password' /var/log/mysqld.log
# 输出示例: 2025-10-28T07:25:16.184768Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: >hq2L?wzR8x

特点

  • 安全性高:生成复杂随机密码
  • 符合安全规范:首次登录必须修改密码
  • 需要从日志中查找密码

首次登录

# 使用临时密码登录
mysql -uroot -p
# 输入临时密码: >hq2L?wzR8x

# MySQL会强制要求修改密码
mysql> ALTER USER root@'localhost' IDENTIFIED BY 'NewPassword123!';

2.--initialize-insecure方式(空密码)

# 初始化数据库,root用户无密码
mysqld --initialize-insecure \
  --user=mysql \
  --datadir=/data/3306/data \
  --basedir=/usr/local/mysql

# 直接登录(无需密码)
mysql -uroot

特点

  • 方便开发环境搭建
  • 安全性低,生产环境不推荐
  • 需要立即设置密码

方式二:手动设置密码

如果初始化时使用了空密码,或者需要修改初始密码,可以使用以下方法:

MySQL 8.0版本

# 方法1:使用mysqladmin命令
mysqladmin -uroot password 'NewPassword123!'

# 方法2:登录后执行ALTER语句
mysql -uroot

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
Query OK, 0 rows affected (0.01 sec)

MySQL 5.7版本

# 方法1:使用mysqladmin命令
mysqladmin -uroot password 'NewPassword123!'

# 方法2:登录后执行ALTER语句
mysql -uroot

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
Query OK, 0 rows affected (0.01 sec)

MySQL 5.6版本

-- 5.6版本使用PASSWORD()函数
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewPassword123!');
Query OK, 0 rows affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

场景二:已知root用户密码,修改root用户密码

MySQL 8.0版本

# 方法1:使用mysqladmin命令(交互式输入密码)
mysqladmin -uroot -p password 'NewPassword456!'
Enter password: 输入旧密码

# 方法2:登录后修改
mysql -uroot -p
Enter password: 输入旧密码

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword456!';
Query OK, 0 rows affected (0.01 sec)

MySQL 5.7版本

-- 登录后修改(5.7版本)
mysql -uroot -p
Enter password: 输入旧密码

mysql> UPDATE mysql.user 
       SET authentication_string = PASSWORD('NewPassword456!') 
       WHERE user = 'root' AND host = 'localhost';
Query OK, 1 row affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MySQL 5.6版本

-- 登录后修改(5.6版本)
mysql -uroot -p
Enter password: 输入旧密码

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewPassword456!');
Query OK, 0 rows affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

各版本密码修改方式对比

版本密码字段设置密码方式是否需FLUSH
MySQL 8.0authentication_stringALTER USER
MySQL 5.7authentication_stringUPDATE + PASSWORD()
MySQL 5.6passwordSET PASSWORD + PASSWORD()

场景三:忘记root密码,需重置root用户密码

这是最麻烦但也最常见的场景。别慌,按照以下步骤操作即可。

步骤一:关闭数据库服务

# 查看MySQL进程
[root@master ~]# ps -ef | grep mysql
root      12345      1  0 10:30 ?        00:00:00 /usr/sbin/mysqld

# 关闭MySQL服务(根据安装方式选择)
[root@master ~]# systemctl stop mysqld
# 或
[root@master ~]# /etc/init.d/mysqld stop
# 或
[root@master ~]# service mysql stop

# 确认已关闭
[root@master ~]# ps -ef | grep mysql
root     4070896 4068830  0 15:24 pts/0    00:00:00 grep mysql

步骤二:采用安全模式启动数据库

# 使用mysqld_safe启动,跳过授权表,禁用网络
[root@master ~]# mysqld_safe --skip-grant-tables --skip-networking &
[1] 4071155

# 输出信息
2025-10-28T07:25:16.184768Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2025-10-28T07:25:16.211299Z mysqld_safe Starting mysqld daemon with databases from /data00/data/mysql

参数说明

  • --skip-grant-tables:跳过权限表验证,可以免密登录
  • --skip-networking:禁用网络连接,防止其他主机连接(安全考虑)
  • &:后台运行

步骤三:进入数据库修改密码

# 免密登录(无需密码)
[root@master ~]# mysql -uroot

# 重要:先刷新权限,使授权表生效
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

# 根据MySQL版本选择相应命令

MySQL 8.0版本修改密码

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'huangsir';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

MySQL 5.7版本修改密码

mysql> UPDATE mysql.user 
       SET authentication_string = PASSWORD('huangsir') 
       WHERE user = 'root' AND host = 'localhost';
Query OK, 1 row affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MySQL 5.6版本修改密码

mysql> UPDATE mysql.user 
       SET password = PASSWORD('huangsir') 
       WHERE user = 'root' AND host = 'localhost';
Query OK, 1 row affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

步骤四:恢复数据库服务正常启动

# 退出MySQL
mysql> exit
Bye

# 杀掉mysqld_safe进程
[root@master ~]# pkill mysql
[root@master ~]# pkill mysqld_safe

# 确认进程已全部杀掉
[root@master ~]# ps -ef | grep mysql
root     4072026 4068830  0 15:29 pts/0    00:00:00 grep mysql

# 正常启动MySQL
[root@master ~]# systemctl start mysqld
# 或
[root@master ~]# /etc/init.d/mysqld start
Starting mysqld (via systemctl): mysqld.service.

步骤五:测试连接

# 使用新密码测试登录
[root@master ~]# mysql -uroot -phuangsir
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.26 MySQL Community Server - GPL

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER()         | CURRENT_USER() |
+----------------+----------------+
| root@localhost | root@localhost |
+----------------+----------------+
1 row in set (0.00 sec)

mysql>

补充知识:FLUSH PRIVILEGES的作用

什么时候需要执行FLUSH PRIVILEGES?

FLUSH PRIVILEGES的两个作用

  • 将内存中的权限数据落盘:将对授权表的修改从内存同步到磁盘
  • 重新加载权限表:将磁盘中的权限数据重新加载到内存
-- 场景1:直接操作mysql.user表后,需要刷新
UPDATE mysql.user SET ...;
FLUSH PRIVILEGES;  -- 必须执行

-- 场景2:使用ALTER USER修改密码,不需要刷新
ALTER USER ...;    -- 自动生效,无需FLUSH

-- 场景3:使用GRANT授权,不需要刷新
GRANT SELECT ON *.* TO 'user'@'%';  -- 自动生效

各版本密码管理命令速查表

操作场景MySQL 8.0MySQL 5.7MySQL 5.6
首次设置密码ALTER USER ...ALTER USER ...SET PASSWORD ...
修改已知密码ALTER USER ...UPDATE mysql.user ...SET PASSWORD ...
忘记密码重置ALTER USER ...UPDATE ... SET authentication_stringUPDATE ... SET password
是否需要FLUSH❌ 不需要✅ 需要(UPDATE后)✅ 需要(UPDATE后)

常见问题与注意事项

1. 密码复杂度要求

MySQL 8.0/5.7默认启用了密码复杂度验证插件:

-- 查看密码策略
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length              | 8      |
| validate_password.mixed_case_count    | 1      |
| validate_password.number_count        | 1      |
| validate_password.policy              | MEDIUM |
| validate_password.special_char_count  | 1      |
+--------------------------------------+--------+

如果密码太简单会报错:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

解决方案:设置符合要求的密码(至少8位,包含大小写字母、数字、特殊字符)

2. 安全模式启动失败

# 如果mysqld_safe启动失败,检查错误日志
tail -f /var/log/mysql/error.log

# 常见问题:数据目录权限不对
chown -R mysql:mysql /data00/data/mysql

3. 8.0版本PASSWORD()函数被移除

MySQL 8.0移除了PASSWORD()函数,不能用于设置密码:

-- MySQL 8.0中会报错
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('123') ...;
ERROR 1305 (42000): FUNCTION PASSWORD does not exist

必须使用ALTER USERmysqladmin命令

4. 安全建议

# 1. 定期更换密码(建议每90天)
mysqladmin -uroot -p password

# 2. 使用复杂密码
# 好密码: MyNewP@ssw0rd2025!
# 坏密码: 123456、password、root

# 3. 不同环境使用不同密码
# 开发、测试、生产密码分开

# 4. 密码不要明文写在脚本中
# 使用mysql_config_editor创建登录路径
mysql_config_editor set --login-path=local --host=localhost --user=root --password

总结

MySQL root密码管理可以概括为三个场景、三种方法:

场景核心命令关键点
首次部署mysqld --initialize记下临时密码
已知密码修改ALTER USER / mysqladmin8.0用ALTER,5.7用UPDATE
忘记密码重置mysqld_safe --skip-grant-tables先刷FLUSH,再改密码

最佳实践

  • 生产环境使用--initialize初始化,生成复杂密码
  • 定期更换密码,使用密码管理工具保存
  • 不同环境使用不同密码,避免密码泄露扩散
  • 遇到忘记密码不要慌,安全模式是救命稻草

记住:密码管理是数据库安全的第一道防线,也是最后一道防线

以上就是MySQL中root用户密码管理的三种场景完全指南的详细内容,更多关于MySQL root用户密码管理的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL索引失效的问题解决

    MySQL索引失效的问题解决

    索引可以大大提高查询速度和效率,但如果索引失效了,查询的效率会变得非常低,本文主要介绍了MySQL索引失效的问题解决,感兴趣的可以了解一下
    2024-05-05
  • MySQL查询本周数据实现方式

    MySQL查询本周数据实现方式

    这篇文章主要介绍了MySQL查询本周数据实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-06-06
  • Mysql删除几亿条数据表中的部分数据的方法实现

    Mysql删除几亿条数据表中的部分数据的方法实现

    在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • MySQL中关于datetime、date、time、str之间的转化与比较

    MySQL中关于datetime、date、time、str之间的转化与比较

    这篇文章主要介绍了MySQL中关于datetime、date、time、str之间的转化与比较,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • MySQL内置函数全解析

    MySQL内置函数全解析

    MySQL内置函数包括日期、字符串、数学、进制转换及其他实用函数,用于简化数据库操作和数据处理,本文给大家介绍MySQL内置函数全解析,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Druid数据库连接池的jar包的使用方式

    Druid数据库连接池的jar包的使用方式

    这篇文章主要介绍了Druid数据库连接池的jar包的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • mysql中inner join和left join使用详解

    mysql中inner join和left join使用详解

    本文主要介绍了mysql中inner join和left join使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • explain分析sql效率的方法

    explain分析sql效率的方法

    下面小编就为大家带来一篇explain分析sql效率的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL数据库如何导入导出(备份还原)

    MySQL数据库如何导入导出(备份还原)

    这篇文章主要介绍了MySQL数据库如何导入导出(备份还原),需要的朋友可以参考下
    2015-10-10
  • MySQL 查询重复数据的具体示例

    MySQL 查询重复数据的具体示例

    本文介绍MySQL查询重复数据的三种方法分别是通过GROUP BY和HAVING查找重复记录,使用子查询或JOIN列出所有重复行,添加计数显示重复次数,同时提醒注意性能优化与数据备份,对mysql查询重复数据相关知识感兴趣的朋友一起看看吧
    2025-07-07

最新评论