MYSQL ERROR 2049: 一个mysql connection异常处理

问题描述

最近在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服务后生效

时间: 2024-09-23 00:19:46

MYSQL ERROR 2049: 一个mysql connection异常处理的相关文章

mysql 旧密码错误 Error: 2049 (CR_SECURE_AUTH)

错误提示如下 Error: 2049 (CR_SECURE_AUTH) Message: Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) 错误:2049 (CR_SECURE_AUTH) 消息:拒绝使用旧密码加密(早于4.1.1)的连接请求(服务器开启了客户端'secure_auth'选项对于使用16位密码加密的账户禁止链接). 解决办法参

MySQL启动错误Starting MySQL.Manager of pid-file quit without updating file.[FAILED]

上午刚装完MySQL,启动时报如下错误: Starting MySQL.Manager of pid-file quit without updating file.[FAILED] 依次尝试了从谷姐找到的各种方法,发现只要执行如下MySQL初始化命令即可解决: /usr/local/mysql/bin/mysql_install_db --user=mysql 下面附上从谷姐找到的解决此问题的方法集锦,也许每个人遇到的问题的原因会不一样,经供参考: 一.查看报错日志 报错日志是我们解决问题的方

ERROR 2013 (HY000): Lost connection to MySQL server at 'waiting for initial communication packet', system error: 2

ERROR 2013 (HY000): Lost connection to MySQL server at 'waiting for initial communication packet', system error: 2 在/etc/my.cnf[mysqld]中加skip-name-resolve  

ERROR 2049 (HY000): Connection using old (pre-4.1.1)

    测试环境新装了MySQL服务器,在登陆时无法成功登陆.其提示为使用的旧的认证协议而被拒绝.其具体的错误提示为ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)以下是关于这个问题的描述及其解决方案,供大家参考.   1.故障现象[root@HKBO ~]# mysqladmin -u root pa

MySQL存储过程中一些基本的异常处理教程_Mysql

有时候,不希望存储过程抛出错误中止执行,而是希望返回一个错误码. Mysql 支持异常处理,通过定义 CONTINUE/EXIT 异常处理的 HANDLER 来捕获 SQLWARNING/NOT FOUND/SQLEXCEPTION (警告 / 无数据 / 其他异常).其中, FOR 后面可以改为 SQLWARNING, NOT FOUND, SQLEXCEPTION 来指示所有异常都处理,相当于 oracle 中的 others .例如,当不进行异常处理时,以下代码将直接抛出一个 ERROR

mysql ERROR 1044 (42000): Access denied for user ''@'localhost' to database_Mysql

1. 问题描述: 在MySQL控制台下创建数据库出现以下信息: mysql> CREATE DATABASE python; ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'python' 2. 解决方法: 执行以下命令进入控制台: mysql --user=root -p 输入root用户的密码即可进入mysql控制台: 创建数据库: create database python; 显示所有数据库:

Starting MySQL... ERROR! The server quit without updating PID file (/mydata/data/t1.pid).

测试环境: mysql 5.6.25 (适用5.1.73 5.1.65) 1 vim /etc/my.cnf pid-file=/mypid/t1.pid 今天在备份的时候,我测试把mysql-log.index删除之后报错如下: [root@t1 data]# /etc/init.d/mysqld start Starting MySQL... ERROR! The server quit without updating PID file (/mydata/data/t1.pid). 2 .

mysql error 1130 hy000:Host'localhost'解决方案_Mysql

ERROR 1130 (HY000): Host 'localhost' is not allowed to connect to this MySQL server www.jb51.net 出现原因: mysql只有一个root用户,修改root密码后选了MD5,提交后,重新 登陆出现"Host 'localhost' is not allowed to connect to this MySQL server..." 尝试另一个mysql库中的user表,覆盖,不行,估计是版本不

新建一个MySQL数据库的简单教程_Mysql

 使用mysqladmin创建数据库: 需要特殊的权限才能创建或删除一个MySQL数据库.因此,假设以root用户的访问,可以创建任何数据库使用mysql mysqladmin的二进制. 例子: 这里是一个简单的例子来创建数据库名为 TUTORIALS: [root@host]# mysqladmin -u root -p create TUTORIALS Enter password:****** 这将创建一个数据库:TUTORIALS.使用PHP脚本创建数据库: PHP使用mysql_que