TiDB錯誤碼與故障排除

錯誤碼

TiDB 兼容 MySQL 的錯誤碼,在大多數情況下,返回和 MySQL 一樣的錯誤碼。另外還有一些特有的錯誤碼:

錯誤碼 說明
8001 請求使用的內存超過 TiDB 內存使用的閾值限制
8002 帶有 SELECT FOR UPDATE 語句的事務,在遇到寫入衝突時,爲保證一致性無法進行重試,事務將進行回滾並返回該錯誤
8003 ADMIN CHECK TABLE 命令在遇到行數據跟索引不一致的時候返回該錯誤
8004 單個事務過大
8005 事務在 TiDB 中遇到了寫入衝突,原因及解決方法請參考這裏
9001 請求 PD 超時,請檢查 PD Server 狀態/監控/日誌以及 TiDB Server 與 PD Server 之間的網絡
9002 請求 TiKV 超時,請檢查 TiKV Server 狀態/監控/日誌以及 TiDB Server 與 TiKV Server 之間的網絡
9003 TiKV 操作繁忙,一般出現在數據庫負載比較高時,請檢查 TiKV Server 狀態/監控/日誌
9004 當數據庫上承載的業務存在大量的事務衝突時,會遇到這種錯誤,請檢查業務代碼
9005 某個 Raft Group 不可用,如副本數目不足,出現在 TiKV 比較繁忙或者是 TiKV 節點停機的時候,請檢查 TiKV Server 狀態/監控/日誌
9006 GC Life Time 間隔時間過短,長事務本應讀到的數據可能被清理了,應增加 GC Life Time
9007 事務在 TiKV 中遇到了寫入衝突,原因及解決方法請參考這裏

故障排除

TiDB 自定義報錯彙總

ERROR 8005 (HY000) : Write Conflict, txnStartTS is stale

可以檢查 tidb_disable_txn_auto_retry 是否爲 on。如是,將其設置爲 off;如已經是 off,將 tidb_retry_limit 調大到不再發生該錯誤。

ERROR 9001 (HY000) : PD Server Timeout

請求 PD 超時,請檢查 PD Server 狀態/監控/日誌以及 TiDB Server 與 PD Server 之間的網絡。

ERROR 9002 (HY000) : TiKV Server Timeout

請求 TiKV 超時,請檢查 TiKV Server 狀態/監控/日誌以及 TiDB Server 與 TiKV Server 之間的網絡。

ERROR 9003 (HY000) : TiKV Server is Busy

TiKV 操作繁忙,一般出現在數據庫負載比較高時,請檢查 TiKV Server 狀態/監控/日誌。

ERROR 9004 (HY000) : Resolve Lock Timeout

清理鎖超時,當數據庫上承載的業務存在大量的事務衝突時,會遇到這種錯誤,請檢查業務代碼是否有鎖爭用。

ERROR 9005 (HY000) : Region is unavailable

訪問的 Region 不可用,某個 Raft Group 不可用,如副本數目不足,出現在 TiKV 比較繁忙或者是 TiKV 節點停機的時候,請檢查 TiKV Server 狀態/監控/日誌。

ERROR 9006 (HY000) : GC life time is shorter than transaction duration

GC Life Time 間隔時間過短,長事務本應讀到的數據可能被清理了,可使用如下命令增加 GC Life Time

update mysql.tidb set variable_value='30m' where variable_name='tikv_gc_life_time';

其中 30m 代表僅清理 30 分鐘前的數據,這可能會額外佔用一定的存儲空間。

ERROR 9007 (HY000) : Write Conflict

可以檢查 tidb_disable_txn_auto_retry 是否爲 on。如是,將其設置爲 off;如已經是 off,將 tidb_retry_limit 調大到不再發生該錯誤。

MySQL 原生報錯彙總

ERROR 2013 (HY000): Lost connection to MySQL server during query 問題的排查方法?

  • log 中是否有 panic
  • dmesg 中是否有 oom,命令:dmesg -T | grep -i oom
  • 長時間沒有訪問,也會收到這個報錯,一般是 tcp 超時導致的,tcp 長時間不用, 會被操作系統 kill。

ERROR 1105 (HY000): other error: unknown error Wire Error(InvalidEnumValue(4004)) 是什麼意思?

這類問題一般是 TiDB 和 TiKV 版本不匹配,在升級過程儘量一起升級,避免版本 mismatch。

ERROR 1148 (42000): the used command is not allowed with this TiDB version 問題的處理方法?

這個問題是因爲在執行 LOAD DATA LOCAL 語句的時候,MySQL 客戶端不允許執行此語句(即 local_infile 選項爲 0)。解決方法是在啓動 MySQL 客戶端時,用 –local-infile=1 選項。具體啓動指令類似:mysql --local-infile=1 -u root -h 127.0.0.1 -P 4000。有些 MySQL 客戶端需要設置而有些不需要設置,原因是不同版本的 MySQL 客戶端對 local-infile 的默認值不同。

ERROR 9001 (HY000): PD server timeout start timestamp may fall behind safe point

這個報錯一般是 TiDB 訪問 PD 出了問題,TiDB 後臺有個 worker 會不斷地從 PD 查詢 safepoint,如果超過 100s 查不成功就會報這個錯。一般是因爲 PD 磁盤操作過忙、反應過慢,或者 TiDB 和 PD 之間的網絡有問題。TiDB 常見錯誤碼請參考錯誤碼與故障排除

TiDB 日誌中的報錯信息

EOF

當客戶端或者 proxy 斷開連接時,TiDB 不會立刻察覺連接已斷開,而是等到開始往連接返回數據時,才發現連接已斷開,此時日誌會打印 EOF 錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章