【问题标题】:MySQL: ERROR 2027 (HY000): Malformed packetMySQL:错误 2027 (HY000):格式错误的数据包
【发布时间】: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 在哪个端口上工作您是否更改了标准端口号

标签: mysql tcp


【解决方案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;
        

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

        【讨论】:

        【解决方案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。它奏效了。 :)

            【讨论】:

              猜你喜欢
              • 2018-11-18
              • 2021-02-17
              • 2021-05-27
              • 2021-02-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多