原 MySQL max_allowed_packet问题
在使用大的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 256000
在mysqld_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;
暂无评论