1. 程式人生 > >pt-online-schema-change 在線修改表結構

pt-online-schema-change 在線修改表結構

數據庫在線改表結構 mysql on line online change schem

1. 參數
參數 默認值 說明
--host=xxx --user=xxx --password=xxx 連接實例信息,縮寫-h xxx -u xxx -p xxx,密碼可以使用參數--ask-pass 手動輸入。
--alter 結構變更語句,不需要 ALTER TABLE關鍵字。與原始ddl一樣可以指定多個更改,用逗號分隔。
D=db_name,t=table_name 指定要ddl的數據庫名和表名
--max-load 默認為Threads_running=25。每個chunk拷貝完後,會檢查 SHOW GLOBAL STATUS 的內容,檢查指標是否超過了指定的閾值。如果超過,則先暫停。這裏可以用逗號分隔,指定多個條件,每個條件格式: status指標=MAX_VALUE或者status指標:MAX_VALUE。如果不指定MAX_VALUE,那麽工具會這只其為當前值的120%。
--max-lag 默認1s。每個chunk拷貝完成後,會查看所有復制Slave的延遲情況(Seconds_Behind_Master)。要是延遲大於該值,則暫停復制數據,直到所有從的滯後小於這個值。--check-interval配合使用,指定出現從庫滯後超過 max-lag,則該工具將睡眠多長時間,默認1s,再檢查。如--max-lag=5 --check-interval=2。
--chunk-time 默認0.5s,即拷貝數據行的時候,為了盡量保證0.5s內拷完一個chunk,動態調整chunk-size的大小,以適應服務器性能的變化。
--set-vars 使用pt-osc進行ddl要開一個session去操作,set-vars可以在執行alter之前設定這些變量,比如默認會設置--set-vars "wait_timeout=10000,innodb_lock_wait_timeout=1,lock_wait_timeout=60"。
--dry-run 創建和修改新表,但不會創建觸發器、復制數據、和替換原表。並不真正執行,可以看到生成的執行語句,了解其執行步驟與細節,和--print配合最佳。。
--execute 確定修改表,則指定該參數。真正執行alter。–dry-run與–execute必須指定一個,二者相互排斥

1. --alter說明

1.絕大部分情況下表上需要有主鍵或唯一索引,因為工具在運行當中為了保證新表也是最新的,需要舊表上創建 DELETE和UPDATE 觸發器,同步到新表的時候有主鍵會更快。個別情況是,當alter操作就是在c1列上建立主鍵時,DELETE觸發器將基於c1列。

  1. 子句不支持 rename 去給表重命名。
  2. alter命令原表就不支持給索引重命名,需要先drop再add,在pt-osc也一樣。(mysql 5.7 支持 RENAME INDEX old_index_name TO new_index_name)。但給字段重命名,千萬不要drop-add,整列數據會丟失,使用change col1 col1_new type constraint(保持類型和約束一致,否則相當於修改 column type,不能online)
  3. 子句如果是add column並且定義了not null,那麽必須指定default值,否則會失敗。
  4. 如果要刪除外鍵(名 fk_foo),使用工具的時候外鍵名要加下劃線,比如--alter "DROP FOREIGN KEY _fk_foo"

2. 使用限制

  1. 原表上不能有觸發器存在
  2. 在使用之前需要對磁盤容量進行評估。因為數據量會多一倍

3. 使用示例

1. 添加字段

pt-online-schema-change --user=user --password=password --host=10.0.201.34  --alter "ADD COLUMN f_id int default 0" D=confluence,t=sbtest3 --print --execute

pt-online-schema-change 在線修改表結構