MySQL max_allowed_packet问题

发表于:2018-06-14 16:03:13,已有1881次阅读

在使用大的BOLB二进制数据导入MySQL数据库时,发生了Got a packet bigger than 'max_allowed_packet的错误,查询了一下说是要设置MySQL数据库的max_allowed_packet值。

找到MySQL的官网,Packet Too Large一节,按照如上介绍设置得以解决,故摘录如下:


MySQL的通信packet包可以是发送给MySQL服务器的单独的SQL语句,也可以是单独的行数据发送给客户端,也可能是主服务器发送给从服务器大的日志文件。

当一个MySQL的客户端或者mysqld服务端接收的包大于max_allowed_packet设置的字节数,则会触发一个NET_PACKET_TOO_LARGE的错误,并关闭数据连接,同样的在客户端,如果通信包过大,你将会得到一个Lost connection to MySQL server during query的错误。

客户端与服务端都有一个他们自己的max_allowed_packet变量值,如果你想处理大数据包,你需要增加客户端和服务端的这个变量的值。

如果你使用的是mysql客户端程序,默认的max_allowed_packet值是16M,增加他的值可以像这样启动mysql

shell> mysql --max_allowed_packet=32M
这里设置包的大小是32M。

服务端默认的max_allowed_packet是64M,如果服务端需要处理大的查询,你可以增加它的值(例如,处理大的BOLB二进制列),如下设置这个变量的值为128M,你可以像这样启动mysqld

shell> mysqld --max_allowed_packet=128M
你还可以通过修改配置文件来设置max_allowed_packet,例如设置服务端这个值为128M,你只需要配置文件中添加如下一句:
[mysqld]
max_allowed_packet=128M
增加这个值的大小是安全的,因为额外的内存只有在需要的时候才会被分配。例如当你发起一个大的查询或msyqld返回一个大的结果集,mysqld都需要被分配大的内存。小的默认值是一种捕获客户端和服务器之间错误数据包的预防措施,并且确保你不会因为大的数据包通信而运行造成内存溢出的错误。

使用大的包你可能也会得到一个奇怪的问题,如果你使用大的二进制BOLB值,但没有给mysqld大的内存处理查询,如果预测的是这样导致的,可以尝试添加ulimit -d 256000mysqld_safe脚本开始时,并重启mysqld


Tip,技术小贴:

这里一提句,导出BOLB二进制图片数据时,需要在mysqldump命令中添加--hex-blob参数,如下:

shell> mysqldump  --hex-blob -u [用户名] -p [数据库] [表名] > test.sql

这样转化二制进为十六进制,保证数据备份为文本后还原保真。

在mysql命令行下设置max packet

mysql --user=root --password=mypass
mysql> SET GLOBAL max_allowed_packet=32*1024*1024;
Query OK, 0 rows affected (0.00 secs)
mysql> SHOW VARIABLES max_allowed_packet;


评论

暂无评论

您还可输入120个字