oceanbase数据库自增id会突然从 个位数 直接变成 六位数

【 使用环境 】 测试环境
【 OB or 其他组件 】ob
【 使用版本 】
【问题描述】oceanbase数据库自增id会突然从 个位数 直接变成 六位数
【复现路径】问题出现前后相关操作
【附件及日志】

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

2 个赞

根据您的描述,您遇到了 OceanBase 数据库自增 ID 突然从个位数跳变至六位数的情况。这可能是由于自增列在某些特定场景下的“跳变”现象导致的,如文档片段 1 和文档片段 2 所述,可能的原因包括但不限于:分区切换、主备切换、合并操作或插入了一个较大的自增数值等。

为了更准确地定位问题原因,建议使用 obdiag 工具进行日志采集,并将采集到的日志提供给我们以便进一步分析。

日志采集场景: 合并问题
日志采集命令: obdiag gather scene run --scene=observer.compaction

请您执行上述命令并将采集到的日志压缩包发送给我们。此外,请您提供一些额外的信息以便我们更好地帮助您:

  1. 当前使用的 OceanBase 版本是什么?
  2. 自增列是否设置了 ORDER 或 NOORDER 模式?
  3. 在自增 ID 发生跳变的时间点前后,是否有进行过主备切换、合并操作或其他特殊的数据库操作?
  4. 能否提供发生跳变前后的具体时间点,以便我们更有针对性地分析日志?
  5. 是否能够提供具体的 SQL 语句或操作,以便我们复现问题?

通过以上信息,我们将能够更准确地定位问题原因并为您提供解决方案。

具体信息可参考以下文档:

  1. Schema 规范
  2. 定义自增列
  3. 0001 ~ 3999
  4. 位值

附上敏捷诊断工具 obdiag 使用帮助链接

2 个赞

和小助手的回复类似,麻烦提供如下信息

  1. 当前使用的 OceanBase 版本是什么?
  2. 自增列是否设置了 ORDER 或 NOORDER 模式?
  3. 在自增 ID 发生跳变的时间点前后,是否有进行过主备切换、合并操作或其他特殊的数据库操作?
  4. 能否提供发生跳变前后的具体时间点,以便我们更有针对性地分析日志?
  5. 是否能够提供具体的 SQL 语句或操作,以便我们复现问题?
1 个赞

版本是 5.7.25-OceanBase_CE-v4.2.1.8
自增列应该是默认模式
我是用root直接登录的 没有指定租户 单机部署的应该不存在主备切换把,在插入数据的时候 第三条就变成 1000003

1 个赞

根据您提供的信息,您正在使用的是 OceanBase CE v4.2.1.8 版本,并且自增列使用的是默认模式。您提到在单机部署环境中插入数据时,自增 ID 从个位数直接跳变至六位数。结合您提供的版本信息和场景描述,我们可以从以下几个方面进行分析:

  1. 自增模式:默认情况下,OceanBase 数据库的自增列为 ORDER 模式。ORDER 模式下,自增列的值应全局递增。然而,即便如此,仍有可能在某些特殊情况下发生跳变。 [2]
  2. 单机环境下的跳变原因:尽管您提到这是单机部署,理论上不存在主备切换的问题,但仍有可能因为其他原因导致自增 ID 的跳变。 [1]
  3. 插入大值:如果在插入数据时,显式地插入了一个较大的自增值(例如 INSERT INTO table_name (id) VALUES (1000003);),那么后续生成的自增 ID 将不会小于这个值。 [2]

考虑到您提到的第三条插入数据时自增 ID 突变为 1000003,很有可能是因为在这之前有显式插入了一个较大的自增值。为了验证这一点,请检查是否有类似的操作。

如何避免自增 ID 跳变

  1. 避免显式插入大值:尽量避免显式地插入一个较大的自增值,除非确实需要这样做。
  2. 调整缓存大小:可以通过调整 auto_increment_cache_size 来减少跳变的可能性。默认情况下,auto_increment_cache_size 的值为 1000000,这意味着每次申请的自增区间长度为 1000000。如果频繁遇到跳变问题,可以适当减小这个值。 [1]
  3. 检查 SQL 模式:确认 SQL_MODE 未设置为 NO_AUTO_VALUE_ON_ZERO,否则在插入值为零的列时不会生成自增列。 [2]

检查和调试建议

  1. 查看日志:检查数据库日志,特别是插入操作相关的日志,看是否有显式插入大值的操作记录。
  2. 复现问题:尝试复现问题,观察自增 ID 的变化情况,进一步确认是否存在显式插入大值的行为。
  3. 调整参数:如果频繁遇到跳变问题,可以尝试调整 auto_increment_cache_size 参数,观察效果。

希望以上信息对您有所帮助。如果问题依然存在,请提供更多详细的日志信息以便进一步排查。

更多信息请查看:

  1. 创建表
  2. 定义自增列
  3. Schema 规范

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

2 个赞

oceanbase自增列这块不是严格递增,为了保证自增性能,这块会缓存一定的自增id,当发生leader切换时,会产生自增的跳变,具体可参照下面这个文档:
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000820754

1 个赞

分布式数据库自增ID跳变是符合预期的,当然集中式的MySQL数据库自增ID也不是单调严格递增的 也会有跳变行为,可以参考下小助手的回复处理

如何避免自增 ID 跳变

  1. 避免显式插入大值:尽量避免显式地插入一个较大的自增值,除非确实需要这样做。
  2. 调整缓存大小:可以通过调整 auto_increment_cache_size 来减少跳变的可能性。默认情况下,auto_increment_cache_size 的值为 1000000,这意味着每次申请的自增区间长度为 1000000。如果频繁遇到跳变问题,可以适当减小这个值。 [1]
  3. 检查 SQL 模式:确认 SQL_MODE 未设置为 NO_AUTO_VALUE_ON_ZERO,否则在插入值为零的列时不会生成自增列。 [2]
1 个赞

保证单调自增性,不保证一定是严格顺序自增,leader切换会有存在跳变的可能

3 个赞