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

你可能感兴趣的:(TiDB)