pt-online-schema-change(簡稱 pt-osc)是 Percona Toolkit 中最重量級的工具,解決 MySQL 5.6 前 DDL 鎖表痛點。本文涵蓋原理、普通用法、文藝用法(主從數據差異修復)、參數詳解與避坑指南。
MySQL 5.6 前 InnoDB 執行 DDL 流程:
WRITE LOCK 阻塞寫入INSERT ... SELECT 全量拷貝RENAME TABLE 切換大表操作會導致業務長時間不可寫。pt-osc 通過「影子表 + 觸發器」實現**無鎖變更**。
_tbl_new,結構與原表一致ALTER 變更結構INSERT IGNORE INTO _new SELECT ... WHERE pk BETWEEN ...RENAME TABLE 原子切換_tbl_old觸發器核心邏輯:全部使用 REPLACE INTO 保冪等性,確保數據最終一致。
--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 實現**邏輯級無鎖同步**原理:
pt-osc --alter='ENGINE=INNODB'(空 DDL)binlog_format=ROW:--set-vars 'binlog_format=ROW'RENAME 切換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)