今天在搞一mysql服務器時,看到–old-passwords選項,心中迷惑。特檢索了一些資料。並log之,以備遺忘!
–old-passwords選項的目的是當服務器生成長密碼哈希值時,允許你維持同4.1之前的客戶端的向后兼容性。該選項不影響鑒定(4.1和以后版本的客戶端仍然可以使用有長密碼哈希值的賬戶),但它防止在密碼更改操作中在user表中創建長密碼哈希值。在這種情況下,該賬戶不能再用於4.1之前的客戶端。沒有–old-passwords選項,可能會出現下面的不期望的情況:
· 舊客戶端連接有短密碼哈希值的賬戶。
· 客戶更改自己的密碼。沒有–old-passwords,可以為該賬戶生成長密碼哈希值。
· 下次舊客戶試圖連接賬戶時不能連接上,因為賬戶有長密碼哈希值,需要新的哈希機制進行鑒定。(一旦賬戶user表中為長密碼哈希值,只有4.1和以后版本的客戶端可以鑒定它,因為4.1之前的客戶端不理解長哈希)。
根據以上資料。我們可以來做一下測試。
mysql> show variables like ‘%password%’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| old_passwords | OFF | ####這里表明已經關閉了舊密碼選項
+—————+——-+
1 row in set (0.00 sec)
##測試一下密碼長度mysql> select password(’123456′),length(password(’123456′));
+——————————————-+—————————-+
| password(’123456′) | length(password(’123456′)) |
+——————————————-+—————————-+
| *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 41 |
+——————————————-+—————————-+
1 row in set (0.00 sec)
很明顯,這里是 41位的密碼。我們再打開舊密碼選項:
mysql> set old_passwords=on; ##這里僅對當前會話測試,若要全局,請在配置中設置或者加入全局聲明
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like ‘%password%’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| old_passwords | ON |
+—————+——-+
1 row in set (0.00 sec)
我們再次來測試pasword函數:
mysql> select password(’123456′),length(password(’123456′));
+——————–+—————————-+
| password(’123456′) | length(password(’123456′)) |
+——————–+—————————-+
| 565491d704013245 | 16 |
+——————–+—————————-+
1 row in set (0.00 sec)
可見,此時的password的長度變成了16位了。
綜上,在平時mysql管理中,如果不涉及到mysql.user表的話,一般不會出現密碼不匹配的情況。但是,若在升級或數據庫遷徙中,特別是對不同版本(4.1是分界點)全庫移植的
情況下,務必注意類似的細節問題。即:老版本如果打開了old_passwords選項的話,移植后的mysql也要打開old_password 或者對密碼rehash,生成新的hash密碼長度。並要確保user表password字段的長度(4.1以后版本已經是 41個字節了)