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

MySQL海量數(shù)據(jù)(2億級表字段)無損更新方案

 更新時間:2025年04月02日 08:40:56   作者:碼農阿豪@新空間  
在大型互聯(lián)網應用中,數(shù)據(jù)表動輒達到億級規(guī)模,當需要對生產環(huán)境中的海量表進行字段更新時,如何在不影響業(yè)務正常讀寫的情況下完成任務,是每個DBA和開發(fā)者都會面臨的挑戰(zhàn),本文將以一個真實案例詳細講解四種漸進式更新方案及其實現(xiàn)原理,需要的朋友可以參考下

一、問題背景與挑戰(zhàn)

1.1 場景描述

  • 表名:statistics_data
  • 數(shù)據(jù)量:2億條記錄
  • 需求:將timeout字段全部更新為0
  • 約束條件:業(yè)務持續(xù)運行,不能有顯著影響

1.2 核心難點

  1. 鎖爭用風險:全表更新可能導致長時間鎖表
  2. 主從延遲:大批量操作產生大量binlog
  3. 性能波動:CPU/IO壓力影響正常查詢響應
  4. 進度控制:需要可中斷、可監(jiān)控的方案

二、四大解決方案對比

2.1 方案一:直接全表更新(不推薦)

-- 危險操作!會導致長時間鎖表
UPDATE statistics_data SET timeout = 0;

缺陷:

  • 產生單個大事務,鎖定全表直到完成
  • 可能觸發(fā)undo空間爆滿
  • 回滾成本極高

2.2 方案二:分批更新(推薦)

Shell腳本實現(xiàn)

#!/bin/bash
# 分批更新腳本(每10萬條間隔1秒)
while true; do
  affected=$(mysql -uroot -p$PWD -e "
    UPDATE statistics_data 
    SET timeout = 0 
    WHERE timeout != 0 
    LIMIT 100000;
    SELECT ROW_COUNT();" | tail -1)
  
  [ $affected -eq 0 ] && break
  sleep 1
done

優(yōu)勢:

  • 每次只鎖定少量行
  • 可通過調整LIMIT值控制單次影響

執(zhí)行效果監(jiān)控

-- 查看剩余待更新量
SELECT COUNT(*) FROM statistics_data WHERE timeout != 0;

2.3 方案三:pt-online-schema-change

Percona工具鏈的黃金方案:

pt-online-schema-change \
  --alter "MODIFY timeout INT DEFAULT 0" \
  D=database,t=statistics_data \
  --execute

原理:

  • 創(chuàng)建影子表(結構+新字段定義)
  • 增量同步原表數(shù)據(jù)到影子表
  • 原子切換表名

2.4 方案四:主從切換更新

操作步驟:

  • 在從庫執(zhí)行全量更新
  • 主從切換(需配合VIP或DNS切換)
  • 原主庫作為新從庫追平數(shù)據(jù)

三、Python自動化實現(xiàn)詳解

3.1 完整腳本代碼

import pymysql
import time
import sys

def batch_update(config):
    conn = pymysql.connect(config)
    cursor = conn.cursor()
    
    # 獲取總記錄數(shù)
    cursor.execute("SELECT COUNT(*) FROM statistics_data WHERE timeout != 0")
    total = cursor.fetchone()[0]
    
    print(f"待更新記錄總數(shù): {total}")
    
    batch_size = 100000
    updated = 0
    start = time.time()
    
    try:
        while updated < total:
            sql = f"""
                UPDATE statistics_data 
                SET timeout = 0 
                WHERE timeout != 0 
                LIMIT {batch_size}
            """
            cursor.execute(sql)
            count = cursor.rowcount
            conn.commit()
            
            updated += count
            progress = updated / total * 100
            
            print(f"\r進度: {updated}/{total} ({progress:.2f}%)", end="")
            
            if count == batch_size:
                time.sleep(1)  # 主動暫停降低負載
                
    except Exception as e:
        conn.rollback()
        print(f"\n錯誤發(fā)生: {str(e)}")
    finally:
        cursor.close()
        conn.close()
        
    print(f"\n更新完成! 耗時: {time.time()-start:.2f}秒")

if __name__ == "__main__":
    db_config = {
        'host': '10.0.0.5',
        'port': 3307,  # 非標準端口示例
        'user': 'admin',
        'password': 'safe@123',
        'db': 'stats_db',
        'connect_timeout': 60
    }
    batch_update(db_config)

3.2 關鍵優(yōu)化點

  • 動態(tài)進度顯示

print(f"\r進度: {updated}/{total} ({progress:.2f}%)", end="")
    • \r實現(xiàn)行內刷新輸出
    • 避免日志刷屏
  • 自適應批次調整

if os.getloadavg()[0] > 5.0:
    batch_size = max(50000, batch_size // 2)
  • 連接池支持
from DBUtils.PooledDB import PooledDB
pool = PooledDB(pymysql, db_config)

四、原理深度解析

4.1 InnoDB的鎖機制

-- 查看當前鎖狀態(tài)
SELECT * FROM performance_schema.events_waits_current 
WHERE EVENT_NAME LIKE '%lock%';
  • 行鎖(Record Lock):僅鎖定被更新的記錄
  • 間隙鎖(Gap Lock):WHERE條件無索引時會升級

4.2 MVCC如何保障讀寫分離

  • 讀操作訪問read_view快照
  • 寫操作創(chuàng)建新版本記錄

4.3 事務拆分最佳實踐

# 每批次提交后立即釋放鎖
conn.commit()  
time.sleep(0.5)  # 故意留出鎖釋放窗口

五、生產環(huán)境注意事項

  1. 前置檢查清單

    •  確認備庫磁盤空間足夠(至少2倍表大?。?/li>
    •  檢查innodb_buffer_pool_size是否足夠
    •  備份mysqldump -–single-transaction stats_db statistics_data
  2. 熔斷機制

if time.localtime().tm_hour in range(9,18):  # 白天工作時間
    print("禁止在業(yè)務高峰執(zhí)行!")
    sys.exit(1)
  • 監(jiān)控指標
watch -n 1 "mysqladmin ext | grep -E 'Threads_running|Queries'"

結語

通過分批更新、工具輔助、架構調整三種維度的解決方案,配合Python自動化腳本的實現(xiàn),我們成功實現(xiàn)了2億級數(shù)據(jù)表的無損更新。建議讀者在實際操作前:

  1. 在測試環(huán)境驗證腳本
  2. 提前與業(yè)務方溝通維護窗口
  3. 準備好回滾方案(如:通過備份恢復)

經驗法則:對于超過1億行的表,單次操作數(shù)據(jù)量控制在10萬條以內,間隔時間不少于0.5秒,可確保業(yè)務平穩(wěn)運行。

以上就是MySQL海量數(shù)據(jù)(2億級表字段)無損更新方案的詳細內容,更多關于MySQL數(shù)據(jù)無損更新的資料請關注腳本之家其它相關文章!

相關文章

  • MySQL中BIGINT數(shù)據(jù)類型如何存儲整數(shù)值

    MySQL中BIGINT數(shù)據(jù)類型如何存儲整數(shù)值

    mysql數(shù)據(jù)庫設計,其中對于數(shù)據(jù)性能優(yōu)化,字段類型考慮很重要,下面這篇文章主要給大家介紹了關于MySQL中BIGINT數(shù)據(jù)類型如何存儲整數(shù)值的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • mysql修復數(shù)據(jù)表的命令方法

    mysql修復數(shù)據(jù)表的命令方法

    網站運行中mysql的數(shù)據(jù)表難免會出現(xiàn)類似"is marked as crashed and should be repaired"的錯誤,我們可以用下面這個命令修復
    2014-02-02
  • MySQL 壓縮的使用場景和解決方案

    MySQL 壓縮的使用場景和解決方案

    數(shù)據(jù)分布特點,決定了空間壓縮的效率,如果存入的數(shù)據(jù)的重復率較高,其壓縮率就會較高;通常情況下字符類型數(shù)據(jù)(CHAR, VARCHAR, TEXT or BLOB )具有較高的壓縮率,而一些二進制數(shù)據(jù)或者一些已經壓縮過的數(shù)據(jù)的壓縮率不會很好
    2017-06-06
  • MySQL遠程訪問設置終極方法

    MySQL遠程訪問設置終極方法

    這篇文章主要介紹了MySQL遠程訪問設置終極方法,本文總結了多種設置方法和技巧,是解決遠程訪問的終極解決方案,需要的朋友可以參考下
    2014-12-12
  • mysql下的max_allowed_packet參數(shù)設置詳解

    mysql下的max_allowed_packet參數(shù)設置詳解

    本文主要介紹了mysql下的max_allowed_packet參數(shù)設置詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • MySQL遠程訪問配置與常見問題解決指南

    MySQL遠程訪問配置與常見問題解決指南

    本文記錄了一次MySQL遠程連接過程中遇到的坑及其解決方案,主要包括基礎命令行操作、遠程訪問配置、認證插件不兼容、IP被拉黑等問題,提出了解決方案,需要的朋友可以參考下
    2026-04-04
  • Mysql數(shù)據(jù)庫命令大全

    Mysql數(shù)據(jù)庫命令大全

    mysql命令大家經常會用到,但是很少有朋友整理吧,最近項目不多,抽個時間把mysql數(shù)據(jù)庫命令總結給大家,需要的朋友可以參考下
    2015-09-09
  • Mysql數(shù)據(jù)庫之約束條件詳解

    Mysql數(shù)據(jù)庫之約束條件詳解

    本文介紹了數(shù)據(jù)庫表中的主鍵約束、非空約束、唯一約束、默認值約束和外鍵約束,并舉例說明了如何在創(chuàng)建表和修改表時設置這些約束
    2025-01-01
  • MySQL鎖等待與死鎖問題分析

    MySQL鎖等待與死鎖問題分析

    這篇文章主要介紹了MySQL鎖等待與死鎖問題分析,幫助大家更好的理解和學習使用MySQL,感興趣的朋友可以了解下
    2021-03-03
  • MySQL數(shù)據(jù)庫如何正確設置主鍵

    MySQL數(shù)據(jù)庫如何正確設置主鍵

    主鍵是用于唯一標識數(shù)據(jù)庫表中每一行數(shù)據(jù)的一列或一組列,主鍵可以確保數(shù)據(jù)的唯一性和完整性,這篇文章主要給大家介紹了關于MySQL數(shù)據(jù)庫如何正確設置主鍵的相關資料,需要的朋友可以參考下
    2024-04-04

最新評論

来宾市| 泾川县| 故城县| 蒲城县| 通许县| 辽阳县| 射洪县| 星子县| 西和县| 九江市| 淮阳县| 通渭县| 莎车县| 休宁县| 蓬莱市| 团风县| 老河口市| 合作市| 客服| 陈巴尔虎旗| 扶绥县| 祁东县| 吴江市| 夏津县| 台山市| 潍坊市| 二连浩特市| 固安县| 嘉荫县| 中卫市| 开远市| 楚雄市| 洞口县| 桦甸市| 永济市| 灵台县| 洱源县| 三亚市| 桐柏县| 霍山县| 元阳县|