最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL億級(jí)大表安全添加字段的三種方案

 更新時(shí)間:2025年03月31日 08:55:31   作者:碼農(nóng)阿豪@新空間  
面對(duì)?1.35億條數(shù)據(jù)?的?MySQL?表添加字段,傳統(tǒng)?ALTER?TABLE?可能導(dǎo)致長(zhǎng)時(shí)間鎖表,嚴(yán)重影響業(yè)務(wù),本文將提供一套完整的?零停機(jī)方案,涵蓋?Online?DDL?優(yōu)化、專業(yè)工具使用?和?Java?應(yīng)用層配合策略,需要的朋友可以參考下

1. 億級(jí)大表 ALTER 的風(fēng)險(xiǎn)評(píng)估

1.1 直接執(zhí)行 ALTER 的潛在問(wèn)題

ALTER TABLE `orders` ADD COLUMN `is_priority` TINYINT NULL DEFAULT 0;
  • 鎖表時(shí)間估算(經(jīng)驗(yàn)值):
    • MySQL 5.6:約 2-6小時(shí)(完全阻塞)
    • MySQL 5.7+:10-30分鐘(短暫阻塞寫(xiě)入)
  • 業(yè)務(wù)影響:
    • 所有讀寫(xiě)請(qǐng)求超時(shí)
    • 連接池耗盡(Too many connections
    • 可能觸發(fā)高可用切換(如 MHA)

1.2 關(guān)鍵指標(biāo)檢查

-- 查看表大小(GB)
SELECT 
    table_name, 
    ROUND(data_length/1024/1024/1024,2) AS size_gb
FROM information_schema.tables 
WHERE table_schema = 'your_db' AND table_name = 'orders';

-- 檢查當(dāng)前長(zhǎng)事務(wù)
SELECT * FROM information_schema.innodb_trx 
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60;

2. 三種安全方案對(duì)比

方案工具執(zhí)行時(shí)間阻塞情況適用版本復(fù)雜度
Online DDL原生MySQL30min-2h短暫阻塞寫(xiě)5.7+★★☆
pt-oscPercona Toolkit2-4h零阻塞所有版本★★★
gh-ostGitHub1-3h零阻塞所有版本★★★★

3. 方案一:MySQL 原生 Online DDL(5.7+)

3.1 最優(yōu)執(zhí)行命令

ALTER TABLE `orders` 
ADD COLUMN `is_priority` TINYINT NULL DEFAULT 0,
ALGORITHM=INPLACE, 
LOCK=NONE;

3.2 監(jiān)控進(jìn)度(另開(kāi)會(huì)話)

-- 查看 DDL 狀態(tài)
SHOW PROCESSLIST;

-- 查看 InnoDB 操作進(jìn)度
SELECT * FROM information_schema.innodb_alter_table;

3.3 預(yù)估執(zhí)行時(shí)間(經(jīng)驗(yàn)公式)

時(shí)間(min) = 表大小(GB) × 2 + 10
  • 假設(shè)表大小 50GB → 約 110分鐘

4. 方案二:pt-online-schema-change 實(shí)戰(zhàn)

4.1 安裝與執(zhí)行

# 安裝 Percona Toolkit
sudo yum install percona-toolkit

# 執(zhí)行變更(自動(dòng)創(chuàng)建觸發(fā)器)
pt-online-schema-change \
--alter "ADD COLUMN is_priority TINYINT NULL DEFAULT 0" \
D=your_db,t=orders \
--chunk-size=1000 \
--max-load="Threads_running=50" \
--critical-load="Threads_running=100" \
--execute

4.2 關(guān)鍵參數(shù)說(shuō)明

參數(shù)作用推薦值(億級(jí)表)
--chunk-size每次復(fù)制的行數(shù)500-2000
--max-load自動(dòng)暫停閾值Threads_running=50
--critical-load強(qiáng)制中止閾值Threads_running=100
--sleep批次間隔時(shí)間0.5(秒)

4.3 Java 應(yīng)用兼容性處理

// 在觸發(fā)器生效期間,需處理重復(fù)主鍵異常
try {
    orderDao.insert(newOrder);
} catch (DuplicateKeyException e) {
    // 自動(dòng)重試或走降級(jí)邏輯
    orderDao.update(newOrder);
}

5. 方案三:gh-ost 高級(jí)用法

5.1 執(zhí)行命令(無(wú)需觸發(fā)器)

gh-ost \
--database="your_db" \
--table="orders" \
--alter="ADD COLUMN is_priority TINYINT NULL DEFAULT 0" \
--assume-rbr \
--allow-on-master \
--cut-over=default \
--execute

5.2 核心優(yōu)勢(shì)

  • 無(wú)觸發(fā)器設(shè)計(jì):避免性能損耗
  • 動(dòng)態(tài)限流:自動(dòng)適應(yīng)服務(wù)器負(fù)載
  • 可交互控制:支持暫停/恢復(fù)
# 運(yùn)行時(shí)控制
echo throttle | nc -U /tmp/gh-ost.sock
echo no-throttle | nc -U /tmp/gh-ost.sock

6. Java 應(yīng)用層適配策略

6.1 雙寫(xiě)兼容模式(推薦)

// 在變更期間同時(shí)寫(xiě)入新舊字段
public void createOrder(Order order) {
    order.setIsPriority(0); // 新字段默認(rèn)值
    orderMapper.insert(order);
    
    // 兼容舊代碼
    if (order.getV2() == null) {
        orderMapper.updateIsPriority(order.getId(), 0);
    }
}

6.2 動(dòng)態(tài) SQL 路由

<!-- MyBatis 動(dòng)態(tài)字段映射 -->
<insert id="insertOrder">
    INSERT INTO orders 
    (id, user_id, amount
    <if test="isPriority != null">, is_priority</if>)
    VALUES
    (#{id}, #{userId}, #{amount}
    <if test="isPriority != null">, #{isPriority}</if>)
</insert>

7. 監(jiān)控與回滾方案

7.1 實(shí)時(shí)監(jiān)控指標(biāo)

# 監(jiān)控復(fù)制延遲(主從架構(gòu))
pt-heartbeat --monitor --database=your_db

# 查看 gh-ost 進(jìn)度
tail -f gh-ost.log

7.2 緊急回滾步驟

# pt-osc 回滾(自動(dòng)清理臨時(shí)表)
pt-online-schema-change --drop-new-table --alter="..." --execute

# gh-ost 回滾
gh-ost --panic-on-failure --revert

8. 總結(jié)建議

  1. 首選方案:

    • MySQL 8.0 → 原生 ALGORITHM=INSTANT(秒級(jí)完成)
    • MySQL 5.7 → gh-ost(無(wú)觸發(fā)器影響)
  2. 執(zhí)行窗口:

    • 選擇業(yè)務(wù)流量最低時(shí)段(如凌晨 2-4 點(diǎn))
    • 提前通知業(yè)務(wù)方準(zhǔn)備降級(jí)方案
  3. 驗(yàn)證流程:

-- 變更后檢查數(shù)據(jù)一致性
SELECT COUNT(*) FROM orders WHERE is_priority IS NULL;
  • 后續(xù)優(yōu)化:
-- 添加完成后可改為 NOT NULL
ALTER TABLE orders 
MODIFY COLUMN is_priority TINYINT NOT NULL DEFAULT 0;

通過(guò)合理選擇工具+應(yīng)用層適配,即使 1.35億條數(shù)據(jù) 的表也能實(shí)現(xiàn) 零感知 的字段添加。

以上就是MySQL億級(jí)大表安全添加字段的三種方案的詳細(xì)內(nèi)容,更多關(guān)于MySQL大表添加字段的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL實(shí)現(xiàn)定時(shí)自動(dòng)備份的流程步驟(Windows環(huán)境)

    MySQL實(shí)現(xiàn)定時(shí)自動(dòng)備份的流程步驟(Windows環(huán)境)

    這篇文章主要介紹了MySQL實(shí)現(xiàn)定時(shí)自動(dòng)備份的流程步驟(Windows環(huán)境),文中通過(guò)圖文結(jié)合的方式介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • MySQL8.0高可用MIC的實(shí)現(xiàn)

    MySQL8.0高可用MIC的實(shí)現(xiàn)

    本文介紹了如何實(shí)現(xiàn)MySQL8.0高可用MIC,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • mysql 5.7.23 安裝配置圖文教程

    mysql 5.7.23 安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.23 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • MySQL實(shí)現(xiàn)雪花Id函數(shù)

    MySQL實(shí)現(xiàn)雪花Id函數(shù)

    相比UUID無(wú)序生成的id而言,雪花算法是有序的,而且都是由數(shù)字組成,本文主要介紹了MySQL實(shí)現(xiàn)雪花Id函數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • MySQL5.73?root用戶密碼修改方法及ERROR?1193、ERROR1819與ERROR1290報(bào)錯(cuò)解決

    MySQL5.73?root用戶密碼修改方法及ERROR?1193、ERROR1819與ERROR1290報(bào)錯(cuò)解決

    這篇文章主要給大家介紹了關(guān)于MySQL5.73?root用戶密碼修改方法及ERROR?1193、ERROR1819與ERROR1290:...?running?with?--skip-...報(bào)錯(cuò)的解決方法,文中通過(guò)圖文將解決的步驟介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • MySQL數(shù)據(jù)庫(kù)入門(mén)之備份數(shù)據(jù)庫(kù)操作詳解

    MySQL數(shù)據(jù)庫(kù)入門(mén)之備份數(shù)據(jù)庫(kù)操作詳解

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)入門(mén)之備份數(shù)據(jù)庫(kù)操作,結(jié)合實(shí)例形式詳細(xì)分析了MySQL備份數(shù)據(jù)庫(kù)基本操作命令與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • MySQL5.7免安裝版配置圖文教程

    MySQL5.7免安裝版配置圖文教程

    Mysql是一個(gè)比較流行且很好用的一款數(shù)據(jù)庫(kù)軟件,如下記錄了我學(xué)習(xí)總結(jié)的mysql免安裝版的配置經(jīng)驗(yàn),感興趣的的朋友參考下吧
    2017-09-09
  • 如何解決mysql重裝失敗方法介紹

    如何解決mysql重裝失敗方法介紹

    相信大家使用MySQL都有過(guò)重裝的經(jīng)歷,要是重裝MySQL基本都是在最后一步通不過(guò),除非重裝操作系統(tǒng),究其原因就是系統(tǒng)里的注冊(cè)表沒(méi)有刪除干凈
    2012-11-11
  • 在MySQL中增添新用戶權(quán)限的方法

    在MySQL中增添新用戶權(quán)限的方法

    在MySQL中增添新用戶權(quán)限的方法...
    2007-03-03
  • MySQL的23個(gè)需要注意的地方

    MySQL的23個(gè)需要注意的地方

    本文將為大家介紹的是MySQL數(shù)據(jù)庫(kù)的23個(gè)特別注意事項(xiàng),希望各位DBA能從中得到一些啟發(fā)。
    2010-08-08

最新評(píng)論

桃江县| 乐业县| 汝城县| 思南县| 林甸县| 察隅县| 蓬莱市| 禄劝| 同德县| 雅江县| 台北县| 宽甸| 如皋市| 太原市| 南华县| 石首市| 家居| 昭通市| 雷州市| 淮南市| 延吉市| 尖扎县| 霍邱县| 新营市| 高青县| 建阳市| 南开区| 汶川县| 新巴尔虎左旗| 禄丰县| 崇礼县| 荣成市| 金山区| 蒙自县| 鄂托克旗| 工布江达县| 江永县| 买车| 清水河县| 屏南县| 苏尼特左旗|