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里,如果频繁插入删除行(像日志类的表),即使最终表规模不是很大,仍可能会出现值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.

时间: 2024-12-02 15:45:44

InnoDB row_id边界溢出验证的相关文章

InnoDB 中文参考手册 --- 8 InnoDB 事务模式与锁定

参考|参考手册|中文 InnoDB 中文参考手册 --- 犬犬(心帆)翻译 8 InnoDB 事务模式与锁定在 InnoDB 事务处理模式中, the goal has been to combine the best properties of a multiversioning database to traditional two-phase locking. InnoDB 进行行级的锁定,并以与 Oracle 非锁定读取(non-locking)类似的方式读取数据. InnoDB 中的锁

超越浏览器:从 web 应用到桌面应用

本文讲的是超越浏览器:从 web 应用到桌面应用, 一开始我是个 web 开发者,现在我是个全栈开发者,但从未想过在桌面上有所作为.我热爱 web 技术,热爱这个无私的社区,热爱它对于开源的友好,尝试挑战极限.我热爱探索好看的网站和强大的应用.当我被指派做桌面应用任务的时候,我非常忧虑和害怕,因为那看起来很难,或者至少不一样. 这并不吸引人,对吧?你需要学一门新的语言,甚至三门?想象一下过时的工作流,古旧的工具,没有任何你喜欢的有关 web 的一切.你的职业发展会被怎样影响呢? 别慌,深呼吸,现

Code Review 理论与实战

一. Code Review 简介 1 Code Review 的目的 凡事知其然还要知其所以然 , 我们首先需要知道什么是 Code Review 和我们使用它的目的是什么. Code Review 是一种用来确认方案设计和代码实现的质量保证机制,通过这个机制我们可以对代码,测试过程和注释进行检查. Code Review 主要用来在软件工程过程中改进代码质量,通过 Code Review 可以达到如下目的: 在项目早期就能够发现代码中的BUG 帮助初级开发人员学习高级开发人员的经验,达到知识

Code Review代码审查的思路

1.关于Code Review 1.1 Code Review的目的 Code Review主要用来在软件工程过程中改进代码质量,通过Code Review可以达到如下目的目的: (1)在项目早期就能够发现代码中的BUG (2)帮助初级开发人员学习高级开发人员的经验,达到知识共享 (3)避免开发人员犯一些很常见,很普通的错误 (4)保证项目组人员的良好沟通 (5)项目或产品的代码更容易维护 1.2 Code Review的前提 进入Code Review需要检查的条件如下: (1)Code Re

C#之语言详述

上一篇写到的是C#的核心语言,属于泛泛而谈.这一篇继续C#的学习,开始对C#语言的详述,本篇内容主要包括委托.事件和异常处理. 一. 委托 要理解委托的概念,必须清楚什么是函数指针. 函数指针是对函数的间接引用,支持通过变量来调用函数.通过函数指针,我们可以将函数作为一个参数或作为一个返回值进行传递.函数指针可以使应用程序更灵活.可扩展性和可伸缩性更好.但函数指针不是类型安全的. 从生活角度去理解,我觉得函数指针就像是一个快递点.在这里,当我们需要的时候,我们可以通过它来取件寄件. 一个"委托&

教你如何作弊玩扫雷

本文配套源码 注意:以下是在WinXP SP2+VC 6.0下调试通过的,别的版本的Windows没有经过验证. 最近闲暇时间迷上了扫雷,有的时候经常遇到模棱两可的地方,很容易死到.于是就在想,要是我一开始 就知道哪个地方有雷就好了.遂打开OllyDBG,对扫雷程序(WinMine.exe),进行了一番跟踪.好在 WinMine.exe没有加壳,直接看它的IMPORT TABLE,在两个可疑的API上下断点,一个就是GDI.BitBlt,这个 是程序来画地图的,另一个就是User32.GetDl

RocksDB数据存储格式分析

RocksDB本身只是一个KV存储,用户通过put(key,value)来写入key,或者通过get(key)接口来获取value,所以单从RocksDB而言,每条记录都是一个key-value.那么当RocksDB作为一个存储引擎接入到MySQL时,key-value结构如何存储表中各个索引,以及如何记录中各个列的信息是本文要具体讨论的. RocksDB引擎与InnoDB引擎类似,也是采用索引组织表,无论是表(主键索引)还是二级索引都是以LSM tree方式组织,RocksDB记录主要包括三部

C++常见错误中英文对照表_C 语言

fatal error C1003: error count exceeds number; stopping compilation 中文对照:(编译错误)错误太多,停止编译 分析:修改之前的错误,再次编译 fatal error C1004: unexpected end of file found 中文对照:(编译错误)文件未结束 分析:一个函数或者一个结构定义缺少"}".或者在一个函数调用或表达式中括号没有配对出现.或者注释符"/*-*/"不完整等 fata

静态代码检查讨论

问题描述 有高手,对这个了解的么?原理是咋样的,大家可以交流一哈,准备开发一个工具还实现提高代码质量.所谓静态代码检查,即是对程序代码的检查,发现一些未定义的变量.数据类型不匹配.返回局部变量.数组字符串边界溢出.内存泄露等等.. 解决方案 解决方案二:等你研究出来了,可以卖给微软解决方案三:引用1楼Z65443344的回复: 等你研究出来了,可以卖给微软 大神有没有好的指教啊?谈谈你有没有这方面的经验分享的?解决方案四:你代码跑起来都不见得每次都会内存泄露,边界溢出,要不一定等到进入哪个分支,