网易首页 > 网易号 > 正文 申请入驻

技术分享 | MySQL 用户密码过期那点事

0
分享至

作者:耿进
爱可生 DBA 团队成员,负责公司 DMP 产品的运维和客户 MySQL 问题的处理。对数据库技术有着浓厚的兴趣。你见过凌晨四点 MySQL 的 error 吗?
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
概述:

我们先来重新认识一下 mysql.user 表中关于密码过期的字段,

mysql> use mysql
Database changed
mysql> desc user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
。。。。
| password_expired | enum('N','Y') | NO | | N | |
| password_last_changed | timestamp | YES | | NULL | |
| password_lifetime | smallint(5) unsigned | YES | | NULL | |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
45 rows in set (0.01 sec)
mysql>

password_expired:从 MySQL 5.6.6 版本开始,添加了 password_expired 功能,它允许设置用户的过期时间。

password_last_changed:密码最后一次修改的时间。

password_lifetime:该用户密码的生存时间,默认值为 NULL,除非手动修改此用户密码过期机制,否则都是 NULL。

另外解释一个参数:

default_password_lifetime:从 MySQL 5.7.4 版本开始,此全局变量可以设置一个全局的自动密码过期策略。

测试:

一、password_expired:手动设置过期

1.设置密码永不过期

mysql> grant all on *.* to test@'localhost' identified by '123';
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> select User,password_last_changed,password_lifetime,password_expired from mysql.user;
+---------------+-----------------------+-------------------+------------------+
| User | password_last_changed | password_lifetime | password_expired |
+---------------+-----------------------+-------------------+------------------+
| root | 2021-03-31 14:11:10 | NULL | N |
| mysql.session | 2021-03-31 14:11:06 | NULL | N |
| mysql.sys | 2021-03-31 14:11:06 | NULL | N |
| root | 2021-03-31 14:11:10 | NULL | N |
| universe_op | 2021-03-31 14:11:10 | NULL | N |
| kobe | 2021-04-01 16:45:20 | NULL | N | |
| test | 2021-04-16 17:30:18 | NULL | N |
+---------------+-----------------------+-------------------+------------------+
7 rows in set (0.00 sec)
mysql> ALTER USER 'test'@'localhost' PASSWORD EXPIRE NEVER;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> select User,password_last_changed,password_lifetime,password_expired from mysql.user;
+---------------+-----------------------+-------------------+------------------+
| User | password_last_changed | password_lifetime | password_expired |
+---------------+-----------------------+-------------------+------------------+
| root | 2021-03-31 14:11:10 | NULL | N |
| mysql.session | 2021-03-31 14:11:06 | NULL | N |
| mysql.sys | 2021-03-31 14:11:06 | NULL | N |
| root | 2021-03-31 14:11:10 | NULL | N |
| universe_op | 2021-03-31 14:11:10 | NULL | N |
| kobe | 2021-04-01 16:45:20 | NULL | N | |
| test | 2021-04-16 17:30:18 | 0 | N |
+---------------+-----------------------+-------------------+------------------+
7 rows in set (0.00 sec)
mysql>
注:如果该参数设置为0,即表示密码永不过期。

2.手动设置该用户密码为 30 day(它会自动覆盖密码过期的全局策略)

mysql> ALTER USER 'test'@'localhost' PASSWORD EXPIRE INTERVAL 30 DAY;
Query OK, 0 rows affected (0.01 sec)
mysql> select User,password_last_changed,password_lifetime,password_expired from mysql.user;
+---------------+-----------------------+-------------------+------------------+
| User | password_last_changed | password_lifetime | password_expired |
+---------------+-----------------------+-------------------+------------------+
| root | 2021-03-31 14:11:10 | NULL | N |
| mysql.session | 2021-03-31 14:11:06 | NULL | N |
| mysql.sys | 2021-03-31 14:11:06 | NULL | N |
| root | 2021-03-31 14:11:10 | NULL | N |
| universe_op | 2021-03-31 14:11:10 | NULL | N |
| kobe | 2021-04-01 16:45:20 | NULL | N | |
| test | 2021-04-16 17:30:18 | 30 | N |
+---------------+-----------------------+-------------------+------------------+
7 rows in set (0.00 sec)
mysql>

3.设置密码立马过期

mysql> ALTER USER 'hhh'@'%' PASSWORD EXPIRE;
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> select User,password_last_changed,password_lifetime,password_expired from mysql.user;
+---------------+-----------------------+-------------------+------------------+
| User | password_last_changed | password_lifetime | password_expired |
+---------------+-----------------------+-------------------+------------------+
| root | 2021-03-31 14:11:10 | NULL | N |
| mysql.session | 2021-03-31 14:11:06 | NULL | N |
| mysql.sys | 2021-03-31 14:11:06 | NULL | N |
| root | 2021-03-31 14:11:10 | NULL | N |
| universe_op | 2021-03-31 14:11:10 | NULL | N |
| kobe | 2021-04-01 16:45:20 | NULL | N | |
| test | 2021-04-16 17:30:18 | 30 | Y |
| gengjin | 2021-04-16 17:42:33 | NULL | N |
| hhh | 2021-04-16 18:00:32 | NULL | Y |
| kkk | 2021-04-16 18:26:06 | NULL | N |
+---------------+-----------------------+-------------------+------------------+
10 rows in set (0.00 sec)
mysql> exit
Bye
[root@manage01 ~]# /opt/mysql/base/5.7.25/bin/mysql -uhhh -p -S /opt/mysql/data/3306/mysqld.sock
Logging to file '/mysqldata/mysql_3306/log/test.log'
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 39469
Server version: 5.7.25-log
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql>

二、default_password_lifetime:自动过期的机制

1.设置全局密码过期时间:

#配置文件
[mysqld]
default_password_lifetime=90
or
#命令行全局修改
mysql> SET GLOBAL default_password_lifetime = 90;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show variables like "default_password_lifetime";
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| default_password_lifetime | 90 |
+---------------------------+-------+
1 row in set (0.00 sec)
mysql>

2.创建用户:

mysql> grant all on *.* to hhh@'%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.04 sec)
mysql> select User,password_last_changed,password_lifetime,password_expired from mysql.user;
+---------------+-----------------------+-------------------+------------------+
| User | password_last_changed | password_lifetime | password_expired |
+---------------+-----------------------+-------------------+------------------+
| root | 2021-03-31 14:11:10 | NULL | N |
| mysql.session | 2021-03-31 14:11:06 | NULL | N |
| mysql.sys | 2021-03-31 14:11:06 | NULL | N |
| root | 2021-03-31 14:11:10 | NULL | N |
| universe_op | 2021-03-31 14:11:10 | NULL | N |
| kobe | 2021-04-01 16:45:20 | NULL | N | |
| test | 2021-04-16 17:30:18 | 30 | Y |
| gengjin | 2021-04-16 17:42:33 | NULL | N |
| hhh | 2021-04-16 18:00:32 | NULL | N |
+---------------+-----------------------+-------------------+------------------+
9 rows in set (0.00 sec)
mysql>

注:很多人一看这个 password_lifetime 为什么没有变,不应该变成 90 吗,是不是 mysql 的 bug,其实不然。

顺便贴一个这个“bug”的地址:
https://bugs.mysql.com/bug.php?id=89349

它的工作方式如下:

有一个全局系统变量 default_password_lifetime,它为使用默认密码生存期的所有帐户指定策略。在系统表中这将存储一个 NULL。NULL 值被用作一个标志,表明所涉及的帐户没有每个用户密码的特殊生存期。通过 ALTER USER password EXPIRE NEVER(将列设置为0)或 ALTER USER password EXPIRE INTERVAL N DAY(将列设置为 N)设置每个用户的特殊密码生存期。

因此,没有设置特定密码生存期的所有用户的所有密码生存期都将跟随全局变量的值。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
上海总和生育率仅0.6!低于韩国!全市600万育龄女性,仅376万女性生育孩子

上海总和生育率仅0.6!低于韩国!全市600万育龄女性,仅376万女性生育孩子

可达鸭面面观
2024-05-23 17:35:19
妻子欠下百万赌债后,年薪近百万的大厂员工受贿190万获刑三年十个月

妻子欠下百万赌债后,年薪近百万的大厂员工受贿190万获刑三年十个月

澎湃新闻
2024-05-23 22:44:27
杨丽萍裸体当观众面跳,身上每处可见,为艺术献身还是道德沦丧?

杨丽萍裸体当观众面跳,身上每处可见,为艺术献身还是道德沦丧?

小影的娱乐
2024-05-23 19:41:06
总局收视榜:《哈尔滨》垫底,《庆余年2》被碾压,第一当之无愧

总局收视榜:《哈尔滨》垫底,《庆余年2》被碾压,第一当之无愧

糊咖娱乐
2024-05-22 09:04:59
女星关晓彤,身高1米72,这双白嫩的长腿是真的漂亮!

女星关晓彤,身高1米72,这双白嫩的长腿是真的漂亮!

知秋侃史
2024-05-22 03:56:42
太火了!内地客激增12倍,香港一银行出大招:人民币存款18.1%

太火了!内地客激增12倍,香港一银行出大招:人民币存款18.1%

我不叫阿哏
2024-05-23 16:33:00
纽约时报爆猛料:马斯克与谷歌创始人前妻一起吸毒并发生性关系

纽约时报爆猛料:马斯克与谷歌创始人前妻一起吸毒并发生性关系

手机中国
2024-05-23 10:02:11
一个县城的供热“争夺战”:投资过亿,30年特许经营权5年被收回,非法抢夺还是合法接管

一个县城的供热“争夺战”:投资过亿,30年特许经营权5年被收回,非法抢夺还是合法接管

红星新闻
2024-05-23 20:45:41
赖清德就职演讲口出狂言,大陆围台军演,怕不怕?

赖清德就职演讲口出狂言,大陆围台军演,怕不怕?

雨秋闲话
2024-05-23 16:10:28
伊朗总统座机失事后,飞行员的电话为何接通?

伊朗总统座机失事后,飞行员的电话为何接通?

中国新闻周刊
2024-05-23 19:04:10
管姚:解放军惩戒“台独”强信号,全球媒体充分接收到了

管姚:解放军惩戒“台独”强信号,全球媒体充分接收到了

直新闻
2024-05-23 22:31:00
香港大学这几百内地生惨了,几百万打水漂还可能面临最高刑罚14年的监禁,伙同黑中介学历造假最终害人害己!

香港大学这几百内地生惨了,几百万打水漂还可能面临最高刑罚14年的监禁,伙同黑中介学历造假最终害人害己!

澳门月刊
2024-05-23 07:44:26
离谱!老人未消费在星巴克休息,嫌吵闹怒砸星巴克,商家回应

离谱!老人未消费在星巴克休息,嫌吵闹怒砸星巴克,商家回应

看晓天下事
2024-05-23 15:41:14
网友:某985院校研究生60人,31个没找到工作!不少公司还毁约…

网友:某985院校研究生60人,31个没找到工作!不少公司还毁约…

火山诗话
2024-05-23 11:43:58
解放军发布《越海杀器》组合海报 暗含细节预示“台独”咎由自取的惨烈下场

解放军发布《越海杀器》组合海报 暗含细节预示“台独”咎由自取的惨烈下场

环球时报国际
2024-05-23 21:31:23
省委书记首次以新身份主持重要会议

省委书记首次以新身份主持重要会议

政知新媒体
2024-05-23 22:23:01
央妈打出王炸组合拳,新闻联播播放三分钟,比降息都还要炸裂!

央妈打出王炸组合拳,新闻联播播放三分钟,比降息都还要炸裂!

静守时光落日
2024-05-23 14:18:39
“奇技淫巧”四个字又出来了

“奇技淫巧”四个字又出来了

报人刘亚东
2024-05-23 16:29:02
姑娘以后别穿这么紧的裤子上街了,走在你身后都不知道往哪看,太尴尬了哈哈哈

姑娘以后别穿这么紧的裤子上街了,走在你身后都不知道往哪看,太尴尬了哈哈哈

匹夫来搞笑
2024-04-28 07:50:20
巴萨新时代降临:弗里克同意执教,将签约2年!哈维下课在即!

巴萨新时代降临:弗里克同意执教,将签约2年!哈维下课在即!

风过乡
2024-05-23 20:19:57
2024-05-23 23:12:49
爱可生云数据库
爱可生云数据库
企业数据处理技术整体解决方案
411文章数 20关注度
往期回顾 全部

科技要闻

黄仁勋业绩会万字实录:我们的压力太大了

头条要闻

岷县供热"争夺战":投资3亿多 30年经营权5年被收回

头条要闻

岷县供热"争夺战":投资3亿多 30年经营权5年被收回

体育要闻

欧文,三十二而立

娱乐要闻

大S儿子被学校退学,张兰称孙子没人管

财经要闻

九鼎金租减值罗生门:郑州银行藏雷?

汽车要闻

上汽大通大家7超混/大家9超混将于6月7日正式上市

态度原创

艺术
本地
教育
手机
军事航空

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

本地新闻

强制措施展铁腕 “交叉执行”勇亮剑

教育要闻

龙翔学校,请解释学生被霸凌的原因,为何9天才发现

手机要闻

关注用户身心 iPhone和iPad未来或配备用户压力检测功能

军事要闻

以军继续杰宁攻势 巴武装组织打击以目标

无障碍浏览 进入关怀版