【问题标题】:SQLSTATE[HY000]: General error: 1835 Malformed communication packet on LARAVELSQLSTATE [HY000]:一般错误:1835 LARAVEL 上的通信数据包格式错误
【发布时间】:2021-02-17 00:22:51
【问题描述】:

突然得到

SQLSTATE[HY000]: 一般错误: 1835 Malformed communication packet (SQL: select * from tb_users where (username = 121211) limit 1)

在 Laravel 上。

我已经检查过这个:MySQL: ERROR 2027 (HY000): Malformed packet,但情况似乎不同。

  1. 之前使用 SSH 登录(使用:mysql -u -p)后,我已成功登录 MySQL。
  2. 我已成功从远程 PC 直接登录 MySQL(使用:mysql -h [IP] -u -p)。

但是我的 Laravel 遇到了我之前提到的错误。有这方面的经验吗?

【问题讨论】:

  • 更新你的客户端和库,好像有些过时了?您在服务器和客户端上使用什么版本?
  • @CraigJacobs 我也认为 MariaDB,但 OP 没有共享任何版本信息。有人可以尝试在他们的 JIRA 上打开问题吗,我不会在 github 之外打开错误票。
  • 我也遇到了 MariaDB 10.3 版的问题。今天早上醒来。下面的解决方法将响应中的整数更改为字符串。这不是一个解决方案。
  • 附加信息:从 PHP 7.2 切换到 PHP 7.3 似乎可以缓解我服务器上的错误。但是,此更改可能会引入其他问题。
  • 确认,这是昨天发布的以下所有 MariaDB 版本中的一个错误:10.1.48、10.2.35、10.3.26、10.4.16、10.5.7 已开立一个案例: jira.mariadb.org/browse/MDEV-24121 和我提供了一个可重现的 POC。当 Emulate Prepares 设置为 false(在 Laravel 中默认设置)并且 PDO::ERRMODE_EXCEPTION 设置在一起时,会出现此问题。 (在 Laravel 中也是默认设置) - 正确的解决方法是回滚并锁定以前的版本,直到修复发布。

标签: mysql laravel mariadb mariadb-10.3


【解决方案1】:

如果您的查询没有与您传入的参数数组相同数量的输入参数,则可能会发生这种情况。这是我在 NodeJS + MYSQL 中使用的导致此问题的代码:

const config = getMysqlConfig();

let arguments = [arg1, arg2];
const connection = await mysql.createConnection(config.db);

const result = await connection.execute('INSERT INTO mySchema.myTable(val1, val2) VALUES (?,?) ON DUPLICATE KEY UPDATE val1= val1+ ?', arguments)
.catch((err) => LogError(err));
connection.end(); 

因为我在 arguments 中只有 2 个值,但我的查询需要 3 个参数,所以抛出了 malformed communication 错误。对我来说,解决方案就是在数组中添加我的附加参数

let arguments = [arg1, arg2, arg3];

【讨论】:

    【解决方案2】:

    简单的解决方案只需将您​​的 PHP 更新到 7.3 在 Laravel 和 WP 中为我工作

    【讨论】:

      【解决方案3】:

      Mariadb 有一个 php 7.2 的更新来修复这个问题,只需更新服务器:

      sudo apt update
      sudo apt upgrade
      

      【讨论】:

        【解决方案4】:

        MariaDB 刚刚发布了一个升级,解决了那些无法在 PHP >= 7.3 上运行应用程序的问题,来源:https://mariadb.org/mariadb-10-5-8-10-4-17-10-3-27-and-10-2-36-now-available/

        【讨论】:

          【解决方案5】:

          一个emergency Release of MariaDB 10.5.8, 10.4.17, 10.3.27, and 10.2.36 is now available,专门解决旧 PHP 版本和 PDO 中的此协议不兼容问题。

          【讨论】:

          • 大多数偶然发现此问题的人可以简单地运行“yum update”或“apt-get update”
          【解决方案6】:

          突然错误消息是由 MariaDB 客户端升级引起的,它似乎与php-mysqlnd 的 PHP 7.2 版本不兼容;版本10.2.35 打破了它,但版本10.2.34 仍然有效。使用yumdnf 可以轻松恢复到以前的版本,例如。与:

          su
          yum history
          yum history undo 440
          

          /etc/yum.repo.d/mariadb.repo 中临时设置enabled=0 也可能有意义。
          升级到PHP 7.3 可能仍然是更好的选择(如果可用)。

          【讨论】:

            【解决方案7】:

            对我有用的是将子域上的 PHP 版本从 7.2 升级到 7.3。正如一些答案中所建议的那样,我没有更改数据库配置中的任何内容。

            【讨论】:

              【解决方案8】:

              在我的子域的 cpanel 中更新了 php 版本**(7.2 到 7.3)**。

              必须将所有特权授予选定的数据库用户。

              它对我有用。

              【讨论】:

                【解决方案9】:

                我使用的是 Ubuntu 20(焦点),请注意我的存储库,您需要根据您使用的是 16(xenial)、18(仿生)还是其他方式来更改它

                我不喜欢 Laravel 中的选项修复,因为它可能会损坏数据,而且我无法在没有大量工作的情况下将 PHP 升级到 7.2+,所以我降级了一个版本。

                不推荐从 10.3.26 -> 10.3.25 不从转储中恢复所有数据,但我别无选择,似乎没有发生任何不好的事情。

                # stop the database
                
                service mariadb stop
                
                # list packages installed
                
                dpkg -l | grep mariadb 
                
                # remove whatever you have or the install will complain about dependencies or broken packages, you need to remove all the mariadb packages
                
                apt remove mariadb-server-core-10.3 
                apt remove mariadb-server-10.3
                apt remove mariadb-server-10.2
                apt remove mariadb-server-10.1
                
                # pin the repo to v10.3.25, remember to remove any conflicting sources you have in /etc/apt/sources.list
                
                apt-get install software-properties-common
                apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
                add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://archive.mariadb.org/mariadb-10.3.25/repo/ubuntu/ focal main'
                
                # install the old version
                
                apt install mariadb-server
                
                # start it back up
                
                service mariadb start
                

                【讨论】:

                  【解决方案10】:

                  升级 php 7.2 到 php7.4 对我来说是最好的方式。

                  ` sudo add-apt-repository ppa:ondrej/php

                  sudo apt 更新

                  sudo apt install php7.4-fpm php7.4-common php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4- cli php7.4-dev php7.4-imap php7.4-mbstring php7.4-soap php7.4-zip php7.4-bcmath -y

                  sudo a2enmod proxy_fcgi setenvif

                  sudo a2enconf php7.4-fpm

                  sudo systemctl 重新加载 apache2

                  sudo systemctl status php7.4-fpm `

                  固定

                  【讨论】:

                    【解决方案11】:

                    官方修复已完成,您可以在链接中找到详细信息:
                    https://support.cpanel.net/hc/en-us/articles/360056772334/comments/360005577354


                    要快速修复它,只需通过 SSH 连接并运行

                    sudo /scripts/autorepair fix_mariadb_show_grants_roles
                    

                    适用于已应用之前涉及降级 MariaDB 的解决方法的用户。请务必解锁 MariaDB 以确保它继续接收适当的更新:

                    yum versionlock clear
                    /scripts/upcp
                    

                    【讨论】:

                    • 请注意,对于升级后的以前的 MySQL-5.7 数据目录,这是一个略有不同的问题。 It will be fixed 在下一个版本中,但是它还没有准备好包含在紧急版本中。
                    【解决方案12】:

                    在昨天将 MariaDB 更新到 v10.3.26(和 10.2.35)之后,最近的 MariaDB 更新后,很多人开始出现此问题。此问题已在此处解决:https://jira.mariadb.org/browse/MDEV-24121

                    到目前为止,只有以下已知解决方案:

                    1.将您的 PHP 升级到 7.3: 这些错误似乎显示在使用 php

                    缺点:不是很多应用程序都可以像这样轻松升级到 php 7.3。有时您可能需要更新您的平台、重写一些代码或检查所有依赖项,看看它们是否都适用于 7.3。对于许多成熟的应用程序来说,这可能不是一个快速解决方案。

                    2。降级 MariaDB: 这是一个临时修复,因为降级 MariaDB 会将其设置回之前的状态。

                    缺点:通过单击 cpanel 中的按钮来降级 MariaDB 并不是一件容易的事。您可能需要网络工程师的帮助才能为您进行降级。之后,您可能还需要对 MariaDB 包进行 yum 锁定,以避免在修补之前对其进行更新。

                    3.将'options' => [PDO::ATTR_EMULATE_PREPARES => true] 添加到数据库配置:这已在一些答案中提出,这可能会解决 1 个问题,但会引发许多其他问题。

                    缺点: 将上述内容添加到数据库配置文件为我解决了 1 个问题,但它也打开了很多其他失败的查询、失败的数据库插入等。所以我会根本不推荐这个修复。

                    4.等待 MariaDB 更新:下一次更新应该会解决这个问题。

                    缺点:我们不知道需要多长时间才能获得修复旧版本 PHP 问题的更新。甚至可能需要几天时间,并且某些应用程序可能无法等待那么久。

                    总而言之,这些是我目前能看到的唯一选项。只是希望能尽快修复它。

                    短期修复:总之,考虑到我的应用程序需要大量工作才能为 php 7.3 做好准备,降级 MariaDB 似乎是唯一简单(排序)的临时修复。我将 MariaDB 降级到 10.2.34 并锁定它,错误不再出现。

                    长期修复:最好最终让您的应用程序为 php 7.3 做好准备并升级到该版本,这样 MariaDB 较新版本也不会抱怨。

                    【讨论】:

                    • 更新:我将 MariaDB 降级到 10.2.34 并锁定它,错误不再出现。
                    • 如果你在 debian 9 上使用 mariadb 10.2,你可以使用sudo apt install mariadb-server-core-10.2=10.2.34+maria~stretch mariadb-server-10.2=10.2.34+maria~stretch mariadb-server=10.2.34+maria~stretch(我必须在设置时重新输入 root 密钥,不用担心数据还在。)跨度>
                    【解决方案13】:

                    经过许多变通办法,我今天尝试了这个我得到的解决方案

                    1- 升级到 php 7.3 或 7.4
                    (php升级后很多网站会宕机)

                    2- 降级到次要版本(mariadb 10.4.16 到 10.4.15)

                    yum downgrade MariaDB-server MariaDB-common MariaDB-shared MariaDB-client MariaDB-compat MariaDB-devel    
                    

                    无论如何,这个问题是作为 Mariadb 昨晚更新的错误打开的,他们现在没有推动任何修复 上述解决方案只是解决问题的 2 种方法,它适用于我的 mariadb 从 10.4.16 降级到 10.4.15(小降级)

                    【讨论】:

                      【解决方案14】:

                      我所有运行 PHP 7.2 的 Laravel 应用程序都有此错误,但运行在 PHP 7.3 上的应用程序没有。于是我把PHP版本改成了7.3,问题就解决了。 (运行 Laravel 7)

                      【讨论】:

                      • 是的,适合初学者:cPanel -> "Logiciel" -> "Gestionnaire MultiPHP"。在右侧下拉菜单中选择“PHP 7.3。检查您的域并单击以应用。更新是即时的
                      • 我将我的 php 升级到 7.3,但仍然遇到同样的问题,但我的项目仍在 5.4 上
                      【解决方案15】:

                      mariadb 一夜更新后也遇到了这个问题。降级 mariadb 为我解决了这个问题。

                      https://support.cpanel.net/hc/en-us/articles/360056772334

                      【讨论】:

                      • 不是最好的解决方案,因为降级会带来一些在升级中修复的故障或安全增强功能 :) 最好将 PHP 升级到 PHP7.3 :-)
                      • Cpanel 更新了他们的文章,不再包含降级的步骤,你有你采取的降级步骤吗?
                      • @JossBird 这应该可以降级。 yum downgrade MariaDB-server MariaDB-common MariaDB-shared MariaDB-client MariaDB-compat MariaDB-devel。不过,我建议在降级之前备份所有内容。
                      • Different issue ALTER TABLE mysql.users DROP COLUMN IF EXISTS password_lifetime, DROP COLUMN IF EXISTS password_last_changed, DROP COLUMN IF EXISTS account_locked; FLUSH PRIVILEGES; 将在 MariaDB-10.1、10.2 和 10.3 上更正。 10.4+ 不会出现这个问题。
                      【解决方案16】:

                      找到了解决办法。不知道是永久的还是临时的:

                      'mysql' => [
                                  'driver' => 'mysql',
                                  'host' => env('DB_HOST', '127.0.0.1'),
                                  'port' => env('DB_PORT', '3306'),
                                  'database' => env('DB_DATABASE', 'forge'),
                                  'username' => env('DB_USERNAME', 'forge'),
                                  'password' => env('DB_PASSWORD', ''),
                                  'unix_socket' => env('DB_SOCKET', ''),
                                  'charset' => 'utf8mb4',
                                  'collation' => 'utf8mb4_unicode_ci',
                                  'prefix' => '',
                                  'strict' => false,
                                  'engine' => null,
                                  **'options'   => [PDO::ATTR_EMULATE_PREPARES => true]**
                              ],
                      

                      确保

                      '选项' => [PDO::ATTR_EMULATE_PREPARES => true]

                      存在于 mysql 连接上。

                      【讨论】:

                      • 我们为我们的 laravel 应用程序尝试了这个,但现在没有任何东西保存到数据库中..
                      • 这不是解决方案,也不是解释,而是一种解决方法,其含义未在您的答案中提及。
                      • 此解决方法是将响应中的整数更改为字符串。这会导致严格条件 === 由于类型不匹配而失败。
                      • 这个解决方案打破了一切。我不推荐它。问题是有一个 MariaDB 更新破坏了事情并且需要降级。请参阅 incogzito 的评论。
                      • 上游 MariaDB JIRA issue MDEV-24121 感谢 cpanel 人。
                      猜你喜欢
                      • 2021-02-17
                      • 2021-02-16
                      • 2021-02-17
                      • 2021-09-10
                      • 1970-01-01
                      • 2012-10-24
                      • 2020-05-26
                      • 1970-01-01
                      相关资源
                      最近更新 更多