数据库驱动版本5.1.21升级到5.1.42 触发的程序卡死问题复盘

案发现场

当时由于一些技术方案尝试,将数据库的驱动版本由

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.21</version>
		</dependency>

升级到了

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

spring boot 版本 1.5.4.RELEASE,经过查看实际使用的是

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.42</version>
  </dependency>

测试上线后,预发部署测试没问题,到了生产不知道为何产生了卡死现象。
比对代码改动后,尝试回滚修改的此次改动后,重推后就可以了。

故障分析

当时现象就是程序卡死,导致POD不断重启,ELK无错误日志,物理机看到如下warn级别日志。

Thu Jun 01 19:19:25 CST 2023 WARN: Establishing SSL connection 

without server's identity verification is not recommended. 

According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ 

requirements SSL connection must be established by default if explicit option isn't set. 

For compliance with existing applications 

not using SSL the verifyServerCertificate property is set to 'false'. 

You need either to explicitly disable SSL by setting useSSL=false, 

or set useSSL=true and provide truststore for server certificate verification.

在这里有一个地方需要注意,MySQL在高版本需要指明是否进行SSL连接。

SSL协议提供服务主要:
1)认证用户服务器,确保数据发送到正确的服务器;    .
2)加密数据,防止数据传输途中被窃取使用;
3)维护数据完整性,验证数据在传输过程中是否丢失;
当前支持SSL协议两层:
SSL记录协议(SSL Record Protocol):建立靠传输协议(TCP)高层协议提供数据封装、压缩、加密等基本功能支持
SSL握手协议(SSL Handshake Protocol):建立SSL记录协议用于实际数据传输始前通讯双进行身份认证、协商加密
算法、 交换加密密钥等。

不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果不设置显式选项,则必须建立默认的SSL连接。需要通过设置useSSL=false来显式禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储。

1.true 需要连接
2.false 不需要连接

所以建议设置useSSL为false,有时遇到的问题可以这样来考虑

autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&zeroDateTimeBehavior=convertToNull

示例

jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&zeroDateTimeBehavior=convertToNull

那么MySQL 5.1.42 数据库都有哪些坑呢?

  • MySQL 5.1.42 是一个稳定版本,截至 2021 年 9 月,该版本已经发布超过十年。
  • 由于它是一个长期支持的版本,因此许多早期的 bug 已经被修复,而且 MySQL 5.1.42 并没有引入新的 bug。
  • 然而,就像其他软件一样,MySQL 5.1.42 也可能存在已知的 bug。
  • 以下是一些已知的 MySQL 5.1.42 bug:
    • 某些情况下,MySQL 5.1.42 可能会拒绝请求,因为在创建表时使用了错误的 charset 或 collation

    • MySQL 5.1.42 在某些情况下可能会崩溃或死锁。这些问题可能与锁或并发操作有关

    • MySQL 5.1.42 中可能存在查询优化器的性能问题,特别是在处理复杂查询时。

    • 在 MySQL 5.1.42 中,某些二进制数据类型可能会导致错误的结果。

    • 总的来说,MySQL 5.1.42 是一个稳定的版本,并且已经经过长时间的测试和验证。

    • 如果你需要使用早期的 MySQL 版本,请考虑使用MySQL 5.1.43 或更高版本。

mysql-connect-java 5.1.42 都有哪些bug?

  • mysql-connect-java 是一个 Java 库,用于连接 MySQL 数据库。
  • mysql-connect-java 5.1.42 是一个长期支持的版本,截至 2021 年 9 月,该版本已经发布超过十年。
  • 由于它是一个长期支持的版本,因此许多早期的 bug已经被修复,而且 mysql-connect-java 5.1.42 并没有引入新的 bug。
  • 然而,就像其他软件一样,mysql-connect-java 5.1.42 也可能存在已知的 bug。
  • 以下是一些已知的 mysql-connect-java 5.1.42 bug:
    • 在某些情况下,mysql-connect-java 5.1.42 可能会拒绝请求,因为在创建表时使用了错误的 charset 或 collation。
    • mysql-connect-java 5.1.42 在某些情况下可能会崩溃或死锁。这些问题可能与锁或并发操作有关。
    • mysql-connect-java 5.1.42 中可能存在查询优化器的性能问题,特别是在处理复杂查询时。
    • 在 mysql-connect-java 5.1.42 中,某些二进制数据类型可能会导致错误的结果。
  • 总的来说,mysql-connect-java 5.1.42 是一个稳定的版本,并且已经经过长时间的测试和验证
  • 如果你需要使用早期的 MySQL 版本,请考虑使用 mysql-connect-java 5.1.43 或更高版本。

看样子很有可能是这个原因导致的了,项目当时由于一些原因,尝试修改过字符集和排序规则。

碰巧,又升级到了这个版本。

警示

以后代码修改测试方案无效后一定要记得代码改回去,不要想当然。
数据库的排序规则一定不要轻易修改,如果修改可能影响数据大小写敏感的匹配。
数据库版本升级一定要修改 JDBC URL 的连接参数。

相关文章

连接数据库时在url后面加上useSSL=false的作用

猜你喜欢

转载自blog.csdn.net/hadues/article/details/130996363