一個 MySQL 線上 DDL 工具 — pt-online-schema-change

ModStart開源發表於2022-02-17

在運維線上MySQL資料庫時,我們總會對資料表進行 DDL 變更,修改新增欄位或者索引。在對錶進行 DDL 時,會鎖表,當表比較小比如小於1w上時,對前端影響較小,當時遇到千萬級別的表就會影響前端應用對錶的寫操作。

pt-online-schema-change 是 percona 公司開發的一個工具,在percona-toolkit包裡面可以找到這個功能,它是一個線上DDL工具,可以實現線上資料表 DDL 操作。

使用方法

比如需要執行 SQL 的 DDL 語句

ADD COLUMN mode tinyint(4) DEFAULT NULL AFTER status

可以通過如下命令進行

nohup pt-online-schema-change
    --charset=utf8
    --no-version-check
    --user="資料庫使用者"
    --password="資料庫密碼"
    --host="資料庫地址"
    P=3306,D="資料庫",t="資料表"
    --alter "ADD COLUMN mode tinyint(4) DEFAULT NULL AFTER status"
    --execute &

引數說明

--user=        連線mysql的使用者名稱
--password=    連線mysql的密碼
--host=        連線mysql的地址
P=3306         連線mysql的埠號
D=             連線mysql的庫名
t=             連線mysql的表名
--alter        修改表結構的語句
--execute      執行修改表結構
--charset=utf8 使用utf8編碼,避免中文亂碼
--no-version-check  不檢查版本,在阿里雲伺服器中一般加入此引數,否則會報錯

工作過程

  1. 建立一個和要執行 alter 操作的表一樣的新的空表結構(是 alter 之前的結構)

  2. 在新表執行 alter table 語句(速度應該很快)

  3. 在原表中建立觸發器 3 個觸發器分別對應 insert, update, delete 操作

  4. 以一定塊大小從原表拷貝資料到臨時表,拷貝過程中通過原表上的觸發器在原表進行的寫操作都會更新到新建的臨時表

  5. Rename 原表到 old 表中,在把臨時表 Rename 為原表

  6. 如果有參考該表的外來鍵,根據 alter-foreign-keys-method 引數的值,檢測外來鍵相關的表,做相應設定的處理

  7. 預設最後將舊原表刪除

安裝方法

僅供參考(CentOS 7 驗證)

sudo yum install -y perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Digest-MD5 perl-TermReadKey.x86_64
sudo rpm -ivh percona-toolkit-3.1.0-2.el7.x86_64.rpm

參考資料

www.percona.com/doc/percona-toolki...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章