网站优化用户体验网站开发新技术探索
2026/1/14 23:54:51 网站建设 项目流程
网站优化用户体验,网站开发新技术探索,互联网项目推广方案,手机设计软件app推荐甄选推荐系统#xff1a; Pocket Bookmarks。 口袋书签 谷歌浏览器插件#xff1a;立即安装 Pocket Bookmarks edge浏览器插件#xff1a;立即安装Pocket Bookmarks 为什么你急需这个插件#xff1f; 3秒极简操作#xff1a;无需学习成本#xff0c;清爽界面一键管理 跨设…甄选推荐系统Pocket Bookmarks。 口袋书签谷歌浏览器插件立即安装 Pocket Bookmarksedge浏览器插件立即安装Pocket Bookmarks为什么你急需这个插件3秒极简操作无需学习成本清爽界面一键管理跨设备无缝同步电脑/手机随时存取重要链接黑科技AI助手自动分类智能推荐比你自己更懂你的收藏习惯可视化数据看板TOP10常用书签、访问趋势一目了然效率党最爱的功能多维度分类支持标签文件夹双重管理智能排序按访问频率/创建时间快速筛选团队协作分类书签一键共享给同事个性展示九宫格/列表/时间轴多种视图问题背景在使用 Spring Boot 2.6.8 ShardingSphere 4.1.1 的项目中启动应用时遇到如下错误java.sql.SQLSyntaxErrorException: Unknown table keywords in information_schema at com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema.getSQLKeywords(DatabaseMetaDataUsingInfoSchema.java:1193)完整的错误堆栈显示这个错误发生在 Spring Boot Actuator 的健康检查阶段导致整个应用无法启动。技术栈环境Spring Boot: 2.6.8ShardingSphere: 4.1.1MySQL: 8.0.x (低于 8.0.13)MySQL Connector: mysql-connector-java数据源: Dynamic DataSource ShardingSphere问题原因深度分析为什么会报这个错这个问题的发生链路如下Spring Boot 启动 ↓ Spring Boot Actuator 健康检查 ↓ 检查 shardingDataSource 健康状态 ↓ ShardingSphere 初始化数据源 ↓ MySQL JDBC 驱动查询元数据 ↓ 调用 DatabaseMetaDataUsingInfoSchema.getSQLKeywords() ↓ 执行 SQL: SELECT * FROM information_schema.KEYWORDS ↓ 报错表不存在 ❌核心矛盾information_schema.KEYWORDS表只在 MySQL 8.0.13 版本中存在如果你的 MySQL 版本 8.0.13这个表根本不存在MySQL JDBC 驱动特别是新版本会默认使用information_schema来查询元数据ShardingSphere 在初始化时会触发驱动的元数据查询三个罪魁祸首Spring Boot Actuator- 启动时主动检查数据库健康状态ShardingSphere- 启动时会进行表元数据检查MySQL JDBC 驱动- 默认使用information_schema查询关键字列表解决方案三管齐下我们需要从三个层面同时解决问题确保万无一失。方案一禁用 Spring Boot Actuator 的数据库健康检查为什么这样做从源头上阻止健康检查触发数据源初始化避免问题发生。配置方法在application.yml或application-{profile}.yml中添加management: health: db: enabled: false优点立竿见影直接阻止健康检查不影响应用正常使用数据库缺点失去了数据库健康检查的功能可用其他监控方案补充方案二禁用 ShardingSphere 的表元数据检查为什么这样做即使数据源被初始化也跳过不必要的元数据校验。配置方法在 ShardingSphere 配置中添加props节点spring: sharding-sphere: datasource: names: hotel-resource-supplier hotel-resource-supplier: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://your-host:3306/your_db?serverTimezoneAsia/Shanghai username: your_username password: your_password sharding: tables: your_table: actual-data-nodes: ds.your_table$-{0..7} table-strategy: inline: sharding-column: id algorithm-expression: your_table$-{id % 8} # 关键配置禁用表元数据检查 props: sql.show: false check-table-metadata-enabled: false配置说明check-table-metadata-enabled: false- 禁用启动时的表结构校验sql.show: false- 关闭 SQL 日志可选根据需要调整为 true优点不影响 ShardingSphere 的分片功能只是跳过启动时的元数据校验步骤方案三JDBC URL 添加参数禁用 information_schema为什么这样做告诉 MySQL JDBC 驱动不要使用information_schema改用SHOW命令查询元数据。配置方法在 JDBC URL 中添加useInformationSchemafalse参数spring: sharding-sphere: datasource: hotel-resource-supplier: jdbcUrl: jdbc:mysql://your-host:3306/your_db?serverTimezoneAsia/ShanghaicharacterEncodingutf8useSSLfalseuseInformationSchemafalse完整示例spring: sharding-sphere: datasource: names: hotel-resource-supplier hotel-resource-supplier: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://jump-hw.xxxcloud.com:33061/hotel_resource_supplier?serverTimezoneAsia/ShanghaicharacterEncodingutf8useSSLfalserewriteBatchedStatementstrueuseInformationSchemafalse username: ${DB_USER:your_username} password: ${DB_PWD:your_password}优点即使需要查询元数据也使用兼容性更好的SHOW命令适用于所有 MySQL 版本完整配置示例application-uat.yml 完整配置spring: autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure datasource: dynamic: primary: ceekee_hotel_resource datasource: ceekee_hotel_resource: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://your-host:3306/ceekee_hotel_resource?serverTimezoneAsia/ShanghaicharacterEncodingutf8useSSLfalse username: your_username password: your_password sharding-sphere: datasource: names: hotel-resource-supplier hotel-resource-supplier: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver # 方案三添加 useInformationSchemafalse jdbcUrl: jdbc:mysql://your-host:3306/hotel_resource_supplier?serverTimezoneAsia/ShanghaicharacterEncodingutf8useSSLfalserewriteBatchedStatementstrueuseInformationSchemafalse username: your_username password: your_password sharding: tables: international_supplier_hotel_room_type: actual-data-nodes: hotel-resource-supplier.international_supplier_hotel_room_type$-{0..7} table-strategy: inline: sharding-column: hotel_id algorithm-expression: international_supplier_hotel_room_type$-{hotel_id % 8} international_supplier_hotel_room_type_image: actual-data-nodes: hotel-resource-supplier.international_supplier_hotel_room_type_image$-{0..7} table-strategy: inline: sharding-column: hotel_id algorithm-expression: international_supplier_hotel_room_type_image$-{hotel_id % 8} # 方案二禁用元数据检查 props: sql.show: false check-table-metadata-enabled: false # 方案一禁用健康检查 management: health: db: enabled: false方案对比与选择建议方案生效层级推荐指数适用场景方案一禁用健康检查Spring Boot⭐⭐⭐⭐⭐不需要数据库健康检查功能的项目方案二禁用 ShardingSphere 元数据检查ShardingSphere⭐⭐⭐⭐使用 ShardingSphere 的项目方案三JDBC 参数MySQL JDBC 驱动⭐⭐⭐⭐⭐所有使用 MySQL 的项目推荐组合最佳实践三个方案同时使用虽然理论上只需要其中一个方案即可解决问题但为了确保在各种情况下都不会出错建议三个方案同时配置方案一在最外层拦截避免触发问题方案二在 ShardingSphere 层拦截即使触发也跳过方案三在 JDBC 层拦截即使要查询也用兼容方式这样形成三层防护确保万无一失。验证方案是否生效配置完成后重新启动应用观察日志成功的日志标志INFO o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 16531 (http) INFO c.c.h.a.front.TripwiseHotelAbroadFrontApplication - Started TripwiseHotelAbroadFrontApplication in 12.345 seconds不应该再出现的错误❌ java.sql.SQLSyntaxErrorException: Unknown table keywords in information_schema ❌ Error creating bean with name shardingDataSource ❌ Error creating bean with name healthEndpoint常见问题 FAQQ1: 禁用健康检查会影响生产监控吗A:不会。你可以通过以下方式补充监控使用独立的数据库监控工具如 Prometheus Grafana在业务代码中自定义健康检查逻辑使用数据库自带的监控功能Q2: 为什么不直接升级 MySQL 到 8.0.13A:升级数据库涉及以下风险需要停机维护可能存在兼容性问题需要充分的测试不是所有环境都能随意升级使用配置解决是最低风险的方案。Q3: 这个配置会影响 ShardingSphere 的分片功能吗A:完全不会。这些配置只是跳过启动时的健康检查跳过元数据校验改变元数据查询方式分片规则、路由策略、SQL 解析等核心功能完全不受影响。Q4: 如果只配置其中一个方案可以吗A:可以但不推荐。建议三个方案都配置原因配置成本极低只需要几行配置三层防护更可靠避免因环境差异导致的问题扩展其他类似问题如果你遇到以下类似错误也可以使用相同的解决方案Unknown table CHECK_CONSTRAINTS in information_schema Unknown table TABLESPACES in information_schema Unknown table ST_GEOMETRY_COLUMNS in information_schema这些都是因为 MySQL 版本差异导致的information_schema表不存在问题使用useInformationSchemafalse即可解决。总结问题本质MySQL 8.0.13 版本引入了新的系统表information_schema.KEYWORDS但老版本 MySQL 没有这个表。当新版本的 MySQL JDBC 驱动尝试查询这个表时就会报错导致应用无法启动。解决思路从三个层面同时阻断问题发生的路径应用层禁用不必要的健康检查中间件层跳过 ShardingSphere 的元数据校验驱动层让 JDBC 使用兼容性更好的查询方式核心价值✅快速解决无需升级 MySQL几分钟配置即可解决✅零风险不影响任何业务功能✅通用性强适用于所有 ShardingSphere MySQL 项目✅防患未然三层防护确保不会复发最后的建议虽然这个问题看起来很棘手但本质上是版本兼容性问题。在无法立即升级数据库的情况下通过合理的配置可以完美解决。记住最好的解决方案不是最复杂的而是最稳定、最容易理解和维护的。参考资料MySQL 8.0.13 Release NotesShardingSphere 官方文档MySQL Connector/J Configuration PropertiesSpring Boot Actuator Health Indicators创建时间2025-12-16适用版本Spring Boot 2.x ShardingSphere 4.x MySQL 5.7/8.0关键词ShardingSphere, MySQL, information_schema, KEYWORDS, 启动报错

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询