• ADADADADAD

    MySQL中InnoDB row_id边界溢出验证的示例分析[ mysql数据库 ]

    mysql数据库 时间:2024-11-28 13:25:10

    作者:文/会员上传

    简介:

    背景跟同学聊到row_id一个边界问题,这里详细说明下。InnoDB表若没有定义主键,会使用系统的一个默认递增row_id (dict_sys->row_id)作为主键。每次插入一行加1,到达最大值循环复

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    背景

    跟同学聊到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.

    MySQL中InnoDB row_id边界溢出验证的示例分析.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mysqlinnodbrowid