首页 > 数据库 >MySQL 账号密码永不过期为什么不起作用?

MySQL 账号密码永不过期为什么不起作用?

时间:2023-08-01 15:36:39浏览次数:40  
标签:密码 不起作用 mysql 过期 user MySQL lifetime password 账号密码

背景

客户反馈MySQL账号已经设置成密码永不过期了,但是在登录后总是提示报错 ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.

排查方法

首先检查一下MySQL服务器设置的密码过期时间,可以看到默认密码60天就会过期

mysql> show variables like '%lifetime%';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| default_password_lifetime | 60    |
+---------------------------+-------+
1 row in set (0.01 sec)

然后检查一下mysql.user表,看看用户说提示报错的账号的配置

mysql> select user,host,password_expired,password_last_changed,password_lifetime from mysql.user where user='user';
+------+------+------------------+-----------------------+-------------------+
| user | host | password_expired | password_last_changed | password_lifetime |
+------+------+------------------+-----------------------+-------------------+
| user | %    | N                | 2023-02-06 15:03:41   |                 0 |
+------+------+------------------+-----------------------+-------------------+
1 row in set (0.00 sec)
  • password_expired列为N 这个账号没有被手动设置密码过期
  • password_lifetime列为0 账号正常应该已经设置成密码永不过期了
  • password_last_changed列为2023-02-06 15:03:41 上次密码修改时间是2023-02-06

疑点

这个问题诡异的地方就是password_lifetime列为0。 正常情况下,单个账号的策略会覆盖全局策略。也就是说,如果设置过单个账号密码永不过期,就不会再参考default_password_lifetime参数值计算密码过期时间。 这个账号如果按照上次密码修改时间+默认60天过期计算的话,确认是密码过期该修改密码了。

分析

排查了半天,后来灵机一动,想起来一种情况: 这个账号是客户自己设置成密码永不过期的,正常我们设置密码永不过期都是使用ALTER USER user PASSWORD EXPIRE NEVER语句,但是客户会不会用了其他方法呢,比如说直接修改mysql.user表? 我们知道,MySQL会在启动时将权限表读取到内存中。而直接更新mysql.user表,不会立即生效,需要再执行FLUSH PRIVILEGES重新加载权限表。

后来追问客户,客户果然是在navicat界面中直接点击mysql.user表,把password_lifetime列改为0,就以为设置成功了。

处理方案

执行FLUSH PRIVILEGES刷新权限后,果然账号登录时不再报错。

原因

设置密码永不过期的方法错误,只更新了mysql.user表,没有刷新权限 正确方法

ALTER USER user PASSWORD EXPIRE NEVER;
-- 或者
UPDATE mysql.user SET password_lifetime=0 WHERE user='user';
FLUSH PRIVILEGES;

扩展知识

MySQL的权限修改何时生效

MySQL在启动时将权限表加载到内存中,之后使用内存中的权限表进行访问控制

  • 使用账号管理语句,如ALTER USER/GRANT/REVOKE/SET PASSWORD等,会重新加载权限表,立即生效。
  • 使用INSERT,UPDATE,DELETE等更改权限表,不会加载到内存中,不会立即生效。要使这些更改生效,可以:
    • 重新加载权限表 FLUSH PRIVILEGES
    • 重启数据库

设置密码有效期策略

  • 全局有效期更改
SET GLOBAL default_password_lifetime = 60
  • 单个账号有效期更改
-- 跟随全局策略
ALTER USER user PASSWORD EXPIRE DEFAULT
-- 密码永不过期
ALTER USER user PASSWORD EXPIRE NEVER
-- 密码N天过期
ALTER USER user PASSWORD EXPIRE INTERVAL N DAY
  • 直接设置密码过期
ALTER USER user PASSWORD EXPIRE

密码立刻过期,在账号登录后,必须修改密码才能进行其他操作 使用这种方式设置密码过期后,没有SQL语句直接设置密码不过期,但是可以通过更新mysql.userpassword_expired列,然后FLUSH PRIVILEGES刷新权限,变相允许用户继续使用之前的密码

标签:密码,不起作用,mysql,过期,user,MySQL,lifetime,password,账号密码
From: https://blog.51cto.com/yueyinsha/6922736

相关文章

  • mysql 分区表 partion
    1.1.场景在每个系统中都会生成一些日志,往往有些日志都是需要记录的,比如:生成订单的过程的一些记录、某个账号活动的一些信息。这样一来每天生成的日志会很多,而且还会生成到数据库中。像这些记录信息在某段时间过后就没用了。为了节省空间资源,和产品确认这些信息只保留3个月的。3个......
  • mysql千万条据下的分页
    1.1.背景对于开发来说,分页功能碰到的频率还是算蛮高的,基本上在每个模块中都需要都会遇到列表分页的功能。他们实现的都很快,因为基本上只要把之前的代码改改就OK了。他们的实现基本是是如下语句:SELECT*FROMgoodsWHEREuser_id=4LIMIT1000,20;...omit...20rows......
  • SQL总结-MySQL索引使用和优化技巧
    本文将全面介绍MySQL索引的使用技巧,并提供多种优化索引的方法,帮助读者提高数据库查询性能。MySQL索引基础知识索引的工作原理索引就像书的目录,可以帮助MySQL快速定位数据,从而加速查询。索引类型MySQL支持多种索引类型:B树索引(B-Tree):最常见的索引类型,可以对值进行排......
  • 理解MySQL——索引与优化
    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页......
  • 智慧校园源码:vue2+Java+springboot+MySQL+elmentui+jpa+jwt
    智慧校园综合管理云平台源码系统主要以校园安全、智慧校园综合管理云平台为核心,以智慧班牌为学生智慧之窗,以移动管理平台、家校沟通为辅。教师—家长一学校—学生循环的无纸化管理模式及教学服务,实现多领域的信息互联互通以及校园管理一体化、信息数据化、数据自动化。智慧班牌融合......
  • 导入mysql 乱码问题及 Linux 中的文件格式转换
    问题下载了一个单词sql文件,导入mysql报错,查看文件类型:%fileenglish_word.sqlenglish_word.sql:Non-ISOextended-ASCIItext与另一个导入成功的文件对比,发现格式不一样:%fileenglish-root.sqlenglish-root.sql:UTF-8Unicodetext,withverylonglines,withnoli......
  • MySQL8压缩包安装教程
    解压缩包配置环境变量初始化mysqld--initialize-insecure安装服务mysqldinstallMySQL8移除服务mysqldremoveMySQL8启动服务netstartMySQL8修改密码切换数据库usemysql;修改root用户的密码alteruser'root'@localhostidentifiedby'mysql';刷新权限,一般......
  • liunx 环境 mysql5.6安装
    1安装包下载mysql5.6下载地址:http://dev.mysql.com/downloads/mysql/ 这里选择Linux版本:使用Navicat管理远程Linux服务器上的MySQL数据库 http://www.linuxidc.com/Linux/2011-09/42285.htm ftp://mirror.switch.ch/mirror/mysql/Downloads/MySQL-5.6/2mysql的安装从官网下载......
  • MySQL中动态SQL的解决方法:预处理语句
    动态SQL是一种很好的特性,允许开发人员在运行时动态构建和执行SQL语句。虽然MySQL缺乏对动态SQL的内置支持,但本文介绍了使用预处理语句(preparedstatements)的变通方法。将探讨如何利用预处理语句实现动态查询执行、参数化查询以及动态表和列查询。 了解预处理语句(preparedst......
  • docker 不适合MySQL
    近几年Docker非常的火热,各位开发者恨不得把所有的应用、软件都部署在Docker容器中,但是您确定也要把数据库也部署的容器中吗?这个问题不是子虚乌有,因为在网上能够找到很多各种操作手册和视频教程,这里整理了一些数据库不适合容器化的原因供大家参考,同时也希望大家在使用时能够谨慎一......