# [FAQ] 如何处理在 TiDB 使用 AUTO_RANDOM 插入报错 “ERROR 8059 (HY000)- Failed to read auto-random value from storage engine”

## Key Words

TiDB,auto_random,auto_random_base

## Description

使用 auto_random 特性在大量数据写入场景，可能会遇到 auto_random_base 达到溢出边界，导致 insert 无法继续写入，报错  `ERROR 8059 (HY000): Failed to read auto-random value from storage engine`

## Content

1. 当将 auto_random_base 更改为溢出增量位的值时，将报告 `AutoRandomRebaseOverflow`。且不能手动设置为 0 或者降低设置，只能往高设置。在 Insert 执行报错 warning 后，可以通过执行对应的 `show warnings` 查看对应执行失败的报错。

2. 通过一下 SQL 查询该表数据中 auto_random 列自增部分的最大值

    ```sql
    select max(id & (1 << (64-1-shard_bits)) - 1) from t;
    -- shard_bits 是通过 information_schema.tables 查看 tidb_row_id_sharding_info 模式为 pk_auto_random_bits= X 这个是 shard_bits。
    -- id 为 t 表的 primary key 使用 auto_random 的主键列。
    ```

3. 将查询结果值和当前的 auto_random_base 对比，如果 当前值 < auto_random_base，可以通过  alter table t force auto_random_base = 当前值 + 1 的方式改小；

4. 如果当前值 => auto_random_base, 那么要根据表量如果较小，那么可以重新导数据方式，来缓解 auto_random_base 超边界的问题；

5. 如果当前值 => auto_random_base, 同时表已经很大，那么暂时无其他办法解决。

## Workaround

当前的临时方案 2 种，都会有一定风险，建议评估风险对业务影响。

方案一：可以通过  alter table tax_bill force AUTO_RANDOM_BASE= 当前值 + 1 ，强制将 Random Base 设置指定值，然后 Random 分配 ID 继续使用。

风险：可能会遇到 ID 冲突的情况，这个情况和 Shard_bits 相关，了解到 shard_bits 为 5，所以可能遇到 ID 冲突的概率是 1/2^5 的机率会遇到冲突并报错，业务需要跟进报错关键字，然后重试写入。

方案二：将表重置，在业务没有查询请求情况下，将已经存在的数据导出，并删除 auto_random ID 后重新导入新的 auto_random的表以后，相当于已有数据的 ID 值重置。

## Affected Versions

N/A