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

线上突发: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.mzph.cn/web/66733.shtml

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

相关文章

[Java] Solon 框架的三大核心组件之一插件扩展体系

1、Solon 的三大核心组件 核心组件说明Plugin 插件扩展机制提供“编码风格”的扩展体系Ioc/Aop 应用容器提供基于注入依赖的自动装配体系ContextHandler 通用上下文处理接口提供“开放式处理”适配体系(俗称,三元合一) 2、Solon Plugin 插件…

TRELLIS微软的图生3D

TRELLIS 教程目录: Youtube:https://www.youtube.com/watch?vJqFHZ-dRMhI 官网地址:https://trellis3d.github.io/ GitHub:https://github.com/Microsoft/TRELLIS 部署目录: 克隆项目 git clone --recurse-submodul…

Java导出通过Word模板导出docx文件并通过QQ邮箱发送

一、创建Word模板 {{company}}{{Date}}服务器运行情况报告一、服务器:总告警次数:{{ServerTotal}} 服务器IP:{{IPA}},总共告警次数:{{ServerATotal}} 服务器IP:{{IPB}},总共告警次数:{{ServerBTotal}} 服务器IP:{{IPC}}&#x…

【22】Word:小李-高新技术企业政策❗

目录 题目​ NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在删除空白行等要求,可以到最后来完成。注意最后一定要检查此部分!注意:大多是和事例一样即可,不用一摸一样,但也不要差太多。 题目 NO1.2 F12Fn&a…

自动化部署(三):项目管理平台

一、项目管理平台作用 帮助团队高效规划、执行和监控项目进度,确保任务按时完成并实现目标 敏捷开发:提供标准敏捷研发管理,支持Scrum 与 Kanban 规模化敏捷:支持大型研发团队跨项目协同,实现多项目路线图规划和资源管…

常用集合-数据结构-MySql

目录 java核心: 常用集合与数据结构: 单例集合: 双列集合: 线程安全的集合: ConcurrentHashMap集合: HashTable集合: CopyOnWriteArrayList集合: CopyOnWriteArraySet集合: ConcurrentLinkedQueue队列: ConcurrentSkipListMap和ConcurrentSkipListSet&…

IP属地与视频定位位置不一致:现象解析与影响探讨

在数字化时代,IP属地和视频定位位置已成为我们获取网络信息、判断内容真实性的重要依据。然而,有时我们会发现,某些视频内容中展示的定位位置与其发布者的IP属地并不一致。这种不一致现象引发了广泛的关注和讨论。本文旨在深入剖析IP属地与视…

计算机毕业设计hadoop+spark股票基金推荐系统 股票基金预测系统 股票基金可视化系统 股票基金数据分析 股票基金大数据 股票基金爬虫

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

机器学习-数据集划分

文章目录 一. 为什么要划分数据集二. 数据集划分的方法1. 留出法:2. 交叉验证:将数据集划分为训练集,验证集,测试集3. 留一法:4. 自助法: 一. 为什么要划分数据集 为了能够评估模型的泛化能力,可…

根据当前用户的活动、当地天气和喜欢音乐类型,然后根据这些信息来播放相应的Spotify音乐 附python代码

这段代码是一个Python脚本,它使用了几个外部库来创建一个简单的图形用户界面(GUI),让用户根据当前用户的活动、当地天气和喜欢音乐类型,然后根据这些信息来播放相应的音乐。 1. **导入库**: - `openai`:用于与OpenAI API交互(尽管在这段代码中没有使用)。 - `sp…

excel导入数据处理前端

dialogErrorVisible false;dialogErrorTitle ;//错误标题public get gridErrorOptions(): GridOptions {return {headerHeight: 30, // 表头高度rowHeight: 30, // 行高columnDefs: [//列定义{headerName: "序号",field: "SerialNumber",width: 40,pinne…

Vue 拦截监听原理

Vue 渐进式JavaScript 框架 学习笔记 - Vue 拦截监听原理 目录 拦截监听原理 如何跟踪变化 拦截监听示例 观察者 注意:vue3的变化 总结 拦截监听原理 如何跟踪变化 当你把一个普通的Javascript 对象传入 Vue 实例作为data选项,Vue 将遍历此对象所有的proper…

全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析

本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中,我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现,以及基本的系统性能指标,包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…

基于JAVA的校园二手商品交易平台的设计与开发

摘 要:政府政策引导与社会观念的转变使得国内大学生的创业意识逐渐提高,很多高校大学生开始自主创业。目前我国各大高校暂且还没有较为成型的针对校内学生创业者的校园网络服务平台。本文首先主要是介绍了关于java语言以及web开发的相关技术,…

HarmonyOS Next 应用UI生成工具介绍

背景 HarmonyOS Next适配开发过程中难买难要参考之前逻辑,但是可能时间较长文档不全,只能参考Android或iOS代码,有些逻辑较重的场景还可以通过AI工具将Android 的Java代码逻辑转成TS完成部分复用。对于一些UI场景只能手动去写,虽…

总结6..

背包问题的解决过程 在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值,同…

代码随想录day1

704.二分查找&#xff1a; 1.左闭右闭 int search(vector<int>& nums, int target) {int right nums.size() - 1;int left 0;while(left < right){int middle left ((right - left) >> 1);if(nums.at(middle) target){return middle;}else if(nums[m…

四级词汇第六期

1.accomplish 完成 2.implication 暗示 3.complicated 复杂的 4.extent 范围 5.sufficient 充足的 6.remarkable 引人注目的 7.insight 洞察 8.executive 管理的 9.overlook 俯瞰 忽略 10.urge 渴望 激励 11.urgent 紧急的 12.accumulate 积累 13.appreciate 赏识 …

OpenHarmony OTA升级参考资料记录

OpenHarmony 作为一个开源分布式操作系统,通过其强大的 OTA(Over-The-Air)升级能力,为开发者和厂商提供了一套灵活而安全的系统升级方案。 OTA升级方式 根据升级包的应用方式,OpenHarmony 的 OTA 升级可以分为两种:本地升级和网络OTA升级。 本地升级 本地升级是将已制作…

【数据结构篇】顺序表 超详细

目录 一.顺序表的定义 1.顺序表的概念及结构 1.1线性表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 二.动态顺序表的实现 1.准备工作和注意事项 2.顺序表的基本接口&#xff1a; 2.0 创建一个顺序表 2.1 顺序表的初始化 2.2 顺序表的销毁 2.3 顺序表的打印 3.顺序…