我目前使用数据库,在没有切主的情况下,发现数据表的自增id出现了跳变情况。请问一下应该怎么排查是什么导致的跳变情况,以及怎么能够避免这种情况啊?
看看官网描述:
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001431031
自增列的跳变
在 MySQL 数据库中,自增列是数据库表中的一种列属性,它可以自动生成一个唯一的、递增的值,用于表示该行数据的唯一标识。OceanBase 数据库作为分布式数据库,其数据库表通常分布在多台不同的机器上,在尽可能与 MySQL 数据库兼容的同时还需要保证分布式多机场景下自增列生成的性能,从而会出现自增值生成过程中的跳变问题。
在 OceanBase 数据库中,自增列支持两种自增模式,即 NOORDER 模式和 ORDER 模式,默认为 ORDER 模式。其中:
- ORDER 模式:基于集中缓存的自增列。设置为该模式后,自增列的值全局递增。
- NOORDER 模式:基于分布式缓存的自增列,设置为该模式后,仅保证自增列的值全局唯一。
NOORDER 模式
场景 1:多机多分区生成自增值
场景 2:通过 INSERT
语句插入指定的最大值
场景 3:机器重启或宕机
ORDER 模式
场景 1:机器重启或宕机
场景 2:切主
如果要保持递增,那就用order模式。如果还不想中间跳跃,是不是只能auto_increment_cache_size=1了,这样的话性能会收到很大的影响。除非是一些基础资料表,数据量很少的情况。
可以参考下这个帖子
oceanbase数据库自增id会突然从 个位数 直接变成 六位数13lmw8l_gaMTIwMjU5NTAzNC4xNzE0OTc1MTY1_ga_T35KTM57DZ*MTcyODUzODUwNC4yNDguMS4xNzI4NTUxMjMyLjQ0LjAuMA…
跳变就是因为请求发送到不同节点了,楼上的人提到了order 和 noorder模式之间的区别,想要不跳变的话用order模式能实现但是性能不能保证