TiDB 5.2 リリースノート
発売日:2021年8月27日
TiDB バージョン: 5.2.0
バージョン5.2の主な新機能と改善点は以下のとおりです。
- 式インデックスで複数の関数を使用することをサポートし、クエリのパフォーマンスを大幅に向上させます。
- 最適な実行計画の選択を支援するために、オプティマイザのカーディナリティ推定の精度を向上させます。
- トランザクションのロックイベントを監視し、デッドロックの問題をトラブルシューティングするためのロックビュー機能の一般提供(GA)を発表します。
- TiFlashの読み書きの安定性を向上させるため、 TiFlash I/Oトラフィック制限機能を追加しました。
- TiKVは、従来のRocksDB書き込み停止メカニズムに代わる新しいフロー制御メカニズムを導入し、TiKVフロー制御の安定性を向上させています。
- データ移行(DM)の運用と保守を簡素化し、管理コストを削減します。
- TiCDCは、TiCDCタスクの管理にHTTPプロトコルOpenAPIをサポートしています。これにより、Kubernetes環境とセルフホスト環境の両方において、よりユーザーフレンドリーな操作方法を提供します。(Experimental機能)
互換性の変更
システム変数
コンフィグレーションファイルパラメータ
その他
- アップグレードの前に、
tidb_evolve_plan_baselinesシステム変数の値がONであるかどうかを確認してください。値がONの場合は、OFFに設定してください。そうでない場合、アップグレードは失敗します。 - TiDB クラスターを v4.0 から v5.2 にアップグレードすると、
tidb_multi_statement_modeのデフォルト値がWARNからOFFに変更されます。 - アップグレード前に、TiDB 設定の
feedback-probabilityの値を確認してください。値が0でない場合、アップグレード後に「panic in the recoverable goroutine」というエラーが発生しますが、このエラーはアップグレードには影響しません。 - TiDBはMySQL 5.7のnoop変数
innodb_default_row_formatと互換性を持つようになりました。この変数を設定しても効果はありません。 #23541 - TiDB 5.2以降では、システムセキュリティを向上させるため、クライアントからの接続のトランスレイヤーを暗号化することが推奨されています(必須ではありません)。TiDBは、TiDB内で暗号化を自動的に構成および有効化するAuto TLS機能を提供します。Auto TLS機能を使用するには、TiDBのアップグレード前に、TiDB構成ファイルの
security.auto-tlsをtrueに設定してください。 - MySQL 8.0 からの移行を容易にし、セキュリティを向上させるために、
caching_sha2_password認証方式をサポートします。
新機能
SQL
式インデックスで複数の関数を使用することをサポートします。
式インデックスは、式に基づいて作成できる特殊なインデックスの一種です。式インデックスが作成されると、TiDBは式ベースのクエリをサポートし、クエリのパフォーマンスを大幅に向上させます。
Oracleの
translate関数をサポートするtranslate関数は、文字列内のすべての文字を他の文字に置き換えます。TiDB では、この関数は Oracle のように空文字列をNULLとして扱いません。HashAggのスピルをサポート
HashAgg をディスクに書き出す機能をサポートします。HashAgg オペレーターを含む SQL 文でメモリ不足 (OOM) が発生した場合、このオペレーターの同時実行数を
1に設定してディスクへの書き出しをトリガーし、メモリ負荷を軽減することができます。オプティマイザのカーディナリティ推定の精度を向上させる
TiDBのTopN/Limit推定精度を向上させます。例えば、
order by col limit x条件を含む大規模テーブルに対するページネーションクエリの場合、TiDBは適切なインデックスをより容易に選択し、クエリ応答時間を短縮できます。範囲外推定の精度を向上させます。たとえば、1日の統計情報が更新されていなくても、TiDB は
where date=Now()を含むクエリに対して対応するインデックスを正確に選択できます。オプティマイザが Limit/TopN をプッシュダウンする動作を制御するために
tidb_opt_limit_push_down_threshold変数を導入します。これにより、誤った推定のために一部の状況で Limit/TopN をプッシュダウンすることができないという問題が解決されます。
オプティマイザのインデックス選択を改善する
インデックス選択のためのプルーニングルールを追加します。TiDBは、比較統計を使用する前に、これらのルールを使用して選択可能なインデックスの範囲を絞り込み、最適でないインデックスを選択する可能性を低減します。
トランザクション
Lock ビューの一般提供開始(GA)
ロックビュー機能は、悲観的ロックのロック競合とロック待機に関する詳細情報を提供し、DBAがトランザクションのロックイベントを監視し、デッドロックの問題をトラブルシューティングするのに役立ちます。
バージョン5.2では、ロックビューに以下の機能強化が加えられました。
ロックビュー関連テーブルのSQLダイジェスト列に加えて、対応する正規化されたSQLテキストを表示する列をこれらのテーブルに追加してください。SQLダイジェストに対応するステートメントを手動でクエリする必要はありません。
TIDB_DECODE_SQL_DIGESTS関数を追加して、クラスタ内の一連の SQL ダイジェストに対応する正規化された SQL文 (フォーマットや引数のない形式) を照会します。これにより、トランザクションによって過去に実行された文の照会操作が簡素化されます。DATA_LOCK_WAITSおよびDEADLOCKSシステムテーブルに、テーブル名、行 ID、インデックス値、およびキーから解釈されるその他のキー情報を表示する列を追加します。これにより、キーが属するテーブルの検索やキー情報の解釈などの操作が簡素化されます。DEADLOCKSテーブルで再試行可能なデッドロックエラーの情報を収集する機能をサポートします。これにより、そのようなエラーによって発生する問題のトラブルシューティングが容易になります。エラー収集はデフォルトでは無効になっており、pessimistic-txn.deadlock-history-collect-retryable設定を使用して有効にできます。TIDB_TRXシステムテーブルで、クエリ実行中のトランザクションとアイドル状態のトランザクションを区別できるようにしました。Normal状態はRunningとIdleの状態に分割されました。ユーザー向けドキュメント:
クラスタ内のすべての TiKV ノードで発生している悲観的ロック待機イベントを確認する:
DATA_LOCK_WAITSTiDBノードで最近発生したデッドロックエラーを確認する:
DEADLOCKSTiDBノードで実行中のトランザクションを確認する:
TIDB_TRX
AUTO_RANDOMまたはSHARD_ROW_ID_BITS属性を持つテーブルにインデックスを追加するユーザーシナリオを最適化します。
安定性
TiFlashのI/Oトラフィック制限を追加する
この新機能は、ディスク帯域幅が小さく特定のサイズのクラウドストレージに適しています。デフォルトでは無効になっています。
TiFlash I/Oレートリミッターは、読み取りタスクと書き込みタスク間のI/Oリソースの過剰な競合を回避するための新しいメカニズムを提供します。読み取りタスクと書き込みタスクへの応答のバランスを取り、読み取り/書き込みワークロードに応じてレートを自動的に制限します。
TiKV流量制御の安定性を向上させる
TiKVは、従来のRocksDBの書き込み停止メカニズムに代わる新しいフロー制御メカニズムを導入しました。この新しいメカニズムは、従来の書き込み停止メカニズムと比較して、フォアグラウンド書き込みの安定性への影響を軽減します。
具体的には、RocksDBの圧縮による負荷が蓄積した場合、以下の問題を回避するために、RocksDBレイヤーではなくTiKVスケジューラレイヤーでフロー制御が実行されます。
Raftstoreが停止していますが、これはRocksDBの書き込み停止が原因です。
Raftの選挙がタイムアウトし、その結果、ノードリーダーが移管されます。
この新しいメカニズムは、書き込みトラフィックが多い場合にQPS(1秒あたりのクエリ数)が低下するのを軽減するために、フロー制御アルゴリズムを改善します。
クラスタ内の単一の低速なTiKVノードによって引き起こされる影響を自動的に検出し、復旧する
TiKVは、スローノード検出メカニズムを導入しました。このメカニズムは、TiKV Raftstoreのレートを検査してスコアを計算し、ストアハートビートを通じてPDにスコアを報告します。同時に、PDに
evict-slow-store-schedulerスケジューラを追加し、単一のスローTiKVノード上のリーダーを自動的に排除します。これにより、クラスタ全体への影響が軽減されます。また、スローノードに関するアラート項目がさらに追加され、問題の迅速な特定と解決に役立ちます。
データ移行
データ移行(DM)の作業を簡素化する
DM v2.0.6は、VIPを使用してデータソースの変更イベント(フェイルオーバーまたはプラン変更)を自動的に識別し、新しいデータソースインスタンスに自動的に接続することで、データレプリケーションのレイテンシーを削減し、操作手順を簡素化できます。
TiDB Lightningは、CSVデータにおけるカスタム改行文字をサポートしており、MySQLのLOAD DATA CSVデータ形式と互換性があります。そのため、データフローアーキテクチャ内でTiDB Lightningを直接使用できます。
TiDBデータ共有サブスクリプション
TiCDCは、HTTPプロトコル(OpenAPI)を使用してTiCDCタスクを管理する機能をサポートしており、Kubernetes環境とセルフホスト環境の両方において、よりユーザーフレンドリーな操作方法を提供します。(Experimental機能)
デプロイと運用
Apple M1チップを搭載したMacコンピュータでtiup playgroundコマンドを実行することをサポートします。
機能強化
ツール
TiCDC
TiDB Lightning
Dumpling
- MySQL互換データベースのバックアップをサポートしますが、
START TRANSACTION ... WITH CONSISTENT SNAPSHOTまたはSHOW CREATE TABLEはサポートしません #311
- MySQL互換データベースのバックアップをサポートしますが、
改善点
TiDB
- TiKV への組み込み関数
json_unquote()のプッシュダウンをサポートする #24415 - デュアルテーブルから
unionブランチを削除することをサポートします #25614 - 集約事業者のコスト係数を最適化する #25241
- MPP外部結合で、テーブルの行数に基づいて構築テーブルを選択できるようにする #25142
- リージョンに基づいて、異なるTiFlashノード間でMPPクエリワークロードのバランスを取ることをサポートする #24724
- MPPクエリ実行後にキャッシュ内の古いリージョンを無効化する機能をサポートする #24432
- フォーマット指定子
%b/%M/%r/%Tに対する組み込み関数str_to_dateの MySQL 互換性を向上させる #25767 - 同じクエリに対して異なるバインディングを再作成した後に、複数の TiDB で一貫性のないバインディング キャッシュが作成される可能性がある問題を修正します #26015
- アップグレード後に既存のバインディングをキャッシュにロードできない問題を修正しました #23295
SHOW BINDINGSの結果を (original_sql、update_time) で並べ替えることをサポートする #26139- バインディングが存在する場合のクエリ最適化ロジックを改善し、クエリの最適化時間を短縮する #26141
- "deleted"ステータスのバインディングに対してガベージコレクションを自動的に完了する機能をサポートする #26206
EXPLAIN VERBOSEの結果で、バインディングがクエリ最適化に使用されているかどうかを表示する機能のサポート #26930- 現在の TiDB インスタンスのバインディング キャッシュに対応するタイムスタンプを表示するための新しいステータス バリエーション
last_plan_binding_update_timeを追加します #26340 - バインディング進化の開始時、またはベースライン進化を禁止する
admin evolve bindings実行時にエラーを報告する機能をサポートする(現在、実験的機能であるため、TiDB Self-Managed バージョンでは無効になっている)。これにより、他の機能に影響が出る。 #26333
- TiKV への組み込み関数
PD
TiFlash
- 演算子を追加します:
MOD / %、LIKE - 文字列関数を追加します:
ASCII()、COALESCE()、LENGTH()、POSITION()、TRIM() - 数学関数を追加します:
CONV()、CRC32()、DEGREES()、EXP()、LN()、LOG()、LOG10()、LOG2()、POW()、RADIANS()、ROUND(decimal)、SIN()、MOD() - 日付関数を追加します:
ADDDATE(string, real)、DATE_ADD(string, real)、DATE() - その他の関数を追加します:
INET_NTOA()、INET_ATON()、INET6_ATON、INET6_NTOA() - 新しい照合順序が有効になっている場合、MPP モードでシャッフルハッシュ結合計算とシャッフルハッシュ集計計算をサポートします。
- MPPのパフォーマンスを向上させるために基本コードを最適化します
STRING型からDOUBLE型へのキャストをサポートします。- 複数のスレッドを使用して、右外部結合における非結合データを最適化する
- MPPクエリにおける古いリージョンの自動無効化をサポートする
- 演算子を追加します:
ツール
TiCDC
Dumpling
バグ修正
TiDB
SET型の列でマージ結合を使用した場合に誤った結果が返される問題を修正しました #25669IN式の引数におけるデータ破損の問題を修正しました #25591- GCセッションがグローバル変数の影響を受けないようにする #24976
- ウィンドウ関数クエリで
limitを使用した場合に発生するpanic問題を修正しました #25344 Limitを使用してパーティションテーブルをクエリしたときに返される誤った値を修正する #24636IFNULLがENUMまたはSETタイプの列に正しく適用されない問題を修正します。 #24944- 結合サブクエリ内の
countをfirst_rowに変更したことで発生した誤った結果を修正します #24865 ParallelApply演算子の下でTopNを使用した場合に発生するクエリのハング問題を修正します #24930- 複数列プレフィックスインデックスを使用したSQL文の実行時に、予想よりも多くの結果が返される問題を修正しました #24356
<=>演算子が正しく機能しない問題を修正しました #24477- 並列演算子
Applyのデータ競合問題を修正 #23280 - PartitionUnion オペレーターの IndexMerge 結果をソートする際に
index out of rangeエラーが報告される問題を修正しました #23919 tidb_snapshot変数に予想外に大きな値を設定するとトランザクション分離が損なわれる可能性がある問題を修正しました #25680- ODBC スタイルの定数 (例:
{d '2020-01-01'}) を式として使用できない問題を修正しました #25531 SELECT DISTINCTBatch Getに変換されることで誤った結果が生じる問題を修正します #25320- TiFlashからTiKVへのバックオフクエリがトリガーできない問題を修正#23665 #24421
only_full_group_byをチェックした際に発生するindex-out-of-rangeエラーを修正します#23839- 相関サブクエリにおけるインデックス結合の結果が間違っている問題を修正しました #25799
TiKV
PD
TiFlash
- 分割エラーが原因でTiFlashが再起動を繰り返す問題を修正します。
- TiFlashがデルタデータを削除できない可能性のある問題を修正します。
- TiFlashが
CAST関数で非バイナリ文字に誤ったパディングを追加するバグを修正しました。 - 複雑な
GROUP BY列を含む集計クエリを処理する際に、結果が正しくない問題を修正しました。 - 書き込み負荷が高い場合に発生するTiFlash panic問題を修正します。
- 右側の結合キーがnull許容でなく、左側の結合キーがnull許容である場合に発生するpanicを修正します。
read-indexリクエストの処理に時間がかかる可能性がある問題を修正します。- 読み込み負荷が高いときに発生するpanic問題を修正します。
Date_FormatpanicがSTRING型の引数とNULLの値で呼び出されたときに発生する可能性のあるパニック問題を修正します。
ツール
TiCDC
- TiCDCのオーナーがチェックポイントを更新する際に異常終了するバグを修正しました #1902
- 変更フィードが正常に作成された直後に失敗するバグを修正 #2113
- ルールフィルターの形式が不正なためにchangefeedが失敗するバグを修正しました #1625
- TiCDCオーナーがパニックになった際に発生する可能性のあるDDL損失問題を修正 #1260
- デフォルトのソートエンジンオプションにおける4.0.xクラスターとのCLI互換性の問題を修正 #2373
- TiCDC が
ErrSchemaStorageTableMissエラーを受け取った際に、changefeed が予期せずリセットされる可能性があるバグを修正しました。 #2422 - TiCDC
ErrGCTTLExceededエラーを受け取った際に changefeed を削除できないバグを修正しました。 #2391 - TiCDCが大きなテーブルをcdclogに同期できないバグを修正#1259 #2424
- TiCDCがテーブルを再スケジュールしている際に、複数のプロセッサが同じテーブルにデータを書き込む可能性があるバグを修正しました #2230
Backup & Restore (BR)
TiDB Lightning
- TiDB LightningがParquetファイル内の
DECIMALデータ型を解析できないバグを修正しました #1272 - TiDB Lightningがテーブルスキーマの復元時に「Error 9007: Write conflict」エラーを報告するバグを修正しました #1290
- intハンドルのオーバーフローが原因でTiDB Lightningがデータをインポートできないバグを修正しました #1291
- TiDB Lightningでローカルバックエンドモードでのデータ損失によりチェックサム不一致エラーが発生する可能性があるバグを修正しました #1403
- TiDB Lightningがテーブルスキーマを復元する際に、クラスター化インデックスとのLightning互換性の問題を修正する #1362
- TiDB LightningがParquetファイル内の
Dumpling