萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

pt-online-schema-change 線上變更表結構與數據修復進階用法

Percona Toolkit 核心工具 pt-osc 深度解析:從 DDL 免鎖到主從數據修復

pt-online-schema-change(簡稱 pt-osc)是 Percona Toolkit 中最重量級的工具,解決 MySQL 5.6 前 DDL 鎖表痛點。本文涵蓋原理、普通用法、文藝用法(主從數據差異修復)、參數詳解與避坑指南。

一、為什麼需要 pt-osc?

MySQL 5.6 前 InnoDB 執行 DDL 流程:

  1. 建臨時表複製結構
  2. 鎖表 WRITE LOCK 阻塞寫入
  3. INSERT ... SELECT 全量拷貝
  4. RENAME TABLE 切換
  5. 釋放鎖

大表操作會導致業務長時間不可寫。pt-osc 通過「影子表 + 觸發器」實現**無鎖變更**。

二、pt-osc 工作原理

  1. 建立影子表 _tbl_new,結構與原表一致
  2. 在影子表執行 ALTER 變更結構
  3. 在原表建立 3 個觸發器(INSERT/UPDATE/DELETE),將變更實時同步至影子表
  4. 分塊拷貝歷史數據 INSERT IGNORE INTO _new SELECT ... WHERE pk BETWEEN ...
  5. 拷貝完成後 RENAME TABLE 原子切換
  6. 清理觸發器、舊表 _tbl_old

觸發器核心邏輯:全部使用 REPLACE INTO 保冪等性,確保數據最終一致。

三、普通青年用法:線上 DDL

核心參數

  • --dry-run:僅建影子表、執行 ALTER,不建觸發器、不拷貝、不切換(預檢)
  • --execute:正式執行完整流程(缺省不執行)
  • --alter:DDL 子句,如 ADD COLUMN c INT
  • --chunk-size:分塊行數(預設 1000),控制單次拷貝量
  • --sleep:分塊間休眠秒數,降低 IO 衝擊
  • --max-load:負載閾值超標暫停拷貝
  • --critical-load:嚴重負載直接中止

實戰範例

# 新增欄位
pt-online-schema-change \
  --alter="ADD COLUMN vid INT" \
  --execute \
  D=houyi,t=ga,h=10.250.7.50,u=root,p=yang

# 新增索引
pt-online-schema-change \
  --alter="ADD KEY idx_vid(vid)" \
  --execute \
  D=houyi,t=ga,h=10.250.7.50,u=root,p=yang

# 刪除欄位
pt-online-schema-change \
  --alter="DROP COLUMN vid" \
  --execute \
  D=houyi,t=ga,h=10.250.7.50,u=root,p=yang

四、文藝青年用法:主從數據差異修復

當 Slave 數據與 Master 存在差異(如誤刪、跳過事務),傳統 pt-table-sync 大表同步極慢。pt-osc 可借助 Row 格式 Binlog 實現**邏輯級無鎖同步**原理:

  1. 在 Master 上對目標表執行 pt-osc --alter='ENGINE=INNODB'(空 DDL)
  2. 強制 binlog_format=ROW:--set-vars 'binlog_format=ROW'
  3. 觸發器捕獲 Master 寫入 → 影子表 → RENAME 切換
  4. Row 格式 Binlog 記錄完整行映像 → 同步至所有 Slave
  5. Slave 重放 Binlog 後數據自動校準一致
pt-online-schema-change \
  --set-vars 'binlog_format=ROW' \
  --alter='ENGINE=INNODB' \
  --execute \
  D=test,t=tt1,h=localhost

優勢:無業務停寫、利用原生復制傳播、大表修復效率遠超 pt-table-sync。

五、限制與避坑

  • 表**必須有主鍵或唯一非空索引**,否則報 There is no good index
  • 表已存在觸發器 → 無法使用(觸發器衝突)
  • 外鍵表需指定 --alter-foreign-keys-method(drop_swap/rebuild_constraints)
  • MySQL 5.6+ 原生 Online DDL 已覆蓋大部分場景,pt-osc 仍適用於:
    ① 5.5/5.6 早期版本
    ② 不支援 Online DDL 的操作(如修改字符集、分區操作)
    ③ 主從數據修復場景
copyright © 萬盛學電腦網 all rights reserved