MYSQL ERROR 2049: 一個mysql connection異常處理

來源:互聯網
上載者:User

問題描述

最近在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服務後生效

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.