可能重复:MySQL错误1153 - 获得的数据包大于'max_allowed_packet'字节
嗨,我收到错误:
[1153] Got a packet bigger than 'max_allowed_packet'bytes
但我没有对我的源代码进行任何更改,托管表示他们没有对服务器设置进行任何更改 .
我不知道发生了什么 . 但我试图找到原因 .
那么,如何通过php脚本检查 max_allowed_packet mysql变量?
max_allowed_packet
并且可以在源代码中设置它吗?
max_allowed_packet 在mysql配置中设置,而不是在php端
[mysqld] max_allowed_packet=16M
你可以在mysql中看到它的有用 Value ,如下所示:
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
EDIT
至少从mysql 5.5开始,[mysqld]必须使 max_allowed_packet 正常工作 .
最近在AWS EC2上使用Drupal和Solr搜索引擎设置了一个实例,该实例需要32M max_allowed_packet . 你在/etc/my.cnf中设置 [mysqld_safe] (这是mysql安装附带的默认设置)模式下的值,它没有用 . 我没有深入研究这个问题 . 但在我将其更改为 [mysqld] 并重新启动mysqld之后,它就可以了 .
[mysqld_safe]
[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个字节到字符串的长度,因为according to the manual,
该值应为1024的倍数; nonmultiples向下舍入到最接近的倍数 .
这应该有希望将max_allowed_packet大小设置得足够大以处理您的查询 . 我没有在共享主机上尝试过这个,所以与@Glebushka相同的警告适用 .
转到cpanel并以主管理员或超级管理员身份登录
查找SSH / Shell访问(您可以在cpanel的安全选项卡下找到)
现在将超级管理员的用户名和密码设为 root 或 whatyougave
root
whatyougave
note: do not give any username, cos, it needs permissions
输入' mysql '然后按Enter键即可找到你自己
mysql
mysql> / 并在此处输入 /
mysql>
mysql> set global net_buffer_length=1000000;
查询正常,0行受影响(0.00秒)
mysql> set global max_allowed_packet=1000000000;
现在上传并享受!
3 回答
max_allowed_packet
在mysql配置中设置,而不是在php端你可以在mysql中看到它的有用 Value ,如下所示:
您可以尝试像这样更改它,但这不太可能适用于共享主机:
你可以在这里阅读http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html
EDIT
至少从mysql 5.5开始,[mysqld]必须使
max_allowed_packet
正常工作 .最近在AWS EC2上使用Drupal和Solr搜索引擎设置了一个实例,该实例需要32M
max_allowed_packet
. 你在/etc/my.cnf中设置[mysqld_safe]
(这是mysql安装附带的默认设置)模式下的值,它没有用 . 我没有深入研究这个问题 . 但在我将其更改为[mysqld]
并重新启动mysqld之后,它就可以了 .以下PHP适用于我(使用mysqli扩展但查询应该与其他扩展相同):
因此,如果你有一个查询,你期望很长,你可以确保mysql将接受它类似于:
请注意,我添加了额外的1024个字节到字符串的长度,因为according to the manual,
这应该有希望将max_allowed_packet大小设置得足够大以处理您的查询 . 我没有在共享主机上尝试过这个,所以与@Glebushka相同的警告适用 .
转到cpanel并以主管理员或超级管理员身份登录
查找SSH / Shell访问(您可以在cpanel的安全选项卡下找到)
现在将超级管理员的用户名和密码设为
root
或whatyougave
输入'
mysql
'然后按Enter键即可找到你自己mysql>
/ 并在此处输入 /mysql> set global net_buffer_length=1000000;
查询正常,0行受影响(0.00秒)
mysql> set global max_allowed_packet=1000000000;
查询正常,0行受影响(0.00秒)
现在上传并享受!