【问题标题】:MySQL max_allowed_packet Randomly Changes to 1024 BytesMySQL max_allowed_pa​​cket 随机更改为 1024 字节
【发布时间】:2015-07-11 08:25:31
【问题描述】:

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

MySQL 配置文件 (/etc/mysql/my.cnf) 在安装后保持不变,除了绑定地址被注释掉以允许远程连接。 mysqld 和 mysql 的 max_allowed_pa​​cket 的值都设置为 16M,在启动 mysql 服务器(服务 mysql 启动)时,该值是 16777216,正如预期的那样。

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

数据库在 Ubuntu 14.04 的 4GB 内存的 VPS 上运行,并由 Java Spring 应用程序使用。

目前该应用还在开发中,使用的是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_pa​​cket 的会话变量,因为它是只读变量。这就是为什么我挠头试图弄清楚如果 my.cnf 中的值设置为 16M 时这个变量如何以及为什么会发生变化。

任何帮助将不胜感激,因为自从我们的数据包大小增加到 1024 以上以来,此问题一直在再次发生。

【问题讨论】:

标签: java mysql spring jpa


【解决方案1】:

您说“在 mysql 客户端中查询 max_allowed_pa​​cket 变量时”。我们认为这意味着您正在运行如下查询:

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

session 变量的值在会话开始时(据我所知)从服务器(global)变量的当前值初始化。


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

我的.cnf

[mysqld]
...
max_allowed_packet = 16M

[mysqldump]
...
max_allowed_packet = 16M

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


我从未观察到您描述的那种行为;您的描述在您正在执行的 exact 语句和返回的 exact 输出方面有点欠缺。

【讨论】:

  • 感谢您对此的见解。我知道这个问题有点模糊,但我设法找到了问题。查看错误日志,我发现一个警告,提到一个未知的 IP 地址已连接。查找 IP 表明它位于另一个区域。我们立即更改了数据库密码,因为我们遭到了入侵。
猜你喜欢
  • 2011-12-25
  • 2015-08-31
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2017-03-02
相关资源
最近更新 更多