MySQL:ERROR 2027(HY000):格式错误的数据包

时间:2017-08-12 19:19:53

标签: mysql tcp

我无法远程连接MySQL服务器。 连接似乎没问题因为使用telnet [ip] [port]我得到了回复:

 4.1.3b-beta-nt-max▒ <0v '[uZ,? B {efSLa $, Q4N 

由命令行或MySQL Workbench 6.3执行时

 mysql -u [user] -p -h [host] 

我得到同样的错误:
ERROR 2027(HY000):格式错误的数据包

8 个答案:

答案 0 :(得分:6)

这是一个mysql客户端错误,我已经搜索过它,这是一个旧的auth切换请求。您的客户端已经过时,使用旧的协议通信,现在,如果它只是客户端的Workbench问题,您需要先更新或降级MySQL客户端并尝试单独运行它。

这里有一个更完整的答案是同一个问题: https://dba.stackexchange.com/questions/135343/server-responds-with-empty-packet-during-session-negotiation-resulting-in-client

并且,对于新的Auth协议,在连接阶段: https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html

答案 1 :(得分:4)

您必须升级“old_password”哈希密码:

SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('existingpass');

因此,您可以使用最新的Workbench版本登录“旧”MySQL服务器

答案 2 :(得分:2)

如果您需要从以后的MySQL版本(5.7+)连接到4.1之前的MySQL服务器,则需要使用客户端的“--skip-secure-auth”选项。客户端版本不能比v5.7.4更新,因为此选项已在5.7.5中删除。您可以从mysql的存档网站下载5.7.4_m14版本。例如,

$ mysql -uuser -p -hserver --skip-secure-auth

答案 3 :(得分:1)

尝试使用MySQL客户端mysql-client连接到MariaDB服务器时遇到了同样的错误。我通过安装mariadb-client(覆盖mysql二进制文件来解决它,所以使用相同的命令进行连接)。

答案 4 :(得分:0)

对于普通的选择查询,我确实遇到了这个问题。奇怪的是,当我在查询语句中使用小写字母's'时,它给了我同样的错误。我发现这是在内部尝试从mysql缓存中检索数据时发生的。 这不是因为select查询中出现“ s”的情况。

//Returned Error
select * from foo;

//This worked fine
Select * from foo;

//This also worked fine
select SQL_NO_CACHE * from foo;

由此我可以得出结论,这就是使用缓存数据时的问题。

答案 5 :(得分:0)

对于在执行查询时(而不是在连接到DB时)出现此错误的人,问题在于数据库中的缓存配置。

您可以在此处找到错误说明:

https://bugs.mysql.com/bug.php?id=86318

解决方案:

禁用缓存配置:

query_cache_limit = 0
query_cache_size = 0
query_cache_type = 0

从长远来看,不会有负面影响,因为最新版本的MySQL不再支持此功能。缓存中的数据很少,但是可以正常工作,但是会产生瓶颈。

有关从mysql 8.0删除的缓存的更多信息:

https://mysqlserverteam.com/mysql-8-0-retiring-support-for-the-query-cache/

答案 6 :(得分:0)

在尝试连接较低版本的MySQL(如5.1.xx)时,我遇到了与最新的MySQL客户端(> 5.7)相同的问题。

为避免此问题(错误2027(HY000):格式错误的数据包),请创建一个具有最新密码身份验证的用户。

例如: 登录到MySQL 5.1.xx服务器并执行。

mysql> create user 'testuser'@'xx.xx.xxx.%' identified by 'testuser_Secret1';

检查是否启用了old_passwords,然后在该会话中将其禁用。

mysql> show session variables like 'old_passwords';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| old_passwords   | ON    |
+-----------------+-------+
mysql> set session old_passwords = 0;
mysql> GRANT select on test.* TO 'testuser'@'xx.xx.xxx.%' identified by 'testuser_Secret1';

验证应以“ * SOMETHING1123SHOWNBELOW3034”开头的密码。

mysql> select user,host,password from mysql.user where user = 'testuser';

+-----------+---------------+-------------------------------------------+
| user      | host          | password                                  |
+-----------+---------------+-------------------------------------------+
| testuser  | xx.xx.xxx.%   | *053CB27FDD2AE63F03D4A0B919E471E0E88DA262 |
+-----------+---------------+-------------------------------------------+

现在尝试从MySQL 5.7.xx客户端登录并尝试建立与MySQL 5.1.xx服务器的连接。

[testuser@localhost]# mysql -V 
mysql  Ver 14.14 Distrib 5.7.31, for Linux (x86_64) using  EditLine wrapper

[testuser@localhost]# mysql -hxx.xx.xxx.xxx -u testuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1528853
Server version: 5.1.73-log Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

答案 7 :(得分:0)

我解决了这个问题。我在我的PHP 7.2中面临这个问题。首先,我创建了一个新用户,并在脚本中对其进行了升级。然后,我将PHP 7.2升级到7.3。而且有效。 :)