【问题标题】:Why mysql max_allowed_packet reset to 1m automatically为什么mysql max_allowed_pa​​cket 自动重置为1m
【发布时间】:2015-03-11 06:02:59
【问题描述】:

我设置了

SET GLOBAL max_allowed_packet=16777216; 

还有

[mysqld]
max_allowed_packet = 16M

我通过下面的命令检查了 max_allowed_pa​​cket

SHOW VARIABLES LIKE 'max_allowed_packet';

值为 = 16777216

但几天后 max_allowed_pa​​cket 会自动重置为 1M。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    MySQL 既有 GLOBAL 变量,也有 SESSION 变量,还有 my.cnf。

    GLOBAL 变量在启动时从 my.cnf 初始化,许多变量在连接时从 GLOBAL 值中取出并复制到 SESSION 中。如果您更改 GLOBAL 值,SESSION 会保留它自己的值 - 但任何新会话都将采用新的 GLOBAL 默认值。

    您似乎在设置 GLOBAL 变量和更新 my.cnf 方面做了正确的事情,但在您的示例中,您运行了返回 SESSION 值的“SHOW VARIABLES”。因此,在这种情况下,您可能没有检查正确的值。我建议您在未来的所有检查中同时检查全局值和会话值,以帮助了解何时发生了什么变化。

    显示全局变量,例如“max_allowed_pa​​cket”; 显示会话变量,例如“max_allowed_pa​​cket”;

    对于以后自己改变的值,可以有以下解释

    (1) 您正在重新使用仍具有旧值的会话 (2) 另一个连接运行了 SET GLOBAL max_allowed_pa​​cket,甚至有可能一些无礼的应用程序或脚本正在这样做 (3) 服务器重新启动,但 my.cnf 更改未按预期应用 -- 可能是文件路径错误,或者配置文件中存在多次该设置。我会在 SHOW GLOBAL STATUS 中检查当前的正常运行时间,以了解服务器是否已重新启动

    我想不出任何其他原因会发生这种情况。当您传递 --max_allowed_pa​​cket 时,我确实检查了客户端是否协商服务器端值,但似乎并非如此。

    【讨论】:

    • Mysql 服务器在我的情况下没有重新启动。我设置了 max_allowed_pa​​cket 然后关闭连接。然后我再次检查 max_allowed_pa​​cket。它设置为 16777216。
    • 这听起来很像您在设置会话变量,而不是全局变量。确保运行 SET GLOBAL 并检查 SHOW GLOBAL VARIABLES。如果您不指定 GLOBAL,则默认为 SESSION,一旦您关闭该会话,该会话就会丢失。
    • 显示全局变量,例如 'max_allowed_pa​​cket' = 16777216 显示会话变量,例如'max_allowed_pa​​cket'= 16777216
    • 对于我的情况,这两个值都是相同的。我的问题是它会自动重置为 1M。 mysql服务器没有重启,没有其他应用执行命令SET GLOBAL max_allowed_pa​​cket=16777216;
    • 我建议启用 MySQL 通用查询日志(记录所有查询),以便下次发生这种情况时您可以在日志中搜索 SET 并确定是否确实设置了它,因为我不能想想发生这种情况的任何其他原因。
    【解决方案2】:

    我很确定你被黑了。几个月来我都有同样的问题。我打开了general_log,终于找到了一些代码:

       connect root@someipaddress on
       Query select 0x4D5A900..........(verylong)
       Query select sys_exe('cmd /c  c:/windows/nbvqc4.vbs')
       .........
       set global max_allowed_packet 1024
       ........
    

    建议:更改您的 root 密码。

    【讨论】:

      【解决方案3】:

      是的,有人入侵了系统。我更改了 root 密码,一切正常。

      【讨论】:

        【解决方案4】:

        在 MySQL 中 max_allowed_pa​​cket 的默认值为 1M。我相信你的“max_allowed_pa​​cket”的大小超过了它的上限。因此,当您选中“SHOW VARIABLES LIKE 'max_allowed_pa​​cket';”时它显示出一些负值。

        另外,

        你在 MySQL 中有两个 max_allowed_pa​​cket 值:

        一个在客户端:[mysql] 部分、[mysqldump]、[client] 等等。 一个在服务器端:[mysqld] 部分。

        【讨论】:

        • 我编辑我的问题。16777216 值中没有负数。您解释为负号。
        【解决方案5】:

        尝试将所有用户的“超级”权限设置为“N”,1 个管理员用户除外。这可以防止用户更改 max_allowed_pa​​cket。

        【讨论】:

          【解决方案6】:

          我们刚刚遇到了这个问题,根本原因是我们被黑客入侵了。一些第 3 方正在运行一个脚本,该脚本正在更改该值。

          对于那些试图弄清楚黑客是否是他们的根本原因的人的提示 - 暂时更改您的 MySQL 日志记录以包含所有查询。这就是我们最终找到问题的方式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-31
            • 2015-07-11
            • 1970-01-01
            • 2023-03-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多