I was surprised to find on one of my websites the message “Connect failed: Your password has expired. To log in you must change it using a client that supports expired passwords.
Not knowing that I was using a MySQL password expiry policy I reviewed the 5.7 documentation quickly which *clearly* states “The default default_password_lifetime value is 0, which disables automatic password expiration.”.
I then proceeded to investigate further, my steps are below the following comment.
However, it is always important with MySQL documentation and a new feature (in this case a 5.7 feature) to review release notes when installing versions or to least read ALL the documentation, because you may miss important information, such as.
Note:
From MySQL 5.7.4 to 5.7.10, the default default_password_lifetime value is 360 (passwords must be changed approximately once per year). For those versions, be aware that, if you make no changes to the default_password_lifetime variable or to individual user accounts, all user passwords will expire after 360 days, and all user accounts will start running in restricted mode when this happens. Clients…
I would encourage you to view the MySQL password expiry policy to see the full note. I have only include the intro here are a teaser, because you need to read the entire note.
Analysis
Back to impatient analysis steps.
$ mysql -u admin -p ********* SELECT VERSION(); +-----------+ | VERSION() | +-----------+ | 5.7.9-log | +-----------+ SHOW GLOBAL VARIABLES LIKE 'default_p%'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | default_password_lifetime | 360 | +---------------------------+-------+ SELECT host,user,password_last_changed FROM mysql.user WHERE password_last_changed + INTERVAL @@default_password_lifetime DAY < CURDATE(); +-----------+--------------+-----------------------+ | host | user | password_last_changed | +-----------+--------------+-----------------------+ | localhost | XXX | 2014-12-01 12:53:36 | | localhost | XXXXX | 2014-12-01 12:54:04 | | localhost | XX_XXXX | 2015-06-04 11:01:11 | +-----------+--------------+-----------------------+
Indeed there are some passwords that have expired.
After finding the applicable application credentials I looked at verifying the problem.
$ mysql -uXX_XXXX -p ******************* Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Server version: 5.7.9-log mysql>
Interesting, there was no error to make a client connection, however.
mysql> use XXXX; ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
I then proceeded to change the password with the applicable hint shown.
ALTER USER XX_XXXX@localhost IDENTIFIED BY '*************************';
I chose to reuse the same password because changing the password would require a subsequent code change. MySQL accepted the same password. (A topic for a separate discussion on this point).
A manual verification showed the application and users operating as it should be, so immediate loss of data was averted. Monitoring of the sites home page however did not detect this problem of a partial page error, so should a password expiry policy be used, an applicable check in a regularly scheduled operational task is a good feature request.
All of this could have been avoided if my analysis started with reading the documentation and the note (partly shown above) which has an alternative and potentially more practical immediate solution.
In a firefighting operational mode it can be a priority to correct the problem, however more detailed analysis is prudent to maintain a "Being proactive rather than reactive" mindset. Being a Friday, I feel the old saying "There is more than one way to skin a cat" is applicable.
I am also more familiar with the SET PASSWORD syntax, so reviewing this 5.7 manual page is also a good read to determine what specific syntax is now deprecated and what "ALTER USER is now the preferred statement for assigning passwords" also.