加入收藏 | 设为首页 | 会员中心 | 我要投稿 广西网 (https://www.guangxiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL中InnoDB row_id边界溢出验证的示例解析

发布时间:2022-02-09 04:41:47 所属栏目:编程 来源:互联网
导读:小编给大家分享一下MySQL中InnoDB row_id边界溢出验证的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 背景 跟同学聊到row_id一个边界问题,这里详细说明下。 In
       小编给大家分享一下MySQL中InnoDB row_id边界溢出验证的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
 
背景
 
       跟同学聊到row_id一个边界问题,这里详细说明下。
 
      InnoDB表若没有定义主键,会使用系统的一个默认递增row_id (dict_sys->row_id)作为主键。每次插入一行加1,到达最大值循环复用。
 
需要注意的是,虽然dict_sys->row_id 被定义为一个unsigned long long, 但由于这个主键值只有6个字节,因此最大值是2^48。 row_id超过这个值还是会递增,只是写入的时候只取低位,可以认为是做取模操作。
 MySQL中InnoDB 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.
 
以上是“MySQL中InnoDB row_id边界溢出验证的示例分析”这篇文章的所有内容,感谢各位的阅读!

(编辑:广西网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!