-
2019-10-25 09:44:04
如果mysql的自增主键达到最大值会发生什么?比如主键类型设为int,其最大值为:2147483647,如果此时我们再往其中写入数据,就会发生异常:
Duplicate entry '2147483647' for key 'PRIMARY'
也即写不进去了。如果发生了这种情况,应该是设计架构就有问题。并且当数据达到千万上亿级别,查询将变得奇慢无比,也是不可取的。在设计架构的时候就应该根据业务情况进行分库分表,至少达到每个表不超过千万级。
另外一种很不可取的做法是,数据写入一张表中,当数据量很大的时候,就定时将某个时间之前的数据挪到另外的表中,然后删除。这样做不仅有上述问题,还有删除表数据的一些弊端。见另外一篇博客:关于mysql的delete和主从同步问题。
更多相关内容 -
Mysql 的自增主键达到最大值,怎么办
2021-12-20 20:35:30Mysql 的自增主键达到最大值,会发生什么你知道吗?就在今天,我们线上就发生了这种问题!!! 他会发生异常,报错如下: Duplicateentry'2147483647'forkey'PRIMARY' org.springframework.dao....1、遇到的问题
Mysql 的自增主键达到最大值,会发生什么你知道吗?就在今天,我们线上就发生了这种问题!!!
他会发生异常,报错如下:
Duplicate entry '2147483647' for key 'PRIMARY'
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
insert 数据就会报错。
2、分析
总结来说这算是架构上的设计问题吧。先说一下我们目前暴露出来的俩问题:
① Mysql 的自增主键默认是 int 类型,4 个字节,一个字节 8 位,即如果是有符号的位的话,最大值就是(2^31)-1,也就是2147483647,基本也就能存储 20 亿数据。当数据达到千万上亿级别时,查询数据就会特别特别慢了,所以我们就采取了数据归档。这里是另外一个坑下面在介绍。应该根据业务数据量,分析数据的增长情况,提前规划进行分库分表,至少要保证每个表不超过千万级。这样才能保证查询效率。
② 这里说下上边提到的另外一个坑:我们的因为查询比较慢,对表做过几次数据归档,就是将数据写入一张表中,当数据量很大时,就定时将某个时间之前的数据写入另一个表中,这样做也是有一些坑的。
Mysql的 delete 并不会真正的删除磁盘空间,而只是标记相应的区域,在合适的时候还可以再利用。如果要真正腾出磁盘空间还必须使用 optimize table xxx 进行磁盘碎片处理,但是这个命令会在相应的库下产生一个很大的 #sql-xxx 文件,此文件的赠长速度特别快,要清除的表越大它的增长速度就越快,所以不能等磁盘已经快满了才想起来清理。
而且 optimize 命令会锁表,一般根据表的数据增长速度和删除等情况综合考虑决定 optimize 命令的执行频率。比如在访问量最小的时候一个月或者两个月执行一次。
3、解决办法
① 修改 id 字段类型,int 改为 bigint(太占空间了,一个bigint的存储大小为8字节) bigint 的大小是8个字节,一个字节 8 位,有符号的最大值就是 2 的 63 次方 -1。即 bigint 带符号的范围是 -9223372036854775808 到 9223372036854775807。无符号的范围是 0 到 18446744073709551615。
② 有能力还是分表,有效避免这个问题
③ 将 int 类型设置为无符号的可以扩大一倍
基于以上三种最好的处理方法还是分库分表。
4、临时解决方案
目前我们基于线上的临时解决方案是新建了一个同结构的表,业务数据走新表,查询兼容旧表
-
数据库主键自增到最大值
2022-01-22 14:37:28mysql出现主键自增长到最大使用mysql数据库:
因为数据库主键增长到啦最大值,数据id达到了20亿,查询数据好像只有200万数据;
int字段:数据的范围在-2^31~2^31-1
2^31-1 = 2147483647
unsigend long int是无符号整数类型,能表示的整数范围是0~4294967295,即0~2^32-1。
主键自增到最大时候:
int有符号:
处理方案:
之前id的值是int,现在设计一个新的表,将新的表的id的类型为bigint 或者(将int有符号修改为无符号),然后将原来的数据copy到新表中,当copy完成后再将新表的表名修改为原来的表,原来的表名也修改下。
但是后台代码需要先更新,之前后台用的是Integer,不然的话插入就会报
数据的是正常插入没有问题,就是后台会有异常
-
mysql自增主键达到最大后如何处理
2021-05-12 15:16:55然后如果这个自增主键达到最大值,是会报错的 Duplicate entry '2147483647' for key 'PRIMARY' 错误翻译过来的意思大概是主键2147483647重复了。 解决方法: ①、修改id字段类型,int改为bigint(太占空间了,...在mysql中int类型占四个字节,有符号书的话,最大值就是(2^31)-1,也就是2147483647,二十多亿。
然后如果这个自增主键达到最大值,是会报错的Duplicate entry '2147483647' for key 'PRIMARY'
错误翻译过来的意思大概是主键2147483647重复了。
解决方法:
①、修改id字段类型,int改为bigint(太占空间了,一个bigint的存储大小为8字节) bigint的大小是8个字节,一个字节8位,有符号的最大值就是2的63次方-1
②、有能力还是分表,有效避免这个问题
③、将int类型设置为无符号的可以扩大一倍
有符号int最大可以支持到约22亿,远远大于我们的需求和MySQL单表所能支持的性能上限。
对于OLTP应用来说,单表的规模一般要保持在千万级别,不会达到22亿上限。如果要加大预留量,可以把主键改为改为无符号int,上限为42亿,这个预留量已经是非常的充足了。
使用bigint,会占用更大的磁盘和内存空间,内存空间毕竟有限,无效的占用会导致更多的数据换入换出,额外增加了IO的压力,对性能是不利的。因此推荐自增主键使用int unsigned类型,但不建议使用bigint
有能力选择分表,更好解决这个问题。
-
MySQL重置自增主键的值
2021-10-26 16:13:32alter table 表名 auto_increment= 起始值 -
Mysql修改自增主键的起始值及查询自增主键的下一个值
2021-01-19 04:11:41如果数据大于11000,则设置无效 INNODB自增主键的一些问题 vs mysql获得自增字段下一个值 今天发现 批量插入下,自增主键不连续了....... InnoDB AUTO_INCREMENT Lock Modes This section describes the behavior of... -
面试官:自增主键达到最大值了,用完了怎么办?
2022-03-21 00:04:52" 你:这问题我们在实际应用到没有遇到过,我们自增主键虽然采用的int类型,但我们不会达到最大值,在没达到最大值,查询性能就受到影响,我们会采取就要考虑分库分表方案了。 要是面试官继续穷追不舍,问你有关分库... -
MySQL主键设置自增 AUTO INCREMENT 时,如果自增达到最大值,新增加数据会怎样?
2021-08-10 20:59:18结论:它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。...3、navicat设计表,把主键改为最大值 4、插入数据,报错 5、怎么办 https://blog.csdn.net/u013008898/article/details/116709305 ... -
SQL映射文件获取自增主键和非自增主键的值
2020-08-14 18:13:19insert、update、delete元素 ...(自增在xml不需要传入主键id参数,mysql插入数据主键会自增) <!-- public int insertEmployee(Employee employee); --> <!-- 让MyBatis自动的将自增id赋值. -
MySQL中的自增主键用完了怎么办?
2019-08-25 09:26:21在面试中,大家应该经历过如下场景 面试官:"用过mysql吧,你们是用自增主键还是UUID?...面试官:"那自增主键达到最大值了,用完了怎么办?" 你:"what,没复习啊!!" (然后,你就可以回去等通知... -
自增 主键
2021-01-22 17:41:49我们前面提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。 自增值的实现机制 1.存储 表定义里面出现了一个 AUTO_INCREMENT=2,表示下一次插入数据时,如果... -
mysql自增主键(int类型)达到最大值导致任务报错
2021-01-06 09:21:40然后如果这个自增主键达到最大值,是会报错的 Duplicate entry '2147483647' for key 'PRIMARY' 错误翻译过来的意思大概是主键2147483647重复了。 解决方法:修改id字段类型,int改为bigint,有能力还是分表,... -
MySQL中的自增主键 ID自增到最大,使用完id会发生什么,怎么办?
2021-07-20 23:27:50文章目录背景测试过程创建表,自增ID场景一:测试自增ID已经达到最大值场景二:测试自增ID即将达到最大值总结解决方案扩展扩展1:修改字段的数据类型,建议使用modify 用法扩展2:Alter table的底层原理 背景 之前的... -
mysql 自增主键达到最大值之后再插入数据会怎样?
2021-06-03 09:00:05int 最大值 在上表中我们看到,首位的 bit 用来表示符号,因此在 sigend 是少一位 bit 来存储内容。int 是 4 byte,结合上述,可以得出 int 在 signed 最大值为 231−1=2147483647 在 unsigned 中,无需首位 ... -
Oracle小知识--sequence实现主键自增(第二天)
2021-05-01 00:35:37create sequence test_seqminvalue 1 --最小值maxvalu 100 --该序列最大到100,使用NOMAXvalue 可以不设置最大值start with 1 --从1开始递增increment by 1 --每次递增1nocache; --不设置缓存。cache 10设置每次缓存... -
oracle数据库主键自增并且返回主键值
2020-12-14 11:50:56一、创建序列 1.1、直接在PLSQL中设置 1.2、命令创建 create sequence seq_users ##创建序列...maxvalue 9999999 ##最大值 order ##确保按照请求次序生成整数 【不常用的设置】.只有在使用Real Application Cluster(RA -
PostgreSQL如何建立自增主键 , PostgreSQL建立自增主键的两种方法
2020-07-03 19:22:52以前建立自增主键都是用mysql建的,只要写个 auto_increment就行了,最近因为工作,需要用到PostgreSQL的自增主键,就去了解了下。发现网上的这点东西写的真乱…就没有个说是整整齐齐从头到尾说清楚的,没有就只能我... -
MySQL自增主键详解
2021-01-18 19:35:11一、自增值保存在哪儿?不同的引擎对于自增值的保存...每次重启后,第一次打开表的时候,都会去找自增值的最大值max(id),然后将max(id)+步长作为这个表当前的自增值select max(ai_col) from table_name for upda... -
MySQL 自增主键
2022-02-10 17:46:23 在创建主键的时候可以使用AUTO_INCREMENT关键字进行自增主键设置,设置之后,每插入一条数据之后主键都会自动累加1 使用AUTO_INCREMENT=100可以在表级别设定偏移量,比如这里设定为100,即从100开始累加 2、... -
mysql 变更自增主键id起始值
2020-04-03 15:12:57目录 account 库 user 表结构 获取自增id字段的下一个值 修改自增id字段的初始值 其他 SQL 说明 参考文档 account 库 user 表结构 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `name... -
SQL 设置自增主键的值
2018-01-23 11:36:31dbcc checkident ('tableName', reseed,6)语句中2个参数:tableName,我们要修改自增值的表名, 6 设置自增的当前值,我们可以根据自己的需要调整这些数据. 函数具体的运行效果: 1.讲当前自增字段值, 移动到设置值的... -
浅谈MySQL中的自增主键用完了怎么办
2020-12-14 07:00:33面试官:”那自增主键达到最大值了,用完了怎么办?” 你:”what,没复习啊!!” (然后,你就可以回去等通知了!) 这个问题是一个粉丝给我提的,我觉得挺有意(KENG)思(B)! 于是,今天我们就来谈一谈,这个自增主键... -
Mybatis 获取自增主键
2022-02-20 16:29:16若数据库支持自动生成主键(比如 MySQL 和 SQL Server),则可以设置 useGeneratedKeys=“true”,表明使用自增主键获取主键值策略,然后再利用 keyProperty 属性指定对应的主键属性,也就是 Mybatis 获取到主键值后... -
mysql自增主键详解
2021-04-08 23:22:30文章目录什么是自增主键?自增主键的优点好处?自增值保存在哪儿?自增值修改机制自增主键 id不能保证连续的原因?原因一:唯一键冲突原因二:事务回滚原因三:自增锁的优化思考题 什么是自增主键? 当设置了主键... -
Mysql 自增主键
2021-05-30 18:51:55整型结合属性 auto_increment,可以实现自增功能,但在表结构设计时用自增做主键,希望你特别要注意以下两点,若不注意,可能会对业务造成灾难性的打击: 用 BIGINT 做主键,而不是 INT; 自增值并不持久化,可能会... -
DB2修改自增主键起始值
2017-11-16 15:23:00ALTER TABLE DB2INSTL.BT_AUDIT_COUNTY_DIFF_HISTORY_PX ALTER COLUMN ID RESTART WITH 18239 转载于:https://www.cnblogs.com/wangpei/p/7844542.html -
Oracle 创建自增主键
2022-03-19 15:55:59Oracle没有这个auto_increment属性,所以它无法像MySQL般在表内定义自增主键。但是,Oracle里的序列,可间接实现自增主键的作用。 序列: 序列(Sequence),又叫序列生成器,用于提供一系列的数字,开发人员使用... -
MySQL自增ID最大值被使用
2015-03-23 11:00:22问题:评论数据表hotel_info_comments自增ID列达到最大值2147483647,但是并不是每一个ID都被使用了 解决办法:清理数据表的跳跃自增ID,保持ID连贯。 解决步骤: 1. 创建评论临时表 create table `... -
39 | 自增主键为什么不是连续的?
2022-01-07 08:41:5539 | 自增主键为什么不是连续的? CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c` (`c`) ) ENGINE=...