首页 文章

MySQL max_allowed_packet随机更改为1024字节

提问于
浏览
3

我不断得到一个奇怪的问题,MySQL(5.5.41-0ubuntu0.14.04.1)将随机地意外地将max_allowed_packet更改为1024(在mysql客户端中查询max_allowed_packet变量时) .

MySQL配置文件(/etc/mysql/my.cnf)在安装后保留原样,但绑定地址被注释掉以允许远程连接 . mysqld和mysql的max_allowed_packet值设置为16M,启动mysql服务器(service mysql start)后,值为16777216 .

我查看了mysql错误日志和syslog,发现没有任何与数据库崩溃或重启有关的内容 .

该数据库在带有UGBntu 14.04的4GB内存的VPS上运行,并由Java Spring Application使用 .

目前该应用程序仍处于开发阶段,并且正在使用mysql root帐户,该帐户将在找到此问题的根本原因后进行更改 .

Spring中的Datasource和EntityManager配置如下:

@Bean
public DataSource dataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setTestOnBorrow(true);
    dataSource.setValidationQuery("SELECT 1");
    dataSource.setUrl("jdbc:mysql://localhost:3306/testdb");
    dataSource.setUsername("root");
    dataSource.setPassword("...");
    return dataSource;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
        DataSource dataSource) {
    LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
    emf.setPackagesToScan("com.app.entity");
    emf.setPersistenceProvider(new HibernatePersistenceProvider());
    Properties jpaProperties = new Properties();
    jpaProperties.setProperty("hibernate.hbm2ddl.auto", "update");
    jpaProperties.setProperty("hibernate.show_sql", "true");
    emf.setJpaProperties(jpaProperties);
    emf.setDataSource(dataSource);
    return emf;
}

@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory emf) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);
    return transactionManager;
}

mysql-connector-java和commons-dbcp库用于数据库交互 .

经过多次搜索,我发现在较新版本的mysql中,无法更改max_allowed_packet的会话变量,因为它是一个只读变量 . 这就是为什么我试图弄清楚如果my.cnf中的值设置为16M,这个变量如何以及为什么会改变的原因 .

任何帮助将不胜感激,因为这个问题已经重新发生,因为我们的数据包大小超过1024 .

1 回答

  • 4

    你说“在mysql客户端查询max_allowed_packet变量时” . 我们认为这意味着您正在运行查询,例如:

    SELECT @@global.max_allowed_packet, @@session.max_allowed_packet;
    

    那会返回一个像这样的结果:

    @@global.max_allowed_packet  @@session.max_allowed_packet  
    ---------------------------  ----------------------------
                       16777216                      16777216
    

    可以动态修改 max_allowed_packet 值(如果用户具有足够的权限) .

    SET GLOBAL max_allowed_packet = 33554432 ;
    

    我们可以验证全局变量的值是否被修改:

    SELECT @@global.max_allowed_packet, @@session.max_allowed_packet;
    
    @@global.max_allowed_packet  @@session.max_allowed_packet
    ---------------------------  ----------------------------
                       33554432                      16777216
    

    当会话从服务器(全局)变量的当前值开始(根据我的理解)时,会话变量的值被初始化 .


    my.cnf文件中有几个"sections" . 要设置服务器的全局 max_allowed_packet 值,该设置应显示在 my.cnf[mysqld] 部分下 . (这也可以作为启动mysql的命令行中的参数提供 . 但是我们不这样做,我们只是在my.cnf文件中设置它 . )

    my.cnf

    [mysqld]
    ...
    max_allowed_packet = 16M
    
    [mysqldump]
    ...
    max_allowed_packet = 16M
    

    max_allowed_packet 的设置也可以显示在 my.cnf 的其他部分下 . 其他部分下的设置不会影响服务器 . 例如,在 [mysqldump][mysql][client] 部分下可以出现同一行 . (当 max_allowed_packet 出现在那些值与 [mysqld] 部分下的设置不同的其他部分下时,我对这种行为没有很好的理解 . )


    我从来没有观察到你所描述的那种行为;您的描述在您正在执行的确切语句方面有点缺乏,并且返回的确切输出 .

相关问题