2023.01.27

MySQL

MySQL NDB Cluster 8.0.32 GA版(リリース日:2023年1月17日)

追加・変更された機能

  • ndb_configに--config-binary-fileオプションが追加されました。これにより、このプログラムは、管理サーバーのバイナリ設定キャッシュから設定情報を読み取ることができます。これは、例えば、config.iniファイルの現在のバージョンが実際に管理サーバーによって読み取られ、クラスターに適用されているかどうかを判断する場合などに役立ちます。(バグ #34773752)

主なバグ修正

  • パッケージ化: ndbxfrmのマニュアルページは、インストール後に存在しませんでした。(バグ #34520046)
  • Solaris; NDBクライアントプログラム: ndb_topは、Solarisプラットフォームに対して構築されませんでした。(バグ #34186837)
  • MySQL NDB ClusterJ: GCC 12.2を使用するUbuntu 22.10でClusterJをビルドできませんでした。(バグ #34666985)
  • 一部のコンテキストでは、データノードプロセスが他のプロセスによってSIGCHLDを送信される場合があります。以前は、データノードプロセスは、このシグナルをエラーとして扱うシグナルハンドラをバインドしていました。これにより、Kubernetes環境のフォアグラウンドで実行する場合(そしておそらく他の条件下でも同様に)、プロセスが予期せずシャットダウンする可能性がありました。これは、データノードプロセスが子プロセス自体を起動しないという事実にもかかわらず発生したため、このような場合にアクションを実行する必要はありません。
    これを修正するために、ハンドラはSIG_IGNを使用するように変更されました。これにより、子プロセスがクリーンアップされるはずです。

    注意
    mysqldおよびndb_mgmdプロセスは、SIGCHLDのハンドラをバインドしません。

    (バグ #34826194)

  • フラグメント化されたシグナルのバーチャル(V_QUERY)ブロックへの送信は、異なるシグナルフラグメントが最終的に異なるブロックインスタンスになる可能性があるため、サポートされていません。DBTCまたはDBSPJが、最終的にV_QUERYを使用する可能性があるLQHKEYREQまたはSCAN_FRAGREQシグナルを送信すると、シグナルがフラグメント化されているかどうかをチェックし、その場合、受信側をDBLQHのインスタンスに変更します。関数 SimulatedBlock::sendBatchedFragmentedSignal()は、同じチェックを使用して特定のシグナルをフラグメント化するかどうかを決定することを目的としていますが、そうはせず、予想されていなかったシグナルがフラグメント化され、V_QUERYを使用して送信され、その場合、受信時に失敗する可能性がありました。
    sendBatchedFragmentedSignal()で使用されるSimulatedBlock::sendFirstFragment()のサイズチェックを、DBTCおよびDBSPJ で実行されるチェックと一致させることで、この問題を修正します。(バグ #34776970)
  • DBSPJブロックがローカルデータマネージャーにSCAN_FRAGREQリクエストを送信する時、通常、recsPrKeys統計が利用可能な場合はこれらに基づいてフラグメントのサブセットのみを並行してスキャンし、統計が利用できない場合は単に推測します。
    SPJには、スキャンされたフラグメントの最初のラウンドから収集された結果を利用できるロジックが含まれています。SCAN_FRAGCONF応答が受信された後に並列処理統計が収集され、最初の一致の除去が、後続のラウンドでスキャンするために必要なキーを除去する場合があります。
    ローカルフラグメントのスキャンは、リモートフラグメントのスキャンよりもオーバーヘッドが少ないと予想されるため、ローカルフラグメントのスキャン並列処理の側で誤りを犯すことが望ましいです。これを利用するために、現在はフラグメントに対して2つのラウンドが行われます。最初のラウンドでは、SCAN_FRAGREQシグナルをローカルフラグメントのみに送信できるようにし、2番目のラウンドでは、そのようなシグナルを、それを期待する任意のフラグメントに送信できるようにします。(バグ #34768216)
    参照: バグ #34768191も参照してください。
  • 結合をデータノードにプッシュすると、クエリリクエストは、プッシュされたクエリの最初のテーブル(SPJルート)のローカルフラグメントを持つ全てのデータノードのSPJブロックに分散されます。各SPJブロックは、このルートテーブルのローカルフラグメントから適切な行を取得し、取得した行を使用して、その結合された子テーブルへのリクエストを生成します。ルートのローカルフラグメントから適切な行が取得されない場合、SPJはそれ以上実行する作業はありません。
    これは、ルートが少数の行を返すプッシュ結合の場合に、使用可能な並列処理を十分に活用していないアイドル状態のSPJ ワーカーが存在する可能性があることを意味します。このようなクエリでは、プッシュ結合に非常に小さなテーブルを含めないため、結合プランの次のテーブルがより大きい場合は、代わりにそのテーブルから始めます。(バグ #34723413)
  • ALTER TABLEオペレーションのコピーの安全性チェックでは、フラグメントごとのコミットカウント値の合計を使用して、一定期間にわたって特定のテーブルにコミットされた書き込みがあるかどうかを判断します。フラグメントレプリカのコミットカウントはノードの再起動時にリセットされるため、同じフラグメントの異なるレプリカは、時間の経過とともに必ずしも同じコミット数を持つとは限りません。
    読み取プライマリテーブルは、常に読み取りリクエストをテーブルのプライマリフラグメントレプリカにルーティングします。読み取りバックアップと完全に複製されたテーブルは、CommittedRead操作をバックアップフラグメントレプリカにルーティングできるようにすることで、読み取りを最適化します。これにより、読み取りバックアップと完全に複製されたテーブルに対して読み取りコミットカウントのセットが常に安定するとは限らず、ALTER TABLEの安全性チェックのコピーで誤検知エラーが発生する可能性があります。
    これは、ロッキングスキャンを使用してALTER TABLEの安全性チェックのコピーを実行することで解決されます。ロックされた読み取りは、毎回同じセットのプライマリ(メイン)フラグメントにルーティングされるため、これらのカウントが安定します。(バグ #34654470)
  • 管理クライアントでDROP NODEGROUPを実行した後、明示的なパーティション数を指定するかMAX_ROWSを使用して、NDBテーブルを作成または変更しようとすると、NDBからのGot error 771 'Given NODEGROUP doesn't exist in this cluster'で拒否されました。(バグ #34649576)
  • TYPE_NOTE_TRUNCATEDおよびTYPE_NOTE_TIME_TRUNCATEDは、NDB 8.0.27より前の場合のように、無視されるのではなくエラーとして扱われました。これにより、プッシュされた条件に対して解釈されたコードの構築が停止し、条件がサーバーに返されました。
    以前に行われたように、これらのステータスタイプの処理を無視するように戻すことで、これを修正します。(バグ #34644930)
  • クラスターに新しいデータノードを追加した後にALTER TABLE ... REORGANIZE PARTITIONを使用してテーブルを再編成する場合、ClassicFragmentation設定パラメータがOFFに設定されていると、フラグメントが適切に再分散されませんでした。(バグ #34640773)
  • src/common/util/ndb_zlib.cppの初期化されていないパディング変数を修正しました。(バグ #34639073)
  • パスワードが空のユーザーにNDB_STORED_USER権限が付与されると、他のSQLノードそれぞれのユーザーのパスワードが期限切れになりました。(バグ #34626727)
  • 複数の管理ノードを持つクラスターでは、1つの管理ノードが接続され、後で切断されると、残りの管理ノードはこのノードを認識せず、停止したノードが再接続された時に強制的にシャットダウンされました。これは、クラスターにまだライブデータノードがある場合にいつも発生しました。
    調査の結果、ノードの切断処理はConfigManagerのNF_COMPLETEREPパスで行われたが、予期されたNF_COMPLETEREPシグナルが実際に到着しなかったことが判明しました。NF_COMPLETEREPを待つのではなく、NODE_FAILREPシグナルが到着した時に管理ノードの切断を処理することで、これを解決します。(バグ #34582919)
  • --diff-defaultオプションとndb_configの関連オプションは、使用可能な出力を生成しませんでした。(バグ #34549189)
    参照: この問題はバグ #32233543のリグレッションです。
  • 一方のエンディアンを使用してシステムで作成された暗号化されたバックアップは、他方のエンディアンを使用するシステムでは復元できませんでした。例えば、x86システムで取得された暗号化されたバックアップは、SPARCシステムでは復元できず、その逆もできませんでした。(バグ #34446917)
  • INサブクエリでプッシュ結合を使用するクエリは、ndb_join_pushdown=ONおよびBatchSize SQLノードパラメータが1などの非常に小さな値に設定されている場合、期待される結果を返しませんでした。(バグ #34231718)
  • バイナリログトランザクションを定義すると、トランザクションは、バイナリログファイルにフラッシュされる前に、メモリ内のバイナリログキャッシュに保持されます。バイナリログトランザクションがキャッシュのサイズを超えると、それはバイナリログスレッドの初期化の早い段階でセットアップされる一時ファイルに書き込まれます。この書き込みにより、バイナリログインジェクタパスに余分なディスク I/Oが導入されます。Binlog_cache_disk_useシステムステータス変数の値をチェックすることによって、バイナリログインジェクタによってグローバルに実行されたディスク書き込みの数を確認できますが、そうしなければ、NDBハンドラのバイナリログインジェクタスレッドはこれを観察する方法がありませんでした。
    Binlog_cache_disk_useはバイナリログインジェクタからアクセスできるため、トランザクションがコミットされる前後の両方でチェックされ、その値に変更があったかどうかを確認できます。キャッシュスピルが発生した場合、これは2つの値の差によって反映され、バイナリログインジェクタースレッドはそれを報告できます。(バグ #33960014)
  • ファイル全体を読み取った後、圧縮または暗号化された形式を使用してファイルを閉じる時は、そのチェックサムを確認してください。(バグ #32550145)
  • クラスターに新しいデータノードを追加した後にALTER TABLE ... REORGANIZE PARTITIONを使用してテーブルを再編成すると、一意のハッシュインデックスが適切に再分散されませんでした。(バグ #30049013)
  • 部分的なローカルチェックポイントの場合、各フラグメントLCPは、LCPの開始時のフラグメントの正確な状態と、現在のLCPの開始と前のLCPの開始との間のフラグメントの正確な差を判別できる必要があります。これは、行ヘッダー情報とページヘッダー情報を使用して追跡されます。物理ページが削除された場合、これは論理ページマップ情報でも追跡されます。
    現在のLCPに含まれるページは、LCPスキャンがそれに到達する前に、フラグメントに対する何らかの操作のコミットまたはロールバックにより解放され、ページで最後に使用されたストレージも解放されます。
    解放されたページがスキャンで見つからなかったため、現在のLCPの観点からページが既に処理されていることを示すために、その解放自体がマッピングされた先のページマップエントリのLCP_SCANNED_BITを設定し、LCP中にエントリにマップされたページのその後の割り当てと解放は無視されます。LCPの開始時のエントリの状態も、ページマップエントリに割り当てられているように設定されました。
    これらの設定は、次のLCPが準備された時にのみクリアされます。クリアランスの前にページマップエントリに関連付けられたページの解放は、ビットが設定されていないという要件に違反します。(誤った)要件を削除することで、この問題を解決します。(バグ #23539857)
  • ノードが既にシャットダウンしている時にスレッド活性ウォッチドッグがトリガーされると、データノードが過度に厳密なアサーションにヒットする可能性がありました。このような場合、このアサーションを緩和することで問題を修正します。(バグ #22159697)
  • インデックス統計を更新するためにインデックスがスキャンされる度に発生していた長いメッセージバッファメモリのリークを削除しました。(バグ #108043、バグ #34568135)
  • Backup::get_total_memory()は、チェックポイントの提案されたディスク書き込み速度を計算するために使用されますが、LDMによって使用されるメモリの計算に使用されない可能性があるDataMemoryと誤って見なされました。
    代わりに、LDMスレッドによって使用されるDataMemoryの合計を取得することで、これを修正します。DBTUPによって報告されるとおりに。(バグ #106907、バグ #34035805)
  • Suma.cppの初期化されていない変数を修正しました。(バグ #106081、バグ #33764143)

全ての変更点やバグ修正については、以下のページをご覧ください。
MySQL NDB Cluster 8.0.32リリースノート(MySQLウェブサイト):

https://dev.mysql.com/doc/relnotes/mysql-cluster/8.0/en/news-8-0-32.html


MySQL Editions

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