データベース ドライバーのバージョン 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 にはエラー ログがなく、物理マシンには次の警告レベルのログが表示されるというものでした。

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.

ここで注意すべき点が 1 つあり、MySQL は上位バージョンで SSL 接続を実行するかどうかを示す必要があります。

SSL プロトコルによって提供されるサービスは主に次のとおりです:
1) データが正しいサーバーに送信されることを保証するためのユーザー サーバーの認証、
2) 送信中のデータの盗難を防ぐためのデータの暗号化、
3) データの整合性の維持、および送信中にデータが失われたかどうかの検証送信;
現在、SSL プロトコルの 2 つの層をサポートしています: SSL
レコード プロトコル (SSL レコード プロトコル): データのカプセル化、圧縮、暗号化などの基本機能を提供する、送信プロトコル (TCP) の高レベル プロトコルによって確立されています
。プロトコル (SSL Handshake Protocol): 確立された SSL Record Protocol 実際のデータ送信の前に、通信当事者は身元認証、暗号化
アルゴリズムのネゴシエート、暗号鍵の交換などを行います。

サーバー認証なしで 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 月の時点で 10 年以上リリースされている安定版リリースです。
  • MySQL 5.1.42 は長期的にサポートされるリリースであるため、以前の多くのバグが修正されており、MySQL 5.1.42 には新しいバグはありません。
  • ただし、他のソフトウェアと同様、MySQL 5.1.42 には既知のバグがある可能性があります。
  • MySQL 5.1.42 の既知のバグの一部を次に示します。
    • 場合によっては、テーブルの作成時に間違った文字セットまたは照合順序が使用されたために、MySQL 5.1.42 がリクエストを拒否することがあります

    • 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 にはどのようなバグがありますか?

  • mysql-connect-java は、MySQL データベースに接続するための Java ライブラリです。
  • mysql-connect-java 5.1.42 は、2021 年 9 月の時点で 10 年以上リリースされている長期サポートリリースです。
  • 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-connect-java 5.1.42 がリクエストを拒否することがあります。
    • 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