如何检查和设置最大允许_包 mysql 变量

可能的复制品:
MySQL 错误1153-得到一个大于‘ max _ allow _ pack’字节 的数据包

嗨,我收到了错误信息:

[1153] Got a packet bigger than 'max_allowed_packet'bytes

但是我没有改变我的源代码和主机状态,他们没有在服务器设置上做任何改变。

我不知道发生了什么,但我正在找原因。

那么,如何通过 php 脚本检查 max_allowed_packet mysql 变量呢?

有可能在源代码中设置它吗?

352979 次浏览

max_allowed_packet 是在 mysql 配置中设置的,而不是在 php 端

[mysqld]
max_allowed_packet=16M

您可以在 mysql 中看到它的当前值,如下所示:

SHOW VARIABLES LIKE 'max_allowed_packet';

你可以试着像这样改变它,但是这不太可能在共享主机上起作用:

SET GLOBAL max_allowed_packet=16777216;

你可以在这里阅读 http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

剪辑

至少在 mysql 版本5.5以后,[ mysqld ]是使 max_allowed_packet工作所必需的。

最近使用 Drupal 和 Solr 搜索引擎在 AWS EC2上设置了一个实例,这需要32M max_allowed_packet。如果您在/etc/my.cnf 模式下设置 [mysqld_safe](这是 mysql 安装时的默认设置)模式下的值,那么它不起作用。我没有深究这个问题。但是在我将它改为 [mysqld]并重新启动 mysqld 之后,它工作了。

下面的 PHP 适合我(使用 mysqli 扩展,但查询应该与其他扩展相同) :

$db = new mysqli( 'localhost', 'user', 'pass', 'dbname' );
// to get the max_allowed_packet
$maxp = $db->query( 'SELECT @@global.max_allowed_packet' )->fetch_array();
echo $maxp[ 0 ];
// to set the max_allowed_packet to 500MB
$db->query( 'SET @@global.max_allowed_packet = ' . 500 * 1024 * 1024 );

所以如果你有一个很长的查询,你可以确保 mysql 接受它,比如:

$sql = "some really long sql query...";
$db->query( 'SET @@global.max_allowed_packet = ' . strlen( $sql ) + 1024 );
$db->query( $sql );

注意,我为字符串的长度增加了额外的1024个字节,因为 根据手册,

该值应该是1024的倍数; 非倍数四舍五入到最接近的倍数。

这样应该可以设置 max _ allow _ pack 的大小,足以处理查询。我还没有在共享主机上尝试过这种方法,所以@Glebushka 也需要注意。

Goto cpanel 并作为主管理员或超级管理员登录

  1. Find SSH/Shell Access (您将在 cpanel 的 security 选项卡下找到)

  2. 现在将超级管理员的用户名和密码设置为 rootwhatyougave

    note: do not give any username, cos, it needs permissions
    
  3. once your into console type

    type ' mysql ' and press enter now you find youself in

    mysql> /* and type here like */

    mysql> set global net_buffer_length=1000000;

    Query OK, 0 rows affected (0.00 sec)

    mysql> set global max_allowed_packet=1000000000;

    Query OK, 0 rows affected (0.00 sec)

Now upload and enjoy!!!