MySQL安装完成后,root账号默认处于无密码或使用临时密码的状态,这是很多服务器被入侵的常见入口。无论是通过yum源安装还是官方二进制包部署,第一次启动MySQL后都应该立即为root设置一个强密码。本文将从安装后的初始化配置、常规密码修改、忘记密码后的重置流程三个方面,详细讲解root密码的设置方法,并说明密码策略插件对设置过程的影响。

一、安装完成后使用mysql_secure_installation初始化密码
这是官方推荐的首选方式。MySQL 5.7和8.0版本在通过包管理器安装并首次启动后,会在错误日志中生成一个root临时密码。临时密码的位置因系统而异:CentOS下通常在/var/log/mysqld.log,Ubuntu下则在/var/log/mysql/error.log。可以用grep命令快速找到它:
grep 'temporary password' /var/log/mysqld.log # 输出类似:[Note] A temporary password is generated for root@localhost: xxxxxx
拿到临时密码后,先用它登录MySQL,此时执行任何操作都会提示密码过期,必须先修改密码。接着运行官方提供的加固脚本:
mysql_secure_installation
这个交互式脚本会依次引导你完成:设置新的root密码、删除匿名用户、禁止root远程登录、删除test数据库、重新加载权限表。如果是在本地开发环境想设置一个简单的密码(比如123456),往往会报错ERROR 1819 (HY000),这是因为MySQL默认启用了密码强度校验插件validate_password,它要求密码至少包含大小写字母、数字和特殊字符,长度不少于8位。可以先按规则设置一个复杂密码完成初始化,之后再按需调整策略。
二、使用ALTER USER语句手动设置或修改密码
除了交互式脚本,直接执行SQL语句修改密码更为灵活,也更适合写进自动化部署脚本。登录MySQL后,针对不同版本的语法略有差异。MySQL 5.7推荐使用ALTER USER:
-- 登录后修改root密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@123'; FLUSH PRIVILEGES;
而MySQL 8.0开始默认认证插件换成了caching_sha2_password,如果客户端工具版本较老(比如旧版Navicat或PHP的mysqli扩展),连接时会报认证失败的错误。此时可以在设置密码的同时指定旧版认证插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewPass@123';
注意引号必须使用英文单引号,密码中如果包含感叹号或特殊符号,在bash命令行下建议用双引号包裹整条语句,避免被shell解析。修改完成后执行FLUSH PRIVILEGES刷新权限,这一步在使用ALTER USER时其实可以省略,但为了保险起见加上也无妨。如果只是想让root支持远程访问,别忘了把host从localhost改为百分号,但要评估好安全风险,不建议生产环境直接对公网开放root账号。
三、忘记root密码后的重置方案
管理多台服务器时难免忘记root密码,此时需要借助--skip-grant-tables参数跳过权限验证。操作前先停止MySQL服务,然后以跳过权限表的方式启动:
# 停止服务 systemctl stop mysqld # 跳过权限表启动,并禁用网络连接 mysqld_safe --skip-grant-tables --skip-networking & # 免密登录 mysql -u root
登录后不能直接用ALTER USER,因为权限表被跳过时部分语句会报错,正确做法是先用FLUSH PRIVILEGES加载权限,再修改密码:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@123';
-- MySQL 5.7.6之前的旧版本可用:
-- SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewPass@123');修改完成后重启MySQL服务恢复正常模式即可。另一个更优雅的方式是在配置文件/etc/my.cnf的[mysqld]段加入skip-grant-tables再重启,重置完务必删掉这行配置。整个过程中--skip-networking参数很重要,它防止重置期间有人通过网络趁虚而入。如果用的是Windows系统,则需要以管理员身份在命令行执行net stop mysql后,通过mysqld --skip-grant-tables启动。
四、密码策略的查看与调整
很多人设置密码失败,根源在于不了解当前的密码策略。可以通过下面的语句查看策略详情:
SHOW VARIABLES LIKE 'validate_password%';
返回结果中,validate_password.policy控制强度等级(0为低、1为中、2为强),validate_password.length规定最小长度。在开发或测试环境,可以适当放宽:
-- 放宽策略为低等级,最小长度改为6 SET GLOBAL validate_password.policy = 0; SET GLOBAL validate_password.length = 6;
需要注意,SET GLOBAL的方式在MySQL重启后会失效,想永久生效要写入配置文件。而生产环境强烈建议保持默认的中级以上策略,并定期更换密码、限制root只能本机登录,配合防火墙规则才能构建完整的数据库安全防线。
MySQL初始root密码root密码设置MySQL密码修改修改时间:2026-09-05 07:04:29