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

Posted

技术标签:

【中文标题】MySQL:错误 2027 (HY000):格式错误的数据包【英文标题】:MySQL: ERROR 2027 (HY000): Malformed packet 【发布时间】:2018-01-21 02:01:28 【问题描述】:

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

 4.1.3b-beta-nt-max▒ 

当通过命令行或 MySQL Workbench 6.3 执行时

 mysql -u [用户] -p -h [主机] 

我得到同样的错误:ERROR 2027 (HY000): Malformed packet

【问题讨论】:

根据文档:MySQL Workbench ... It does not support MySQL server versions 4.x.,见Chapter 1 General Information。您使用什么版本的 MySQL Client 来尝试连接 MySQL Server 4.1.3?。 @edvaldosilva 就像 wchiquito 提到的一样。这似乎是旧版本中的 MySQL 错误。您使用哪个版本?您是否通过终端尝试过,您的 mysql 在哪个端口上工作您是否更改了标准端口号 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

谢谢!这个解决了我在 MySQL Workbench 中遇到的“格式错误的数据包”错误 对我来说,在 MySQL 5.1 服务器上执行此操作时,PASSWORD('existingpass'); 仍然会生成错误的哈希格式。所以我不得不在更新的 MySQL 服务器上生成密码哈希:SELECT PASSWORD('existingpass');【参考方案3】:

如果您需要从更高版本的 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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

//Returned Error
select * from foo;

//This worked fine
Select * from foo;

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

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

【讨论】:

+1 表示查询缓存可能是导致该特定错误的原因。然而,MySQL 方面的错误是“wontfix”:bugs.mysql.com/bug.php?id=86318【参考方案6】:

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

为避免此问题(ERROR 2027 (HY000): Malformed packet),请使用最新密码验证创建用户。

例如: 登录 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】:

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

您可以在此处找到错误描述:

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/

【讨论】:

【参考方案8】:

我解决了这个问题。我在我的 PHP 7.2 中遇到了这个问题。首先,我创建了一个新用户并在我的脚本中升级它。然后我将 PHP 7.2 升级到 7.3。它奏效了。 :)

【讨论】:

以上是关于MySQL:错误 2027 (HY000):格式错误的数据包的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“错误 130 (HY000):文件格式不正确”

如何修复“ERROR 130 (HY000):文件格式不正确”

ERROR 1819 (HY000): Unknown error 1819

MySQL 跨版本主从复制时报错:ERROR 1794 (HY000): Slave is not configured or failed to initialize properly.

mysql连接报错 ERROR 2002 (HY000): Can't connect to local MySQL server through socket

MySQL报错ERROR1872(HY000):Slave failed to initialize