社区版OceanBase 4.2.1.2 插入数据时主键id出现跳表现象

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】社区版OceanBase 4.2.1.2
【 使用版本 】社区版OceanBase 4.2.1.2
【问题描述】创建表时指定主键ID,并设置auto_increment值,插入数据时不指定id,出现id跳表的现象,集群是单机环境

表结构

id

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

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

2 个赞

用户问题总结:在使用社区版 OceanBase 4.2.1.2 单机环境时,尝试插入数据时遇到了主键 ID 跳变的情况,希望了解这一现象的原因及解决办法。

由于主键 ID 的跳变可能由多种因素引起,例如分区切换、主键切换等情况,为了更准确地定位问题,建议使用 obdiag 工具来收集当前系统的相关信息。

日志采集场景: SQL 执行出错
日志采集命令: obdiag gather scene run --scene=observer.sql_err --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”

上述命令将会帮助我们收集与 SQL 执行相关的日志信息,其中 -h, -P, -u, -p, -D 参数分别代表数据库服务器地址、端口、用户名、密码和数据库名,而 trace_id 是可选参数,用于追踪具体的 SQL 执行情况。如果知道具体的 trace_id 可以替换 'Yxx' 以获得更精确的日志信息。

为了进一步帮助您解决问题,请您提供以下信息:

  1. 您插入数据时使用的 SQL 语句是什么?
  2. 插入数据前后的主键 ID 分别是多少?
  3. 是否在同一分区或不同分区之间进行了插入操作?
  4. 系统近期是否有过主备切换、合并操作或其他可能导致主键 ID 跳变的操作?
  5. 您是否能够提供 obdiag 命令执行后生成的日志压缩包?这将有助于我们进一步分析问题原因。

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

  1. 4000 ~ 4499
  2. 主键表和无主键表
  3. 10000 ~ 12000
  4. 插入数据时提示重复的输入,错误代码 ERROR 1062
  5. 创建表组
  6. 使用 LOAD DATA 语句旁路导入数据
  7. Schema 规范

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

2 个赞

符合预期的,mysql也是相同现象

3 个赞

自增列数据结构分为两个部分:

  1. 内部表,持久化 当前已经使用的自增值位点;
  2. 缓存,内存结构 中记录的一段自增值区间,由内部表申请而得到

这个是符合预期的 如果插入部分值后继续使用自增列生成序列,就会发生跳变,因为cache size造成的
因为4.x上默认AUTO_INCREMENT_MODE = ‘ORDER’ 目前跳变的规则

场景 ORDER NOORDER
多机多分区生成自增值 不跳变 跳变
INSERT插入指定最大值 不跳变 跳变
replace插入指定最大值 不跳变 跳变
重启/宕机 跳变,仅当leader机器发生时 跳变
切主 跳变 跳变
5 个赞