如何检查和设置max_allowed_pa​​cket mysql变量

Joh*_*ohn 99 php mysql

可能重复:
MySQL错误1153 - 获得的数据包大于'max_allowed_pa​​cket'字节

嗨,我收到错误:

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

但我没有对我的源代码进行任何更改,托管表示他们没有对服务器设置进行任何更改.

我不知道发生了什么.但我试图找到原因.

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

并且可以在源代码中设置它吗?

gle*_*btv 196

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

[mysqld]
max_allowed_packet=16M 
Run Code Online (Sandbox Code Playgroud)

你可以在mysql中看到它的有用价值,如下所示:

SHOW VARIABLES LIKE 'max_allowed_packet';
Run Code Online (Sandbox Code Playgroud)

您可以尝试像这样更改它,但这不太可能适用于共享主机:

SET GLOBAL max_allowed_packet=16777216;
Run Code Online (Sandbox Code Playgroud)

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

编辑

max_allowed_packet至少从mysql 5.5开始,[mysqld]是必要的.

最近在AWS EC2上使用Drupal和Solr搜索引擎设置了一个实例,该实例需要32M max_allowed_packet.你[mysqld_safe]在/etc/my.cnf中设置了值(这是mysql安装附带的默认设置)模式,它没有用.我没有深入研究这个问题.但是在我将其更改为[mysqld]并重新启动mysqld之后,它才起作用.

  • 请注意,MySQL文档说,"从MySQL 5.0.84开始,此变量的会话值是只读的.在5.0.84之前,允许设置会话值但不起作用." http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_allowed_pa​​cket (9认同)
  • 应该是`SET GLOBAL max_allowed_pa​​cket = 16777216;`或`SET SESSION max_allowed_pa​​cket = 16777216;` (8认同)

mor*_*tic 31

以下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 );
Run Code Online (Sandbox Code Playgroud)

因此,如果你有一个查询,你期望很长,你可以确保mysql将接受它类似于:

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

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

该值应为1024的倍数; nonmultiples向下舍入到最接近的倍数.

这应该有希望将max_allowed_pa​​cket大小设置得足够大以处理您的查询.我没有在共享主机上尝试过这个,所以与@Glebushka相同的警告适用.


Raf*_*fee 5

转到 cpanel 并以主管理员或超级管理员身份登录

  1. 找到 SSH/Shell Access(您可以在 cpanel 的安全选项卡下找到)

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

    note: do not give any username, cos, it needs permissions
    
    Run Code Online (Sandbox Code Playgroud)
  3. 一旦你进入控制台类型

    输入 ' mysql' 并按 Enter 键,现在您发现自己处于

    mysql>/* 并在此处键入 */

    mysql> set global net_buffer_length=1000000;

    查询正常,0 行受影响(0.00 秒)

    mysql> set global max_allowed_packet=1000000000;

    查询正常,0 行受影响(0.00 秒)

现在上传并享受吧!