TiDB FAQ
このドキュメントには、TiDBに関する最もよくある質問がリストされています。
TiDBについて
TiDBの紹介とアーキテクチャ
TiDBとは何ですか?
TiDBは、水平方向のスケーラビリティ、高可用性、および一貫性のある分散トランザクションを特徴とする分散SQLデータベースです。また、MySQLのSQL構文とプロトコルを使用してデータを管理および取得することもできます。
TiDBのアーキテクチャは何ですか?
TiDBクラスタには、TiDBサーバー、PD(配置ドライバー)サーバー、およびTiKVサーバーの3つのコンポーネントがあります。詳細については、 TiDBアーキテクチャを参照してください。
TiDBはMySQLに基づいていますか?
いいえ。TiDBはMySQLの構文とプロトコルをサポートしていますが、PingCAP、Incによって開発および保守されている新しいオープンソースデータベースです。
TiDB、TiKV、PD(プレースメントドライバー)のそれぞれの責任は何ですか?
- TiDBはSQLコンピューティング層として機能し、主にSQLの解析、クエリプランの指定、およびエグゼキュータの生成を担当します。
- TiKVは、実際のデータを格納するために使用される分散型Key-Valueストレージエンジンとして機能します。つまり、TiKVはTiDBのストレージエンジンです。
- PDは、TiKVメタデータを管理し、タイムスタンプを割り当て、データの配置と負荷分散を決定するTiDBのクラスタマネージャーとして機能します。
TiDBは使いやすいですか?
はい、そうです。必要なすべてのサービスが開始されると、MySQLサーバーと同じくらい簡単にTiDBを使用できます。ほとんどの場合、コードを1行も変更せずに、MySQLをTiDBに置き換えて、アプリケーションを強化できます。人気のあるMySQL管理ツールを使用してTiDBを管理することもできます。
TiDBはMySQLとどのように互換性がありますか?
現在、TiDBはMySQL 5.7構文の大部分をサポートしていますが、トリガー、ストアドプロシージャ、ユーザー定義関数、および外部キーはサポートしていません。詳細については、 MySQLとの互換性を参照してください。
TiDBは分散トランザクションをサポートしていますか?
はい。 TiDBは、単一の場所にある少数のノードであろうと多数の複数のデータセンターにまたがるノードであろうと、クラスタ全体にトランザクションを分散します。
Googleのパーコレーターに触発されたTiDBのトランザクションモデルは、主に2フェーズコミットプロトコルであり、いくつかの実用的な最適化が施されています。このモデルは、タイムスタンプアロケータに依存して、トランザクションごとに単調増加タイムスタンプを割り当てるため、競合を検出できます。 PDは、TiDBクラスタのタイムスタンプアロケータとして機能します。
TiDBを操作するために使用できるプログラミング言語は何ですか?
MySQLクライアントまたはドライバーでサポートされている任意の言語。
TiDBで他のKey-Valueストレージエンジンを使用できますか?
はい。 TiKVに加えて、TiDBはUniStoreやMockTiKVなどのスタンドアロンストレージエンジンをサポートします。それ以降のTiDBリリースでは、MockTiKVはサポートされなくなる可能性があることに注意してください。
TiDBがサポートするすべてのストレージエンジンを確認するには、次のコマンドを使用します。
./bin/tidb-server -h
出力は次のとおりです。
Usage of ./bin/tidb-server:
-L string
log level: info, debug, warn, error, fatal (default "info")
-P string
tidb server port (default "4000")
-V print version information and exit (default false)
.........
-store string
registered store name, [tikv, mocktikv, unistore] (default "unistore")
......
TiDBのドキュメントに加えて、TiDBの知識を習得する方法はありますか?
現在、 TiDBドキュメントは、TiDB関連の知識を取得するための最も重要でタイムリーな方法です。さらに、いくつかのテクニカルコミュニケーショングループもあります。必要な場合は、 info@pingcap.comに連絡してください。
TiDBユーザー名の長さの制限は何ですか?
最大32文字。
TiDBはXAをサポートしていますか?
いいえ。TiDBのJDBCドライバーはMySQLJDBC(Connector / J)です。 Atomikosを使用する場合は、データソースをtype="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
に設定します。 TiDBは、MySQLJDBCXADataSourceとの接続をサポートしていません。 MySQL JDBC XADataSourceは、MySQLに対してのみ機能します(たとえば、DMLを使用してredo
のログを変更します)。
Atomikosの2つのデータソースを構成した後、JDBCドライブをXAに設定します。 AtomikosがTMおよびRM(DB)を操作する場合、AtomikosはXAを含むコマンドをJDBCレイヤーに送信します。 MySQLを例にとると、JDBCレイヤーでXAが有効になっている場合、JDBCはDMLを使用してredo
のログを変更するなど、一連のXAロジック操作をInnoDBに送信します。これは、2フェーズコミットの操作です。現在のTiDBバージョンは、上位アプリケーション層のJTA / XAをサポートしておらず、Atomikosによって送信されたXA操作を解析しません。
スタンドアロンデータベースとして、MySQLはXAを使用してデータベース間トランザクションのみを実装できます。 TiDBはGooglePercolatorトランザクションモデルを使用した分散トランザクションをサポートし、そのパフォーマンスの安定性はXAよりも高いため、TiDBはXAをサポートせず、TiDBがXAをサポートする必要はありません。
TiDBテクニック
データストレージ用のTiKV
TiDB内部(I)-データストレージを参照してください。
データコンピューティング用のTiDB
TiDB内部(II)-コンピューティングを参照してください。
スケジューリングのためのPD
TiDB内部(III)-スケジューリングを参照してください。
クラウドへの導入
パブリッククラウド
現在TiDBでサポートされているクラウドベンダーは何ですか?
TiDBは、 Google GKE 、およびAWS EKSでの展開をサポートしAlibaba Cloud ACK 。
さらに、TiDBは現在JD CloudとUCloudで利用可能であり、それらに第1レベルのデータベースエントリがあります。
トラブルシューティング
TiDBカスタムエラーメッセージ
エラー8005(HY000):書き込みの競合、txnStartTSが古くなっています
tidb_disable_txn_auto_retry
がon
に設定されているかどうかを確認します。その場合は、 off
に設定します。すでにoff
の場合は、エラーが発生しなくなるまでtidb_retry_limit
の値を増やします。
エラー9001(HY000):PDサーバーのタイムアウト
PD要求のタイムアウト。 PDサーバーの状態、監視データ、ログ、およびTiDBサーバーとPDサーバー間のネットワークを確認してください。
エラー9002(HY000):TiKVサーバーのタイムアウト
TiKV要求のタイムアウト。 TiKVサーバーの状態、監視データ、ログ、およびTiDBサーバーとTiKVサーバー間のネットワークを確認してください。
エラー9003(HY000):TiKVサーバーがビジーです
TiKVサーバーがビジーです。これは通常、データベースの負荷が非常に高い場合に発生します。 TiKVサーバーのステータス、監視データ、ログを確認してください。
エラー9004(HY000):ロックタイムアウトを解決
ロック解決タイムアウト。これは通常、トランザクションの競合が多数存在する場合に発生します。アプリケーションコードをチェックして、データベースにロックの競合が存在するかどうかを確認します。
エラー9005(HY000):リージョンは利用できません
アクセスされたリージョンは利用できません。レプリカの数が不十分であるなどの理由により、ラフトグループは利用できません。これは通常、TiKVサーバーがビジーであるか、TiKVノードがシャットダウンされている場合に発生します。 TiKVサーバーのステータス、監視データ、ログを確認してください。
エラー9006(HY000):GCの有効期間がトランザクション期間よりも短い
GC Life Time
の間隔が短すぎます。長いトランザクションで読み取られるはずだったデータが削除される可能性があります。次のコマンドを使用してtidb_gc_life_time
を調整できます。
SET GLOBAL tidb_gc_life_time = '30m';
ノート:
「30m」は、30分前に生成されたデータのみをクリーンアップすることを意味し、余分なストレージスペースを消費する可能性があります。
エラー9007(HY000):書き込みの競合
tidb_disable_txn_auto_retry
がon
に設定されているかどうかを確認します。その場合は、 off
に設定します。すでにoff
の場合は、エラーが発生しなくなるまでtidb_retry_limit
の値を増やします。
エラー8130(HY000):クライアントでマルチステートメント機能が無効になっています
このエラーは、以前のバージョンのTiDBからアップグレードした後に発生する可能性があります。 SQLインジェクション攻撃の影響を減らすために、TiDBは、デフォルトで同じCOM_QUERY
の呼び出しで複数のクエリが実行されるのを防ぐようになりました。
システム変数tidb_multi_statement_mode
を使用して、この動作を制御できます。
MySQLネイティブエラーメッセージ
エラー2013(HY000):クエリ中にMySQLサーバーへの接続が失われました
- パニックがログにあるかどうかを確認します。
dmesg -T | grep -i oom
を使用して、OOMがdmesgに存在するかどうかを確認します。- 長時間アクセスできない場合も、このエラーが発生する可能性があります。これは通常、TCPタイムアウトが原因で発生します。 TCPが長期間使用されていない場合、オペレーティングシステムはTCPを強制終了します。
エラー1105(HY000):その他のエラー:不明なエラーワイヤエラー(InvalidEnumValue(4004))
このエラーは通常、TiDBのバージョンがTiKVのバージョンと一致しない場合に発生します。バージョンの不一致を回避するには、バージョンをアップグレードするときにすべてのコンポーネントをアップグレードします。
エラー1148(42000):使用されているコマンドはこのTiDBバージョンでは許可されていません
LOAD DATA LOCAL
ステートメントを実行したが、MySQLクライアントがこのステートメントの実行を許可していない場合( local_infile
オプションの値は0)、このエラーが発生します。
解決策は、MySQLクライアントを起動するときに--local-infile=1
オプションを使用することです。たとえば、 mysql --local-infile=1 -u root -h 127.0.0.1 -P 4000
のようなコマンドを使用します。デフォルト値のlocal-infile
は、MySQLクライアントのバージョンによって異なるため、一部のMySQLクライアントで構成する必要があり、他のクライアントで構成する必要はありません。
エラー9001(HY000):PDサーバーのタイムアウト開始タイムスタンプが安全ポイントより遅れる可能性があります
このエラーは、TiDBがPDにアクセスできない場合に発生します。 TiDBバックグラウンドのワーカーは、PDからセーフポイントを継続的に照会します。このエラーは、100秒以内に照会に失敗した場合に発生します。一般に、PDのディスクが低速でビジーであるか、TiDBとPDの間のネットワークに障害が発生したことが原因です。一般的なエラーの詳細については、 エラー番号と障害診断を参照してください。
TiDBログのエラーメッセージ
EOFエラー
クライアントまたはプロキシがTiDBから切断されても、TiDBは接続が切断されたことをすぐには認識しません。代わりに、TiDBは、接続にデータを返し始めたときにのみ切断に気付くことができます。このとき、ログにはEOFエラーが出力されます。