線上突發: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.pswp.cn/web/66733.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66733.shtml
英文地址,請注明出處:http://en.pswp.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.順序…