2023.07.28

MySQL

MySQL NDB Cluster 8.0.34 GA版(リリース日:2023年7月18日)

追加・変更された機能

  • 重要な変更; NDB Cluster API: NdbRecordインターフェイスでは、プライマリキー値を同様に変更できます。つまり、エラーを発生させることなく、プライマリキーの値をその現在の値、または使用されている照合規則に従って等しいと比較される値に更新できます。NdbRecord自体は更新を阻止しようとしません。代わりに、データノードはプライマリキーが等しくない値に更新されているかどうかを確認し、この場合は”Error 897: Update attempt of primary key via ndbcluster internal api”で更新を拒否します。
    以前は、NdbRecord以外のメカニズムを使用してプライマリキー値を更新しようとすると、NDB APIは既存の値と同じ値を設定したとしても、エラー 4202 Set value on tuple key attribute is not allowedを返しました。このリリースでは、他の手段で更新を実行する時のチェックは、既にNdbRecordによって行われているように、データノードに渡されるようになりました。
    この変更は、NdbOperation::setValue()、NdbInterpretedCode::write_attr()、および列の値を設定するこれら2つのクラスの他のメソッド(NdbOperationメソッド incValue()、subValue()、NdbInterpretedCodeメソッド add_val()、sub_val()などを含む)、および、NdbOperationインターフェイスのOperationOptions::OO_SETVALUE拡張機能を使用したプライマリキーの更新の実行に適用されます。(バグ #35106292)

主なバグ修正

  • NDB Cluster API: デバッグログメッセージの印刷は、Ndb_cluster_connectionに対してデフォルトで有効になりました。(バグ #35416908)
    参考: バグ #35927も参照してください。
  • NDB Cluster API: NdbEventOperationの設定中に、アプリケーションによって提供されるバッファにポインタを渡すことができます。後でデータを受信すると、その指定された場所でデータが利用できるようになります。
    受信したデータは指定されたバッファの場所に適切に配置されましたが、NDB APIは実際には必要のない内部バッファも割り当てたため、最終的にリソースが無駄になりました。この問題は主に、アプリケーションが提供するバッファを使用したNdbEventOperation::getValue()およびgetPreValue()関数を使用してNDBからのデータ変更をサブスクライブするアプリケーションで発生します。
    この問題を解決するために、このような場合には内部バッファを割り当てなくなりました。(バグ #35292716)
  • 使用後にNdbEventOperationを削除すると、ndbclusterプラグインはまずオブジェクトのカスタムデータ領域を明示的にクリアするようになりました。(バグ #35424845)
  • NdbSocket::readln()でソケットが読み取り可能としてポーリングされた後、TLS層がアプリケーションデータを保持していない場合、SSL_peek()がカーネル内でブロックされる可能性がありました。この問題は、SSL_peek()中およびポーリング時にユーザーミューテックスのロックを解放することで修正されます。(バグ #35407354)
  • APIノードの接続(または再接続)を処理する時に、データノードはリクエストの送信が速すぎることが許可されたことをAPIノードに通知する可能性があり、その結果、リクエストが配信されず、その後、APIノードでタイムアウトになり、”Error 4008 Receive from Ndb failed”または”Error 4012 Request ndbd time-out, maybe due to high load or communication problems”などのエラーが発生します。 (バグ #35387076)
  • 警告出力で次の改善が行われました:
    • ローカルチェックポイント(LCP)の経過時間に加えて、何も進行せずに許容される最大時間も出力されるようになりました。
    • テーブル IDとフラグメント IDは未定義であるため、LCPがWAIT_END_LCP状態に達した場合には関係がなく、その時点では出力されなくなります。
    • 上限に達すると、同じ情報が警告情報とクラッシュ情報として2回表示されます。

    (バグ #35376705)

  • ndbclusterプラグイン内で実行されている長期スレッドのメモリ消費量は、データディクショナリにアクセスする時に増加しました。(バグ #35362906)
  • 接続に失敗すると、ndb_restoreがエラーメッセージを報告せずにコード 1で終了する可能性がありました。このような場合に適切なエラーメッセージを提供するようになりました。(バグ #35306351)
  • コミットされていないトランザクションに対して遅延トリガーが保留されたままになっている場合、後続のトランザクションは遅延トリガーの不必要なチェックを実行してリソースを浪費する可能性がありました。後者のトランザクションにコミット可能な操作がない場合、これによりデータノードが計画外にシャットダウンされる可能性がありました。
    これは、DBTCが使用する管理オブジェクトの制御状態が再初期化されない場合があるためでした。
    この問題は、そのようなオブジェクトが使用される前に状態の初期化が実行されるようにすることで修正されます。(バグ #35256375)
  • 非常に大きく重複する可能性のあるIN()リストとNOT IN()リストを特徴とするクエリ間のプッシュダウン結合は、SQLノードが予期せず終了する原因となりました。この問題を引き起こすためには、1つ以上のIN()(またはNOT IN())演算子が2500を超える引数を必要としました。(バグ #35185670、バグ #35293781)
  • サイズ MAX_KEY_SIZEのキーに割り当てられたバッファのサイズが不十分でした。(バグ #35155005)
  • 以前の問題の修正では、断片化された信号がV_QUERYブロックに送信されないことを保証するチェックが追加されましたが、このチェックでは、受信ノードがデータノードではない場合、ブロック番号が適用されないことが考慮されませんでした。(バグ #35154637)
    参考: この問題は、バグ #34776970のリグレッションです。
  • ndbclusterプラグインのログメッセージでは、ログレベルとしてSYSTEMが使用され、ロギング用のサブシステムとしてNDBが使用されるようになりました。これは、ndbclusterプラグインからの情報メッセージが常に出力されることを意味します。冗長性は--ndb_extra_loggingを使用して制御できます。(バグ #35150213)
  • log_error_verbosityが3(INFOレベル)以上の場合に、ndb_metadata_check_interval秒(デフォルトは60)ごとにSQLノードのエラーログに情報メッセージ ”Validating excluded objects”が出力されなくなりました。このようなメッセージがエラーログに溢れ、調査や過剰なディスク領域の使用が困難になる一方、追加の利点が得られないことが判明しました。(バグ #35103991)
  • ndbclusterハンドラーによるpush_warning_printf()への呼び出しの一部で重大度レベル ERRORが使用され、デバッグビルドでアサーションが発生しました。この修正により、そのような全ての呼び出しが代わりに重大度 WARNINGを使用するように変更されます。(バグ #35092279)
  • データノードとAPIまたは管理ノード間の接続が確立されているが、他のノードからデータノードへの通信のみが利用可能な場合、データノードはハートビートを受信しているため、他のノードを”live”とみなしますが、他のノードはハートビートを監視しておらず、そのため、接続に関する問題は報告されませんでした。これは、データノードが他のノードが(完全に)接続されていると誤って想定したことを意味します。
    この問題は、APIまたは管理ノード側で、最初のREGCONF信号を受信する前であってもデータノードの活性度の監視を開始することで解決します。もう一方のノードは100ミリ秒ごとにREGREQ信号を送信し、60秒以内にデータノードからREGCONFの応答を受信しなかった場合にのみ、ノードは切断されたと報告されます。(バグ #35031303)
  • ログには、DICT: index index number stats auto-update requestedの形式を持つ大量のメッセージが含まれており、更新を要求するDBTUXからレポートを受信する度にDBDICTブロックによって記録されました。これらのリクエストはテーブルへの書き込み中に立て続けに発生することが多く、この場合、同じインデックスに対する更新リクエストが重複してログに記録されている可能性があります。
    現在は、DBDICTが実際に計算を実行する直前に、そのようなメッセージをログに記録します。これにより、重複したメッセージが削除され、異なるインデックスに関連するメッセージが配置されます。この修正により追加のデバッグログメッセージも導入され、行われた決定と実行された計算の可視性が向上します。(バグ #34760437)
  • 2つのキーがバイナリ同一ではない場合のDblqh::handle_nr_copy()での比較チェックでは、キーに文字列が含まれていれば照合規則によって等しいものとして比較できますが、実際にはキーの存在はチェックされませんでした。これは、未定義のキーを使用してxfrm_key()を呼び出すことができることを意味しました。(バグ #34734627)
    参考: バグ #34681439も参照してください。この問題は、バグ #30884622のリグレッションです。
  • ローカルチェックポイント(LCP)は、終了フェーズ中にグローバルチェックポイント(GCP)が終了するのを一定時間待機するため、全てのノードが開始される前であっても実行されることがありました。
    さらに、GCPコーディネーターによって計算されたこの境界は、コーディネーター自体でのみ、またノードが開始された時(開始フェーズ 101)にのみ使用可能でした。
    これら2つの問題は、開始フェーズ 4の早い段階で境界を計算することで修正されます。GCP参加者も、ノードがクラスターに参加またはクラスターから離脱する度に境界を計算します。(バグ #32528899)

全ての変更点やバグ修正については、以下のページをご覧ください。
MySQL NDB Cluster 8.0.34 リリースノート(MySQLウェブサイト):
https://dev.mysql.com/doc/relnotes/mysql-cluster/8.0/en/news-8-0-34.html


MySQL Editions

MySQL Editions
MySQLのサブスクリプションは、24時間365日体制でお客様をサポートいたします。さらに MySQL Enterprise Edition では、データベース管理者支援ツール MySQL Enterprise Monitor やバックアップツール MySQL Enterprise Backup をご利用いただけます。