最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
MySQL InnoDB row_id边界溢出如何验证 MySQL InnoDB row_id边界溢出验证方法
时间:2022-06-29 09:03:48 编辑:袖梨 来源:一聚教程网
MySQL InnoDB row_id边界溢出如何验证?具体应该怎么操作呢?本篇文章小编给大家分享一下MySQL InnoDB row_id边界溢出验证方法,对此感兴趣的小伙伴们可以来看看。
InnoDB表若没有定义主键,会使用系统的一个默认递增row_id (dict_sys->row_id)作为主键。每次插入一行加1,到达最大值循环复用。
需要注意的是,虽然dict_sys->row_id 被定义为一个unsigned long long, 但由于这个主键值只有6个字节,因此最大值是2^48。 row_id超过这个值还是会递增,只是写入的时候只取低位,可以认为是做取模操作。
问题
这就涉及到一个问题,一个长期运行的MySQL里,如果频繁插入删除行(像日志类的表),即使最终表规模不是很大,仍可能会出现值row_id重用。而我们知道作为主键值,是不能重复的。
假设出现这种情况,在一个表里,新插入的一行的row_id与某一个年代久远的行的row_id出现冲突,会肿么样?
验证
其实本来这里只需要一个结论。本文的目的还是跟大家探讨一种验证的方法。有了上面的信息,我们可以考虑设计如下的复现步骤:
1) 创建一张无主键空表
2) gdb设置dict_sys->row_id为1
3) 往空表插入若干行
4) gdb设置dict_sys->row_id为2^48
5) 再插入若干行
6) 看结果
结论
可以看到,行(1),(2)被覆盖了。
比较合理点的方案应该是像MySQL的表内自增主键一样,报个duplicate-key error.
相关文章
- 以闪亮之名星彩幻梦礼包怎么样 以闪亮之名星彩幻梦外观礼包介绍 11-01
- 永劫无间手游10.31有什么更新 11-01
- 王者荣耀老夫子百相守梦怎么样 11-01
- 仙剑世界白藏技能图鉴一览 11-01
- 《今日校园》绑定微信方法 11-01
- 《今日校园》修改个人资料方法 11-01