mysql优化-升级8.0服务启动失败
当你在使用Java数据库连接时,尤其是在使用诸如Spring Boot等框架时,配置useInformationSchema=true
可能导致Java服务无法启动。这通常是因为JDBC URL的配置错误或者对MySQL JDBC驱动的版本不兼容。
information_schema是MySQL数据库中的一个系统数据库,用于存储关于数据库和表的元数据信息。该数据库中的表包含了关于数据库、表、列、索引、触发器、权限等的详细信息。
具体存储信息可参考:
MySQL之information_schema数据库详细讲解 - 问答 - 亿速云
在mysql5.0以后增加useInformationSchema参数,默认值为false
在mysql8.0之后修改默认值为true。
注意:mysql8.0之前手动在jdbc-url指定参数useInformationSchema=true可能会产生其它bug
1.当此参数为true后,服务启动时加载元数据会加载上述表及数据,尤其是当我们应用库中的表数量过多索引过多及过大时会导致服务启动超时。
2.当此参数为true后会导致不支持分布式事务注解@GlobalTransactional 当项目中添加此注解后会报错
useInformationSchema参数在程序启动初始化加载数据库信息时,会决定,
Connection.getMetaData()方法返回的DatabaseMetaData 对象是com.mysql.jdbc.DatabaseMetaData,还是com.mysql.jdbc.DatabaseMetaDataUsingInfoSchema
不同的版本不兼容也会导致此方法调用异常导致无法返回正确的表注释等信息从而启动失败
所以我们最简单的方法就是在升级8.0之后增加mysql参数:
useInformationSchema=false
useInformationSchema
参数设置为false
,应用程序将不再使用信息模式。这意味着应用程序将直接与数据库进行交互,而不是通过查询信息模式来获取元数据。这可以提高性能,因为不需要额外的查询操作。
信息模式是一种数据库模式,它提供了关于数据库表、列、索引等元数据的信息。当使用信息模式时,应用程序可以查询这些元数据以获取有关数据库结构的信息。然而,在某些情况下,应用程序可能不需要这些元数据,或者需要更细粒度的控制来访问数据库结构。
如果使用了sharding-jdbc此类插件,在服务启动时就会加载所有库表信息,更不需要信息模式。