我不断得到一个奇怪的问题,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,所以这个问题已经重新发生。
答案 0 :(得分: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
当会话从服务器的当前值( global )变量启动时(根据我的理解) session 变量的值被初始化。
my.cnf文件中有几个“部分”。要为服务器设置全局 max_allowed_packet
值,该设置应显示在[mysqld]
的{{1}}部分下方。 (这也可以作为启动mysql的命令行中的参数提供。但是我们不这样做,我们只是在my.cnf文件中设置它。)
的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]
部分的其他部分时,我不太了解行为。
我从未观察到你所描述的那种行为;您正在执行的完全语句的描述有点缺失,并且返回完全输出。