MySQL 5.7版本開始,增強密碼驗證機制,網上說安裝的時候會在/root/.mysql_secret 文件中生成默認密碼,這一點自 5.7.6版本以后也去掉了。
針對如果生成默認密碼,網上有一個版本,內容如下:
1、修改配置文件,一般在 /etc/my.cnf, 在[mysqld]字段下增加skip-grant-tables 字段,用以忽略權限驗證;
2、重啟MySQL服務器,CentOS 7.0操作命令是:
1
|
systemctl restart mysqld.service
|
3、使用mysql -u root -p 登錄數據, 密碼直接回車;
4、修改mysql數據庫(名稱),user表的authentication_string字段,修改命令如下:
1
2
3
|
mysql> update mysql.user set authentication_string=password( 'new_password' ) where user= 'root' and Host = 'localhost' ;
mysql> flush privileges;
mysql> quit;
|
5、修改配置文件,去掉skip-grant-tables,恢復成原來的樣子, 然后重新MySQL服務器。
6、使用第4步設置的密碼,登錄mysql服務器。
7、通過 set password=password('new_password'); 命令重新設置密碼;
以上的方法,在MySQL 5.7早期版本時,還是很好用的,但在MySQL 5.7.6以后的版本,最后一點重置密碼總是無法生效,會出來下面的錯誤。
1
|
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
|
同時,無法進行其它的操作。
這是因為,自MySQL 5.7開始,密碼存在有效期的概念, 同時因為安全等級的問題,需要使用使用其它的方式進行設置。另一個需要注意的點是, 自5.7.6開始廢棄了password()函數,同時無法設置old_password=1, 這真的是一件比較曲折的探索過程。
那么,先把MySQL 5.7.9版本以上的密碼設置方法整理一下。
大部分和上面整理的內容相同,關鍵在第4步后,把authentication_string 里寫入的值記一下(這是因為password()函數已廢棄)
通過使用以下命令,代替第7步的, set password=password('new_password') 方法。
1
2
3
4
|
mysql> ALTER USER 'jeffrey' @ 'localhost'
-> IDENTIFIED WITH mysql_native_password
-> AS 'authentication_string字段內容' ;
Query OK, 0 rows affected (0.01 sec)
|
其實上面的命令有一個簡化版本,命令如下
1
2
3
|
mysql> ALTER USER USER() IDENTIFIED BY 'news_password' ;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
|
之所以會出現上面的錯誤信息,這和密碼的安全等級相關,查看安全等級命令如下
1
2
3
4
5
6
7
8
9
10
11
|
mysql> SHOW VARIABLES LIKE 'validate_password%' ;
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
|
通過 SET GLOBAL validate_password_policy='LOW'; 命令,降低安全等級后,就可以直接使用,限制是必須8個字符以上;
關於安全等級更詳細的介紹如下
-
LOW
政策只測試密碼長度。 密碼必須至少有8個字符長。 -
MEDIUM
政策的條件 密碼必須包含至少1數字字符,1 大寫和小寫字符,和1特別 (nonalphanumeric)字符。 -
STRONG
政策的情況 密碼子字符串長度為4的或更長時間不能匹配 單詞在字典文件中,如果一個人被指定。
最后,為了解決密碼失效的問題, 最后在配置文件的[mysqld]字段下,增加以下字段
1
2
|
[mysqld]
default_password_lifetime=0
|
也可以通過命令行進行設置
1
|
ALTER USER 'script' @ 'localhost' PASSWORD EXPIRE NEVER
|
關於密碼有效期相關的更多信息,可以參考 http://dev.mysql.com/doc/refman/5.7/en/password-expiration-policy.html
好了,希望上面的信息能夠對大家所有幫助。