# mysql5.7密码过期处理过程
## 一:问题现象:
1.业务日志提示从库连接不上,报错
2.使用出错的数据库业务帐号登录从库服务器后执行show databases;命令提示
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
百度翻译后是密码过期的意思
3.使用root账户登录,发现没有此现象,所有命令都可以执行
## 二:解决过程:
1.使用密码过期的用户登录,然后输入修改密码的命令使密码更新
```
set password=password('新密码');
```
重新执行命令后发现恢复正常,业务日志不报错了
## 三:问题本质:
1.经查阅资料后发现,mysql-5.7控制密码的设置是由default_password_lifetime这个全局密码过期策略来控制的.
2.经查阅资料,在mysql-5.7.4 ~ mysql-5.7.10 这些版本中default_password_lifetime的默认值是360天,
3.mysql-5.7默认创建用户的时候会自动加上一条使用系统默认过期时间的选项,所以导致360天之后这个账号就过期了
## 四:相关命令:
1.查看mysql系统默认的全局过期策略设置
```
mysql> show global variables like 'default_password_lifetime';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 8061628
Current database: *** NONE ***
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| default_password_lifetime | 360 |
+---------------------------+-------+
1 row in set (0.00 sec)
```
2.查看创建用户的权限是否有过期策略,期中"PASSWORD EXPIRE DEFAULT"就是使用默认的密码过期策略.
```
mysql> show create user 'test123'@'192.168.47.%'\G
*************************** 1. row ***************************
CREATE USER for test123@192.168.5.%: CREATE USER 'test123'@'192.168.47.%' IDENTIFIED WITH 'mysql_native_password' AS '*1A9646511250C833E3195FB43F11BE9390FB97DE' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
1 row in set (0.00 sec)
```
## 五.修改方法:
1,修改用户的密码
```
set password=password('新密码')
```
2.修改系统默认的过期时间为永不过期
```
SET GLOBAL default_password_lifetime = 0;
```
3.创建用户的时候指定密码过期策略,这样就不使用系统的默认过期策略
```
ALTER USER 'test'@'localhost' PASSWORD EXPIRE NEVER; 密码不过期
```