错误码
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 错误。