在Linux环境下修改MySQL密码是数据库管理中的常见操作,根据是否已知当前密码、MySQL版本(如5.7、8.0)及安装方式(源码、包管理器等),操作步骤存在差异,本文将详细介绍不同场景下的密码修改方法,并涵盖注意事项及问题排查。
修改密码前的准备工作
-
确认MySQL服务状态
确保MySQL服务正在运行,可通过以下命令检查:systemctl status mysqld # CentOS 7+/Ubuntu 16.04+ service mysql status # CentOS 6及更早版本
若服务未运行,需先启动:
systemctl start mysqld
或service mysql start
。 -
确认登录权限
若已知当前密码,可直接登录;若忘记密码,需跳过权限表(后文详述),登录命令:mysql -u root -p # 输入当前密码后进入MySQL
-
备份重要数据
修改密码前建议备份数据库,避免操作失误导致数据丢失:mysqldump -u root -p --all-databases > backup.sql
已知当前密码时修改MySQL密码
(一)使用mysqladmin命令(适用于所有版本)
mysqladmin是MySQL自带的客户端管理工具,可通过命令行快速修改密码。
基本语法:
mysqladmin -u 用户名 -p旧密码 password 新密码
示例(修改root用户密码):
mysqladmin -u root -poldpass password "NewPass123!"
注意事项:
- 旧密码需正确输入,若旧密码为空(如首次安装后),可省略
-p旧密码
参数,但需在交互提示中输入空密码。 - 新密码需符合MySQL的密码策略(如长度、字符类型),可通过
SHOW VARIABLES LIKE 'validate_password%';
查看策略规则。
(二)通过SQL命令修改(区分版本)
MySQL 5.7及以下版本
7版本中,用户密码存储在mysql.user
表的authentication_string
字段(早期版本为password
字段)。
操作步骤:
(1)登录MySQL:
mysql -u root -p
(2)选择数据库:
USE mysql;
(3)更新密码:
UPDATE user SET authentication_string=PASSWORD('新密码') WHERE User='root' AND Host='localhost';
(4)刷新权限使修改生效:
FLUSH PRIVILEGES;
(5)退出MySQL:
EXIT;
MySQL 8.0及以上版本
版本对密码管理进行了优化,弃用了PASSWORD()
函数,改使用ALTER USER
语句,且认证插件默认为caching_sha2_password
。
操作步骤:
(1)登录MySQL:
mysql -u root -p
(2)直接使用ALTER USER
修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
(3)刷新权限(可选,ALTER USER
会自动刷新):
FLUSH PRIVILEGES;
注意事项:
- 0版本若仍使用
UPDATE
语句修改密码,可能会提示“Unknown column ‘password’ in ‘field list’”(因password
字段已被移除)。 - 若需指定认证插件,可添加
WITH mysql_native_password
(如兼容旧版客户端):ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
忘记root密码时修改MySQL密码
若忘记root密码,需通过“跳过权限表”的方式启动MySQL,无密码登录后修改密码。操作前需停止MySQL服务,并修改配置文件,步骤如下:
(一)修改MySQL配置文件
-
停止MySQL服务:
systemctl stop mysqld # 或 service mysql stop
-
编辑配置文件:
- 使用vim打开MySQL主配置文件(路径可能因安装方式不同而异,常见路径:
/etc/my.cnf
、/etc/mysql/mysql.conf.d/mysqld.cnf
):vim /etc/my.cnf
- 在
[mysqld]
段落下添加以下参数,跳过权限表验证:[mysqld] skip-grant-tables
- 保存并退出(
wq
)。
- 使用vim打开MySQL主配置文件(路径可能因安装方式不同而异,常见路径:
-
启动MySQL服务(跳过权限表):
systemctl start mysqld # 或 service mysql start
(二)无密码登录并修改密码
-
登录MySQL(无需输入密码):
mysql -u root
-
修改root密码(区分版本):
- MySQL 5.7及以下版本:
USE mysql; UPDATE user SET authentication_string=PASSWORD('新密码') WHERE User='root'; FLUSH PRIVILEGES;
- MySQL 8.0及以上版本:
-- 首先刷新权限(跳过权限表启动后需手动刷新) FLUSH PRIVILEGES; -- 修改密码 ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
- MySQL 5.7及以下版本:
-
退出MySQL:
EXIT;
(三)恢复配置并重启服务
-
注释或删除跳过权限表的配置:
再次编辑/etc/my.cnf
文件,将skip-grant-tables
参数注释或删除:[mysqld] # skip-grant-tables
保存并退出。
-
重启MySQL服务:
systemctl restart mysqld # 或 service mysql restart
-
验证新密码:
mysql -u root -p
输入新密码,若成功登录则表示修改成功。
不同版本修改命令对比
操作场景 | MySQL 5.7及以下版本 | MySQL 8.0及以上版本 |
---|---|---|
已知密码(SQL命令) | UPDATE user SET authentication_string=PASSWORD('新密码') WHERE User='root'; |
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; |
忘记密码(无密码登录后) | 需先FLUSH PRIVILEGES ,再执行UPDATE 语句 |
需先FLUSH PRIVILEGES ,再执行ALTER USER 语句 |
指定认证插件 | UPDATE user SET authentication_string=PASSWORD('新密码') WHERE User='root'; |
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; |
注意事项
-
密码复杂度:
MySQL默认密码策略要求密码包含大小写字母、数字及特殊字符,长度至少8位,可通过以下命令查看或修改策略:-- 查看密码策略(8.0版本) SHOW VARIABLES LIKE 'validate_password%'; -- 修改密码长度要求(8.0版本) SET GLOBAL validate_password.length=6;
-
主机名权限:
若需从远程主机登录,需修改Host
字段为(允许所有主机)或指定IP:UPDATE user SET Host='%' WHERE User='root'; FLUSH PRIVILEGES;
注意:生产环境不建议开放,应限制为特定IP。
-
配置文件权限:
修改/etc/my.cnf
时需确保文件权限正确(通常为644
,属主为root
):chmod 644 /etc/my.cnf chown root:root /etc/my.cnf
相关问答FAQs
问题1:修改MySQL密码后,使用新密码登录仍提示“Access denied for user ‘root’@’localhost’”,如何解决?
解答:
可能原因及解决方法:
- 未刷新权限:执行
FLUSH PRIVILEGES;
使修改生效。 - 主机名不匹配:检查
mysql.user
表中root
用户的Host
字段是否为localhost
(本地登录)或允许的IP,若需远程登录,需修改Host
为对应IP或。 - 密码复杂度不满足:通过
SHOW VARIABLES LIKE 'validate_password%';
查看密码策略,确保新密码符合要求。 - 服务未重启:若修改了配置文件(如跳过权限表后恢复),需重启MySQL服务。
问题2:在MySQL 8.0中使用UPDATE user SET password=PASSWORD('newpass') WHERE User='root';
修改密码失败,提示“Unknown column ‘password’ in ‘field list’”,如何处理?
解答:
MySQL 8.0版本已移除mysql.user
表中的password
字段,改用authentication_string
存储密码哈希值,正确的修改方式为:
-- 1. 刷新权限(跳过权限表启动后需执行) FLUSH PRIVILEGES; -- 2. 使用ALTER USER语句修改密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';
若需兼容旧版客户端(如某些PHP程序),可指定认证插件为mysql_native_password
:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass';
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/33318.html