問題描述
最近在Mac上開發一個腳本,使用MySQLdb模塊。但是會拋出一個異常信息,如下面的堆棧信息。這個異常信息之前也碰到過,使用mysql client連接數據庫,會有同樣的問題。之前我是加上 –skip-secure-auth 繞開這個問題。但是現在使用mysqldb,發現沒有地方可以加上這個參數。
Traceback (most recent call last):
File "/Users/metaboy/script/TaskExecutor/tests.py", line 20, in test_something
task = TaskExecutor.get_data(get_one_waiting_task)
File "/Users/metaboy/script/TaskExecutor/TaskExecutor.py", line 72, in get_data
conn = MySQLdb.connect(host=‘localhost', user='root', passwd='root', db='athena', charset='utf8')
File "/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
File "/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/MySQLdb/connections.py", line 187, in __init__
super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (2049, "Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)")
問題分析
既然無法繞開,只能想辦法解決這個問題。google一把之後,發現這個問題根本原因是因為服務端和客戶端的密碼協議不一致導致。
我mysql服務端使用的版本是5.5,新建的用戶是采用老的協議,密碼加密後的格式如下,8位:
mysql> select User,Password,Host from mysql.user where user = 'root';
+------+------------------+-----------+
| User | Password | Host |
+------+------------------+-----------+
| root | 67457e226a1a15bd | % |
| root | 67457e226a1a15bd | 127.0.0.1 |
| root | 67457e226a1a15bd | localhost |
+------+------------------+-----------+
3 rows in set (0.02 sec)
而Mac客戶端上使用的mysql client是5.6, 需要使用的是新的加密密碼。這直接導致客戶端和服務端的密碼協議不一致。最簡單直接的辦法就是升級服務端的密碼協議。
在未升級之前,通過–skip-secure-auth登錄進去,輸入下面的命令會得到相應的提示。官方建議應該也是升級加密協議。
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Warning
Code: 1287
Message: 'pre-4.1 password hash' is deprecated and will be
removed in a future release. Please use post-4.1 password hash instead
1 row in set (0.02 sec)
解決方案
假設,我現在只想針對root賬戶的密碼進行升級。操作如下:
mysql> update mysql.user set password= PASSWORD("root") where user = 'root';
Query OK, 3 rows affected (0.03 sec)
Rows matched: 3 Changed: 3 Warnings: 0
檢查現在加密後的密碼格式:以 *開頭,長度為16位。
mysql> select User,Password,Host from mysql.user where user = 'root';
+------+-------------------------------------------+-----------+
| User | Password | Host |
+------+-------------------------------------------+-----------+
| root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | % |
| root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | 127.0.0.1 |
| root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | localhost |
+------+-------------------------------------------+-----------+
3 rows in set (0.01 sec)
重啟Mysql服務後生效