今天研發人員在調試java程序的時候,發現了mysql報出如下問題:
java.lang.IllegalArgumentException: Packet is larger than max_allowed_packet from server configuration of 1048576 bytes
at org.gjt.mm.mysql.Buffer.ensureCapacity(Buffer.java:398)
at org.gjt.mm.mysql.Buffer.writeBytesNoNull(Buffer.java:386)
at org.gjt.mm.mysql.PreparedStatement.executeUpdate(PreparedStatement.java:352)
at com.cicro.cws.database.DBManager.execute(DBManager.java:450)
at com.cicro.cws.publish.PreparePublish.saveSiteInstanceXmlIntoDB(PreparePublish.java:827)
at com.cicro.cws.publish.PreparePublish.generatePublishFiles(PreparePublish.java:181)
at com.cicro.cws.publish.PublishManager.publish(PublishManager.java:180)
at com.cicro.cws.synchronize.InstanceSynchronize.publishSite(InstanceSynchronize.java:954)
at com.cicro.cws.site.Site.publish(Site.java:365)
at com.cicro.cws.site.Site.run(Site.java:338)
at java.lang.Thread.run(Thread.java:536)
解決如下:
這個問題是因為導入的sql文件大於系統默認的max_allowed_packet的值,解決方法:比如在my.cnf修改增加到:max_allowed_packet=32M #或者更高,當然也可以在mysqld啟動的時候加入這個參數,但是該變量必須在mysqld重新啟動的時候才加載生效,所以必須重起mysqld!
我是把max_allowed_packet參數加載到了mysql啟動文件mysqld中,mysqld文件部分設置如下:
${MYSQL}/bin/mysqld --user=mysql --datadir=${MYSQL}/data "$@" \
--language=${MYSQL}/share/mysql/english -O max_connections=500 -O wait_timeout=600 \
-O key_buffer=32M --max_allowed_packet=32M --port=${port} --socket=/tmp/mysql.sock &
其中 --max_allowed_packet=32M必須有前面的――符號。
關於max_allowed_packet一些資料:
許多MySQL程序有一些內部變量可以在運行時設置。程序變量的設置與帶有值的其它長選項相同。
例如,mysql有一個max_allowed_packet變量,可以控制其通信緩沖區的最大長度。要想為mysql將max_allowed_packet變量的值設置為16MB,使用下面的任何一個命令:
shell> mysql --max_allowed_packet=16777216
shell> mysql --max_allowed_packet=16M
第1個命令以字節指定值。第2個命令以兆字節指定值。變量值可以有一個後綴K、M或者G(可以為大寫或小寫)來表示千字節、兆字節或者十億字節的單位。
在選項文件中,變量設定值沒有引導破折號:
[mysql]
max_allowed_packet=16777216
或:
[mysql]
max_allowed_packet=16M
如果你喜歡,變量名的下劃線可以為破折號。
注:max_allowed_packet參數是在mysql4以後才有的,在mysql4以前版本,還沒有這個參數
此外,還可以通過再/etc/增加my.cnf文件,在my.cnf中設置max_allowed_packet=16M,然後重啟mysql也可.至於my.cnf的獲得,可以從mysql主目錄的support-files下通過更改模版得到.