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

news2025/1/30 12:34:14

线上突发: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.coloradmin.cn/o/2284894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32 I2S音频总线学习笔记(二):I2S读取INMP441音频数据

简介 在这个系列的上一篇文章中,我们介绍了ESP32 I2S音频总线的相关知识,简要了解了什么是I2S总线、它的通信格式,以及相关的底层API函数。没有看过上篇文章的可以点击文章进行回顾: ESP32 I2S音频总线学习笔记(一&a…

一文简单回顾Java中的String、StringBuilder、StringBuffer

简单说下String、StringBuilder、StringBuffer的区别 String、StringBuffer、StringBuilder在Java中都是用于处理字符串的,它们之间的区别是String是不可变的,平常开发用的最多,当遇到大量字符串连接的时候,就用StringBuilder&am…

matlab中,fill命令用法

在 MATLAB 中,fill 命令用于创建填充多边形的图形对象。使用 fill 可以在二维坐标系中绘制填充的区域,通常用于绘制图形的背景或显示数据分布。 基本语法 fill(X, Y, C)X 和 Y 是同样长度的向量,定义了多边形的顶点坐标。C 是颜色&#xff0…

计算机网络之链路层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 02 数据链路层 在网上看到其他人做了详细的笔记,就不再多余写了,直接参考着学习吧。 1 详解数据链路层-数据链路层的功能【王道计算机网络笔记】_wx63088f6683f8f的技术博客_51C…

lib.exe正确用法winhv.lib生成方法

lib.exe /def:winhv.def /OUT:winhv.lib /machine:x64 winhv.def注意是 winhv.sys要不然会变成dll LIBRARY winhv.sys EXPORTSWinHvAllocateOverlayPagesWinHvDisablePartitionVtlWinHvDisableVpVtlWinHvEnablePartitionVtlWinHvEnableVpVtlWinHvFreeOverlayPagesWinHvGetCurr…

react-bn-面试

1.主要内容 工作台待办 实现思路: 1,待办list由后端返回,固定需要的字段有id(查详细)、type(本条待办的类型),还可能需要时间,状态等 2,一个集中处理待办中转路由页,所有待办都跳转到这个页面…

Linux:一切皆文件

**文件描述符**:它是一种特殊的索引,本质上是进程中file_struct结构体成员fd_array数组的下标。在Linux等系统中,文件描述符是一个非负整数,用于标识打开的文件,是内核为了高效管理已被打开的文件所创建的索引。通过文…

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR、流水线及伪指令

文章目录 指令格式(重点)1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…

项目集成Nacos

文章目录 1.环境搭建1.创建模块 sunrays-common-cloud-nacos-starter2.目录结构3.pom.xml4.自动配置1.NacosAutoConfiguration.java2.spring.factories 5.引入cloud模块通用依赖 2.测试1.创建模块 sunrays-common-cloud-nacos-starter-demo2.目录结构3.pom.xml4.application.ym…

QT交叉编译环境搭建(Cmake和qmake)

介绍一共有两种方法(基于qmake和cmake): 1.直接调用虚拟机中的交叉编译工具编译 2.在QT中新建编译套件kits camke和qmake的区别:CMake 和 qmake 都是自动化构建工具,用于简化构建过程,管理编译设置&…

[cg] 使用snapgragon 对UE5.3抓帧

最近想要抓opengl 的api,renderdoc在起应用时会闪退(具体原因还不知道),试了下snapgraon, 还是可以的 官网需要注册登录后下载,官网路径:Developer | Qualcomm 为了方便贴上已经下载好的exe安装包&#x…

物业巡更系统在现代社区管理中的优势与应用探讨

内容概要 在现代社区管理中,物业巡更系统正逐渐成为一种不可或缺的工具。结合先进的智能技术,这些系统能够有效地提升社区管理的各个方面,尤其是在巡检效率和信息透明度方面。通过实时记录巡检数据,物业管理人员能够确保工作人员…

速通Docker === Docker Compose

目录 Docker Compose 简介 Docker Compose 常用命令 使用 Docker Compose 启动 WordPress 普通启动方式(使用 Docker 命令) 使用 Docker Compose 启动 Docker Compose 的特性 Docker Compose 简介 Docker Compose 是一个用于定义和运行多容器 Dock…

Spring MVC 综合案例

目录 一. 加法计算器 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 3. 服务器端代码 4. 运行测试 二. 用户登录 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 (1) 登录界面接口 (2) 首页接口 3. 服务器端代码 4. 运行测试 三. 留言板 1. 准备…

数据分析系列--③RapidMiner算子说明及数据预处理

一、算子说明 1 新建过程 2 算子状态灯 状态灯说明: (1)状态指示灯: 红色:指示灯说明有参数未被设置或输入端口未被连接等问题; 黄色:指示灯说明还未执行算子,不管配置是否基本齐全; 绿色:指示灯说明一切正常,已成功执行算子。 (2)三角…

NLP自然语言处理通识

目录 ELMO 一、ELMo的核心设计理念 1. 静态词向量的局限性 2. 动态上下文嵌入的核心思想 3. 层次化特征提取 1. 双向语言模型(BiLM) 2. 多层LSTM的层次化表示 三、ELMo的运行过程 1. 预训练阶段 2. 下游任务微调 四、ELMo的突破与局限性 1. 技术突破 2. …

Time Constant | RC 和 RL 电路中的时间常数

注:本文为 “Time Constant” 相关文章合辑。 机翻,未校。 How To Find The Time Constant in RC and RL Circuits June 8, 2024 💡 Key learnings: 关键学习点: Time Constant Definition: The time constant (τ) is define…

无心剑七绝《除夕快乐》

七绝除夕快乐 除旧迎新瑞气扬 夕阳烂漫映红妆 快言美酒佳肴味 乐享天伦福满堂 2025年1月28日 平水韵七阳平韵 无心剑这首七绝以“除夕快乐”为题,巧妙地运用了藏头手法,将“除夕快乐”四字分别嵌入诗的每一句首字,构思精巧,富有新…

Object类(3)

大家好,今天继续给大家介绍一下object类中的方法,那么话不多说,来看。 hashcode()这个方法,帮我们算了一个具体的对象位置,这里面涉及到数据结构,简单认为它是个内存地址,然后调用Integer.toHexString ()将这个地址以16进制输出。 该方法是一…

GPU上没程序在跑但是显存被占用

原因:存在僵尸线程,运行完但是没有释放内存 查看僵尸线程 fuser -v /dev/nvidia*关闭僵尸线程 pkill -9 -u 用户名 程序名 举例:pkill -9 -u grs python参考:https://blog.csdn.net/qq_40206371/article/details/143798866