2020.06.12

MySQL

MySQL NDB Cluster 8.0.20 GA版(リリース日:2020年4月27日)

主な変更点

■ 追加・変更された機能

● 重要な変更:ndb_restoreユーティリティに実装された2つの新しいオプションを使用して、バックアップをスライスに分割し、これらを並行して復元できるようになりました。これは、ndb_restoreの複数のインスタンスを使用して、ほぼ同じサイズのバックアップのサブセットを並行して復元できるようにし、NDB Clusterをバックアップから復元するために必要な時間を削減するのに役立ちます。--slice-idは、ndb_restoreによって復元されるスライスのID(スライス数よりも0から1少ない数)を提供します。

 最大1024のスライスがサポートされています。

 (Bug #30383937)

● 重要な変更:更新操作の処理速度を上げるために、NDBはノードグループごとに複数のトランスポーターをサポートし、デフォルトで使用するようになりました。デフォルトでは、クラスタ内の各ノードグループで使用されるトランスポーターの数は、ローカルデータ管理(LDM)スレッドの数と同じです。この数はほとんどのユースケースで最適であるはずですが、本リリースで導入されたNodeGroupTransportersデータノード設定パラメーターの値を設定することで調整できます。最大数は、LDMスレッド数またはTCスレッド数のいずれかの大きい方で、全体で最大32個のトランスポーターです。

● NDBクライアントプログラム:ndb_blob_toolユーティリティに2つのオプションが追加され、インラインパーツが存在する欠落しているBLOBパーツを検出し、これらを正しい長さのプレースホルダーBLOBパーツ(スペース文字で構成)に置き換えることができます。欠落しているBLOBパーツがあるかどうかを確認するためには、ndb_blob_tool --check-missingオプションを使用します。欠落しているblobパーツをプレースホルダーで置き換えるためには、本リリースで追加されたプログラムの--add-missingオプションを使用します。 (Bug #28583971)

● NDBクライアントプログラム:NDBTライブラリのndb_waiterおよびndb_show_tablesユーティリティプログラムから依存関係を削除しました。NDB開発でテスト用に使用されるこのライブラリは、通常使用には必要ありません。この変更によるユーザーへの目に見える影響は、これらのプログラムがNDBT_ProgramExit - 実行の完了後のステータスを出力しないことです。この動作に依存するアプリケーションは、本リリースにアップグレードする時に、この変更を反映するように更新する必要があります。

● MySQL NDB ClusterJ:ClusterJによって使用されるいくつかのJava APIが、最近のJavaバージョンで非推奨になりました。これらの調整がClusterJに対して行われました。

  ・全てのClass.newInstance()呼び出しをClass.getDeclaredConstructor().newInstance()呼び出しに置き換えました。また、必要に応じて例外処理とテストケースを更新しました。
  ・Stringまたはプリミティブ型からオブジェクトをインスタンス化するNumberクラスのコンストラクタが全て非推奨になりました。そのような全ての非推奨のインスタンス化呼び出しを、対応するvalueOf()メソッド呼び出しに置き換えました。
  ・Proxy.getProxyClass()を非推奨にしました。DomainTypeHandlerImplクラスは、Proxy.newProxyInstance()メソッドを使用して新しいインスタンスを直接作成するようになりました。Proxyクラスとそのコンストラクタへの全ての参照がDomainTypeHandlerImplクラスから削除されます。SessionFactoryImplクラスは、Proxyクラスを使用するのではなく、プロキシオブジェクトの基礎となるインターフェイスを使用してドメインクラスを識別します。DomainTypeHandlerFactoryTestも更新されました。
  ・finalize()メソッドは、非推奨になりました。このパッチは、オーバーライドするfinalize()メソッドを変更しませんが、それらに対する警告を抑制します。この非推奨は、今後のパッチで個別に処理されます。
  ・CMakeの設定を更新し、ClusterJのコンパイル時に非推奨の警告をエラーとして扱うようにしました。

 (Bug #29931625)

● MySQL NDB ClusterJ:ClusterJがMySQL NDB Cluster 8.0に対してサポートする最小Javaバージョンは、Java 8になりました。 (Bug #29931625)

● MySQL NDB ClusterJ:未使用のantlr3プラグインがClusterJ pomファイルから削除されました。 (Bug #29931625)

● NDBはndbinfoテーブルのバージョン管理をサポートし、そのテーブルの現在の定義を内部で維持します。起動時に、NDBはサポートされているndbinfoバージョンをデータディクショナリに保存されているバージョンと比較します。バージョンが異なる場合、NDBは古いndbinfoテーブルを削除し、現在の定義を使用してそれらを再作成します。

● 以前はデータノードにプッシュダウンできなかった多くの外部結合とセミ結合をプッシュできるようになりました。

 プッシュできるようになった外部結合には、次の条件を満たすものが含まれます。

  ・このテーブルにはプッシュされない条件がない
  ・同じ結合ネスト内、または、それが依存する上位結合ネスト内の他のテーブルにはプッシュされない条件がない。
  ・同じ結合ネスト内、または、それが依存する上位結合ネスト内の他の全てのテーブルもプッシュされる。

 インデックススキャンを使用するセミ結合は、プッシュされる外部結合に関する上記の条件を満たし、firstMatchストラテジーを使用する場合、プッシュできるようになりました。

 参照:Bug #28728603、Bug #28672214、Bug #29296615、Bug #29232744、Bug #29161281、Bug #28728007。

● 適応型CPUスピンを有効にして設定するために、新しく簡素化されたインターフェースが実装されています。本リリースで追加されたSpinMethodデータノードパラメータは、以下の4つの設定を提供します。

  ・StaticSpinning:適応型スピニングを無効にします。以前のMySQL Clusterリリースで使用されていた静的スピニングを使用します。
  ・CostBasedSpinning:コストベースのモデルを使用して適応型スピニングを有効にします。
  ・LatencyOptimisedSpinning:レイテンシ用に最適化された適応型スピニングを有効にします。
  ・DatabaseMachineSpinning:データベースをホストするマシン用に最適化された適応型スピニングを有効にします。各スレッドには独自のCPUがあります。

 これらの各設定により、データノードは、必要に応じて、ここにリストされている1つ以上のスピンパラメータに対して、事前に定義された値のセットを使用します。

  ・SchedulerSpinTimer:この名前のデータノード設定パラメータ。
  ・EnableAdaptiveSpinning:適応型スピニングを有効または無効にします。クラスタ設定ファイルで直接設定することはできませんが、DUMP 104004を使用して直接制御できます。
  ・SetAllowedSpinOverhead:レイテンシを得ることができるようにするためのCPU時間。config.iniファイルで直接設定することはできませんが、DUMP 104002を使用して直接変更できます。

 SpinMethodから利用可能なプリセットは、ほとんどのユースケースをカバーしますが、SchedulerSpinTimerデータノード設定パラメーターと上記のDUMPコマンド、およびndb_mgmクラスタ管理クライアントの追加のDUMPコマンドを使用して、適応型スピン動作を微調整できます。

 NDB 8.0.20は、新しいTCP設定パラメータTcpSpinTimeも追加します。これは、特定のTCP接続でスピンする時間を設定します。これを使用して、データノード、管理ノード、SQLノードまたはAPIノードの間のそのような接続に対して適応型スピンを有効にすることができます。

 ndb_topツールも拡張され、スレッドごとのスピン時間情報を提供するようになりました。これはターミナルウィンドウに緑色で表示されます。

■ バグ修正

● 重要な変更:lower_case_table_namesが0に設定されている時、クエリ内の外部キー名の大文字小文字がそれらが作成された時に使用された文字と異なる場合にそのクエリを発行すると、クラスタの計画外のシャットダウンが発生しました。これは、mysqldが外部キー名を大文字と小文字を区別するファイルシステム上でも大文字と小文字を区別しないものとして扱うという事実が原因でした。一方、NDBディクショナリが外部キー名を格納する方法は、lower_case_table_namesの値に依存していたため、これが0に設定されていると、ルックアップ中に、NDBは全ての外部キー名の大文字小文字が、それらが作成された時に使用された文字と一致することを期待していました。大文字小文字が異なる外部キー名は、MySQLデータディクショナリで検出されても、NDBディクショナリで検出されず、前述のNDBCLUSTERの問題が発生しました。

 lower_case_table_namesが1または2に設定されている場合、この問題は発生しませんでした。

 この問題は、外部キー名の大文字と小文字を区別せず、lower_case_table_namesへの依存を削除することにより修正されています。これは、以下の2つの項目が常に正しいことを意味します。

  a. 外部キー名は、lower_case_table_namesの値に関係なく、それらが作成された時に使用されたのと同じ大文字小文字を使用して保存されるようになりました。
  b. NDBによる外部キー名の検索で、常に大文字と小文字が区別されなくなりました。

 (Bug #30512043)

● パッケージング:mysql-cluster-community-server-minimal RPMパッケージからPerlへの不要な依存関係を削除しました。 (Bug #30677589)

● パッケージング:NDBは、std::isnan()ではなくisnan()を使用しているため、GCC 5.4がインストールされたUbuntu 16.04で正常にコンパイルされませんでした。 (Bug #30396292)

 参照:この問題は、Bug #30338980のリグレッションです。

● OS X:NDBソースで1度だけ使用されたり、Mac OSXでビルドする時にコンパイル警告を引き起こした変数SCHEMA_UUID_VALUE_LENGTHを削除しました。この変数はUUID_LENGTHに置き換えられました。 (Bug #30622139)

● NDBディスクデータ:テーブルスペースデータファイル内のエクステントの割り当てが、テーブルスペースによって使用される全てのデータファイル間でラウンドロビン方式で実行されるようになりました。これにより、複数のストレージデバイスがディスクデータストレージに使用される場合に、データの分散がより均等になります。 (Bug #30739018)

● NDBディスクデータ:特定の状況下で、ディスクデータテーブルのチェックポイントを完了できず、データノードが計画外にシャットダウンされました。 (Bug #30728270)

● NDBディスクデータ:初期化されていない変数により、クラスタの再起動後にディスクデータDDL操作を実行すると問題が発生しました。 (Bug #30592528)

● MySQL NDB ClusterJ:Date値がNDBクラスタから読み取られた時、ClusterJが誤った年の値を行から抽出することがありました。これは、UtilityクラスがDate値をアンパックする時に、年に関する必要以上のビットを誤って抽出したためです。このパッチはClusterJに必要なビットのみを抽出させます。 (Bug #30600320)

● MySQL NDB ClusterJ:クラスタのNdbOperation::AbortOptionタイプがAO_IgnoreOnErrorの値を持つ場合、読み取りエラーが発生すると、行が見つからなかったためにClusterJはそれを受け取り、例外の代わりにnullを返しました。これは、AO_IgnoreOnErrorを使用すると、execute()メソッドが各トランザクションの後に常に成功コードを返し、ClusterJが個々の操作のいずれかでエラーをチェックすることになっているためです。ただし、この場合、読み取り操作はClusterJによってチェックされませんでした。このパッチでは、クエリの実行後に読み取り操作のエラーがチェックされるため、読み取りエラーが報告されます。 (Bug #30076276)

● MySQLオプティマイザの以前の問題に対する修正は、NDBストレージエンジンのエンジンコンディションプッシュダウンに悪影響を及ぼしました。 (Bug #303756135)

 参照:この問題は、Bug #97552, Bug #30520749のリグレッションです。

● 署名付きの自動インクリメント列を復元する時、ndb_restoreはデータに含まれる最大値を決定する時に誤って負の値を処理しました。 (Bug #30928710)

● 以前は(NDB 7.6.4より前)、SPJワーカーインスタンスはプッシュされた結合のルートテーブルのフラグメントごとにアクティブ化されていました。しかし、NDB 7.6以降では、1つのワーカーが各データノードに対してアクティブ化され、そのデータノードの全てのフラグメントを処理します。

 この変更が行われる前は、全てのSPJワーカーが全てのローカルデータマネージャースレッドをビジー状態に保つためには、そのような各ワーカーが並列処理が1のフラグメントをスキャンするだけで十分でした。変更の結果としてワーカーの数が減少した場合、並列度を維持するためには、最小並列処理がワーカーごとのフラグメント数と同じになるように増やされる必要がありました。

 この修正により、これは確実に実行されるようになりました。 (Bug #30639503)

● ndb_metadata_syncシステム変数は、MySQLデータディクショナリとNDBディクショナリの間のメタデータの同期をトリガーするためには、trueに設定されます。同期が完了すると、これが終了したことを示すために、変数は自動的にfalseにリセットされます。MySQLデータディクショナリに存在しないがNDBディクショナリで使用されているスキーマの検出に関する1つのシナリオでは、このスキーマに属するすべてのテーブルが正常に同期される前にndb_metadata_syncがリセットされる場合がありました。 (Bug #30627292)

● 共有ユーザーと許可を使用する時、プレーンテキストのパスワードが含まれているかどうかに関係なく、全てのALTER USERステートメントがスナップショットとして配布されました。

 さらに、SHOW CREATE USERには、ゼロに設定されたリソース制限(MAX_QUERIES_PER_HOURなど)が含まれていませんでした。つまり、これらはSQLノード間で分散されていませんでした。 (Bug #30600321)

● QMGRでのロギングに使用される2つのバッファのサイズが不十分でした。 (Bug #30598737)

 参照:Bug #30593511。

● SPJに関連する無関係なデバッグ出力をノード出力ログから削除しました。 (Bug #30572315)

● NDB Clusterの初期再起動を実行すると、SQLノードとしてそれに接続された各MySQLサーバーが再起動を認識し、ndb_schemaテーブルをデータディクショナリから再インストールし、その後再起動の前に作成された全てのNDBスキーマ定義をクリアします。 データディクショナリがndb_schemaが再インストールされた後にのみクリアされたため、ndb_schemaが再起動が実行される前からのテーブルの1つと同じテーブルIDを持つことが原因で、インストールが失敗する場合がありました。この問題は、ndb_schemaテーブルが再インストールされる前にデータディクショナリが確実にクリアされることで修正されています。 (Bug #30488610)

● オプティマイザがテーブルを一時テーブルに事前ソートすることを決定した場合、後のテーブルが結合される前に、ソートされるテーブルがプッシュ結合の一部であってはなりません。ロジックがこのようなクエリプランを検出するために抽象クエリプランインターフェースに存在していましたが、これは一時テーブルへのfilesortを使用する全ての状況を正しく検出しませんでした。これは、filesort記述子が設定されているかどうかをチェックするように変更されました。その場合、テーブルのコンテンツは、テーブルにアクセスする最初のステップとして一時ファイルにソートされます。これにより、結合の構造の解釈が大幅に簡素化されます。また、ソートされるテーブルがプッシュ結合の一部である場合も検出します。これにより、このインターフェースでの今後のリグレッションが防止されます。 (Bug #30338585)

● ノードID割り当てリクエストがNotMaster一時エラーで失敗した場合、ノードID割り当てはエラーの原因に関係なく常にすぐに再試行され、非常に高い率で再試行が実行されました。その影響は、ノードnnnのAllocノードIDの過剰な数の失敗したログメッセージ(1秒あたり約15,000メッセージ)として観察できます。 (Bug #30293495)

● NDBテーブルに明示的なプライマリキーがない場合、NdbReceiverBufferが小さすぎるサイズで割り当てられる可能性がありました。これは、データノードからNDBに送信される属性ビットマップに常にプライマリキーが含まれていることが原因です。このような場合に、非表示のプライマリキーに必要な追加のスペースが考慮されるようになりました。 (Bug #30183466)

● 以前のバージョンのNDB Clusterで.frmファイルを使用して作成されたNDBテーブルを変換し、それをテーブルオブジェクトとしてMySQLデータディクショナリに格納する場合、MySQLデータディクショナリのテーブルインデックスと、同じテーブルのNDBディクショナリを表すもののテーブルインデックスとの間に不一致が検出された場合でも、テーブルオブジェクトがコミットされる可能性がありました。この問題は、この方法でテーブルメタデータをアップグレードする必要がないNDB 8.0で作成されたテーブルでは発生しませんでした。

 この問題は、元のテーブルがメタデータを格納するために.frmファイルを使用して作成されたか使用せずに作成されたかに関係なく、テーブルオブジェクトがコミットされる前にそのような全ての比較が実際に実行されることを確実にすることで修正されています。 (Bug #29783638)

● NDBは、インデックス統計を含むノードのリストが順序付けられていると想定する場合がありましたが、このリストは全てのノードで常に同じ方法で順序付けされているとは限りません。これは、NDBがインデックス統計を更新するリクエストを無視する場合があったことを意味し、インデックス統計テーブルのデータが古くなる可能性がありました。 (Bug #3044482)

● クラスタメタデータの取得時に発生したエラーにより、メモリリークが発生しました。 (Bug #97737, Bug #30575163)

MySQL NDB Cluster 8.0.20リリースノート(MySQLウェブサイト): https://dev.mysql.com/doc/relnotes/mysql-cluster/8.0/en/news-8-0-20.html

MySQL Editions

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

MySQL Editionsの詳細