线上突发:MySQL 自增 ID 用完,怎么办?

news/2025/1/23 23:03:42/

线上突发:MySQL 自增 ID 用完,怎么办?

  • 1. 问题背景
  • 2. 场景复现
  • 3. 自增id用完怎么办?
  • 4. 总结

1. 问题背景

最近,我们在数据库巡检的时候发现了一个问题:线上的地址表自增主键用的是int类型。随着业务越做越大,数据量也越来越多,自增ID眼看就要到头了——上限是2147483647


一旦自增ID到达上限,会发生什么呢?

2. 场景复现

为了让问题更加清晰,咱们用一个简单的Demo来验证一下。

  1. 创建表并设置自增ID接近上限
CREATE TABLE t (id INT AUTO_INCREMENT PRIMARY KEY
) AUTO_INCREMENT = 2147483647;
  1. 向表中插入一条数据
insert INTO t values(NULL);
  1. 执行查询语句
select * from t;

发现ID是 2147483647,成功了。
在这里插入图片描述

  1. 可再次插入数据
insert into t values(null);

在这里插入图片描述
原因很简单,int类型的自增ID上限已到,再次插入时仍尝试使用相同的值,导致主键冲突。

3. 自增id用完怎么办?

1. 方案一:更改字段类型为BIGINT

  • 将 id 字段类型从 INT 修改为 BIGINT,这样 ID 的最大值将从 2147483647 提升到 2^63-1,大大增加了可用的 ID 范围。
  • 执行SQL语句:ALTER TABLE table_name MODIFY id BIGINT AUTO_INCREMENT;
  • 优点:操作简单,不需要改业务逻辑;
  • 缺点:如果表数据量很大,修改字段类型可能会导致性能问题,尤其是在没有停机维护的情况下,可能会影响数据库的响应速度。

2. 方案二:使用 UUID 替代自增 ID

  • 将主键字段类型改为 CHAR(36),然后使用 UUID() 函数生成全局唯一标识符。
  • 执行SQL语句:ALTER TABLE your_table_name MODIFY id CHAR(36) PRIMARY KEY;
  • 优点:ID是全局唯一的,不用担心冲突;
  • 缺点:存储空间增大,索引效率也稍微差一点,但一般影响不大。

3. 方式三:分布式ID生成(如 Snowflake 算法)

  • 使用分布式 ID 生成器(如 Twitter 的 Snowflake 算法)或者借助 Redis、Zookeeper 等工具生成唯一 ID。
  • 优点:高性能、高扩展性,特别适合大规模分布式系统。
  • 缺点:实现起来稍微复杂一点,需要额外的工具支持。

4. 方式四:防患于未然——监控自增 ID 使用情况

  • 提前监控:定期检查自增 ID 的使用情况,提前发现接近最大值的风险。通过定期查询最大 ID 值,可以避免最后一刻的紧急应对。

  • 检查 SQL 很简单:

SELECT COL.TABLE_SCHEMA,COL.TABLE_NAME,COL.COLUMN_NAME,COL.DATA_TYPE,TAB.AUTO_INCREMENT 
FROM information_schema.COLUMNS COL JOIN information_schema.TABLES TAB ON COL.TABLE_NAME = TAB.TABLE_NAME 
WHERE COL.EXTRA = 'auto_increment' AND COL.DATA_TYPE = 'int' AND TAB.AUTO_INCREMENT > 1647483647;

4. 总结

自增 ID 用尽确实是个让人头疼的问题,但其实并不可怕。只要我们提前做好准备,问题就能轻松解决。具体来说:

  • 提前搭建监控和预警机制:定期检查自增ID的使用情况,避免等到 ID 用完了才慌忙应对。一旦发现接近上限,及时采取措施,就能有效避免线上故障。
  • 系统设计时多考虑细节:设计数据库时多考虑未来的扩展性。如果业务增长迅速,早期就可以用 BIGINT 替代 INT,或者直接考虑分布式 ID 生成方案。这样一来,未来的数据增长就不会成为问题。

总之,技术问题并不可怕,真正可怕的是没有提前规划和准备。只要在日常工作中多留心、提前设计,麻烦就能在萌芽阶段被解决。


http://www.ppmy.cn/news/1565602.html

相关文章

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…

深入了解 Linux 的虚拟内存管理机制:Swap 机制

文章目录 深入了解 Linux 的 Swap 机制一、什么是 Swap?二、Swap 的工作原理三、Swap 的类型四、Swap 的使用场景五、配置 Swap六、Swap 的性能影响七、如何优化 Swap 使用八、总结 深入了解 Linux 的 Swap 机制 在 Linux 操作系统中,Swap 是一种虚拟内…

十一、apply家族(4)

tapply()函数 tapply()函数主要是用于对一个因子或因子列表,执行指定的函数调用,最后获得汇总信息。 tapply()函数的使用格式如下所示。 tapply(x, INDEX, FUN, ...&am…

centos 安全配置基线

CentOS 是一个广泛使用的操作系统,为了确保系统的安全性,需要遵循一系列的安全基线。以下是详细的 CentOS 安全基线配置建议: 通过配置核查,CentOS操作系统未安装入侵防护软件,无法检测到对重要节点进行入侵的 解决方案: 安装入侵…

【线性代数】基础版本的高斯消元法

[精确算法] 高斯消元法求线性方程组 线性方程组 考虑线性方程组, 已知 A ∈ R n , n , b ∈ R n A\in \mathbb{R}^{n,n},b\in \mathbb{R}^n A∈Rn,n,b∈Rn, 求未知 x ∈ R n x\in \mathbb{R}^n x∈Rn A 1 , 1 x 1 A 1 , 2 x 2 ⋯ A 1 , n x n b 1…

【jmeter】下载及使用教程【mac】

1.安装java 打开 Java 官方下载网站https://www.oracle.com/java/technologies/downloads/选择您想要下载的 Java 版本,下载以 .dmg 结尾的安装包,注意 JMeter 需要 Java 8下载后打开安装包点击“安装”按钮即可 2.下载jmeter 打开 Apache JMeter 官方…

selenium获取登录token

背景 新到一个需求需要用爬虫采集数据,但这个采购的系统登录做了加密,我也懒得研究前端代码了,于是考虑用selenium来获取用户token做处理。 下载webdriver 由于我开发机器使用的chorme,因此下载的chorme webdriver,…

Mysql面试题----为什么B+树比B树更适合实现数据库索引

数据存储结构 B 树:每个节点既存储键值,也存储数据记录的指针。这种存储方式使得每个节点存储的键值数量相对较少,因为还要为指针留出空间。当数据量较大时,树的高度会相对较高,导致查询时需要更多的磁盘 I/O 操作来遍…