游客
MySQL密码过期无法执行语句的终极修复方案

MySQL密码过期无法执行语句的终极修复方案

一言准备中...

密码过期机制说明

  • MySQL 5.7 版本后,mysql.user 表结构变更:password 字段替换为 authentication_string,新增 password_expired 字段标记密码状态。
  • 默认 root 密码登录时,检测到 password_expired=Y,触发限制:除 ALTER USER 外,所有语句被拒绝执行。

修复步骤(无验证模式)

1. 停止 MySQL 服务

  • 命令:systemctl stop mysql 或 killall mysql
  • 确保所有进程终止,避免端口占用

2. 跳过授权表启动

  • 执行:mysqld_safe --skip-grant-tables
  • 启动后,MySQL 不验证密码,允许无凭证登录

3. 客户端登录

  • 直接执行:mysql -u root
  • 无密码提示,进入后不受 password_expired 限制

4. 查看用户状态

  • SQL:SELECT authentication_string, password_expired FROM mysql.user WHERE user='root';
  • 确认当前 authentication_string 和 password_expired 值

5. 更新密码与过期标识

  • 命令:UPDATE mysql.user SET authentication_string=PASSWORD('yourpassword'), password_expired='N' WHERE user='root';
  • yourpassword 替换为实际新密码

6. 刷新权限

  • FLUSH PRIVILEGES;
  • 使修改立即生效,无需重启

7. 验证结果

  • SQL:SELECT authentication_string, password_expired FROM mysql.user WHERE user='root';
  • password_expired 显示为 N,表示已禁用过期

8. 正常重启服务

  • 命令:service mysql start
  • 禁止使用 --skip-grant-tables 参数

9. 新密码登录测试

  • 使用:mysql -u root -p
  • 输入新密码,确认可正常执行查询

配置文件优化(my.cnf)

配置项 作用 参数示例
default_password_lifetime 控制密码过期天数,0 为不过期 default_password_lifetime = 0
validate_password_policy 密码强度策略等级,0 为低 validate_password_policy=0
validate_password_length 密码最小长度,可设为 5 validate_password_length=5
skip-grant-tables 跳过授权验证,仅临时调试 不保留在正式配置中
  • 修改前备份 my.cnf
  • 重启服务生效:systemctl restart mysql

主要功能

  • 密码过期状态重置:通过 UPDATE 直接设置 password_expired='N',输入为 root 用户名,输出为解除语句执行限制
  • 授权表跳过启动:使用 --skip-grant-tables 参数,输入为 MySQL 服务进程,输出为无密码登录模式,仅限维护使用
  • 密码强度动态配置:通过 validate_password_policy 和 validate_password_length 调整,输入为 0-2 等级值,输出为对应密码策略
  • 过期时间全局禁用:设置 default_password_lifetime=0,输入为配置文件参数,输出为所有用户密码永不过期
  • 权限刷新机制:FLUSH PRIVILEGES 命令,输入为已修改的授权表数据,输出为内存中权限缓存同步

如何使用

  1. 停止服务后,用 mysqld_safe --skip-grant-tables 启动
  2. 直接登录,执行 UPDATE 语句修改密码和过期状态
  3. 执行 FLUSH PRIVILEGES,重启服务
  4. 用新密码登录,验证是否可正常执行语句

竞品对比

对比维度 主机实测方案 直接 ALTER USER 图形化工具重置
操作路径 停止服务→跳过授权→UPDATE→重启 登录后执行 ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass'; 通过 phpMyAdmin 等工具,进入用户管理页面修改
适用场景 密码过期导致无法执行任何语句 密码已知但需要修改 有图形界面且 MySQL 服务正常
依赖条件 需系统 root 权限、MySQL 服务可停 需当前密码有效、能执行 SQL 需 Web 服务器、数据库连接正常
风险等级 中(需停服,有临时无验证窗口) 低(在线操作) 低(图形化操作)
额外步骤 需手动 FLUSH PRIVILEGES 并重启 自动生效,无需刷新 部分工具自动刷新权限

应用场景

  • 新安装 MySQL 5.7+ 后:首次登录时密码过期,导致无法执行 SELECT 或 SHOW DATABASES 等操作
  • 密码策略调整后:default_password_lifetime 配置变更,现有 root 密码被标记为过期
  • 忘记 root 密码:结合 skip-grant-tables 模式,可跳过认证直接重置
  • 批量服务器维护:多台 Linux 主机需统一处理 MySQL root 密码过期问题

适用人群

  • Linux 运维人员,需管理 MySQL 5.7 以上版本
  • 数据库管理员,处理密码过期导致的访问故障
  • 开发测试人员,在本地或测试环境初始化 MySQL 后遇到登录限制
  • 本文作者:站长
  • 本文链接: https://www.zhujishice.cn/vpsjc/174.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
0
0
  • 支付宝打赏
    支付宝扫一扫
  • 微信打赏
    微信扫一扫
感谢支持
文章很赞!支持一下吧
关于作者
454
0
0
0
内卷太严重,已躺平...

Docker inode耗尽导致no space left on device的排查与清理

上一篇

Docker镜像容器导出导入机制详解

下一篇
评论区
内容为空

这一切,似未曾拥有

  • 复制图片
按住ctrl可打开默认菜单