錯誤碼
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 錯誤。