系統要求
您需要Perl,DBI,DBD :: mysql以及應該安裝在任何相當新版本的Perl中的一些核心軟體包。
此工具僅适用于MySQL 5.0.2和更高版本,因為較早版本不支援觸發器。
pt-osc工作過程
1,建立一個和要執行 alter 操作的表一樣的新的空表結構(是alter之前的結構)
2,在新表執行alter table 語句(速度應該很快)
3,在原表中建立觸發器3個觸發器分别對應insert,update,delete操作
4,以一定塊大小從原表拷貝資料到臨時表,拷貝過程中通過原表上的觸發器在原表進行的寫操作都會更新到建立的臨時表
5,Rename 原表到old表中,在把臨時表Rename為原表
6,如果有參考該表的外鍵,根據alter-foreign-keys-method參數的值,檢測外鍵相關的表,做相應設定的處理
7,預設最後将舊原表删除
常用選項說明
隻介紹部分常用的選項
--host=xxx --user=xxx --password=xxx
連接配接執行個體資訊,縮寫-h xxx -u xxx -p xxx,密碼可以使用參數--ask-pass 手動輸入。
--alter
結構變更語句,不需要 ALTER TABLE關鍵字。與原始ddl一樣可以指定多個更改,用逗号分隔。
絕大部分情況下表上需要有主鍵或唯一索引,因為工具在運作當中為了保證新表也是最新的,需要舊表上建立 DELETE和UPDATE 觸發器,同步到新表的時候有主鍵會更快。個别情況是,當alter操作就是在c1列上建立主鍵時,DELETE觸發器将基于c1列。
子句不支援 rename 去給表重命名。
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)
子句如果是add column并且定義了not null,那麼必須指定default值,否則會失敗。
如果要删除外鍵(名 fk_foo),使用工具的時候外鍵名要加下劃線,比如--alter "DROP FOREIGN KEY _fk_foo"
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%。
因為拷貝行有可能會給部分行上鎖,Threads_running 是判斷目前資料庫負載的絕佳名額。
--max-lag
預設1s。每個chunk拷貝完成後,會檢視所有複制Slave的延遲情況(Seconds_Behind_Master)。要是延遲大于該值,則暫停複制資料,直到所有從的滞後小于這個值。--check-interval配合使用,指定出現從庫滞後超過 max-lag,則該工具将睡眠多長時間,預設1s,再檢查。如--max-lag=5 --check-interval=2。
熟悉percona-toolkit的人都知道--recursion-method可以用來指定從庫dsn記錄。另外,如果從庫被停止,将會永遠等待,直到從開始同步,并且延遲小于該值。
--chunk-time
預設0.5s,即拷貝資料行的時候,為了盡量保證0.5s内拷完一個chunk,動态調整chunk-size的大小,以适應伺服器性能的變化。
也可以通過另外一個選項--chunk-size禁止動态調整,即每次固定拷貝 1k 行,如果指定則預設1000行,且比 chunk-time 優先生效
--set-vars
使用pt-osc進行ddl要開一個session去操作,set-vars可以在執行alter之前設定這些變量,比如預設會設定--set-vars "wait_timeout=10000,innodb_lock_wait_timeout=1,lock_wait_timeout=60"。
因為使用pt-osc之後ddl的速度會變慢,是以預計2.5h隻能還不能改完,記得加大wait_timeout。
--dry-run
建立和修改新表,但不會建立觸發器、複制資料、和替換原表。并不真正執行,可以看到生成的執行語句,了解其執行步驟與細節,和--print配合最佳。。
--execute
确定修改表,則指定該參數。真正執行alter。–dry-run與–execute必須指定一個,二者互相排斥
下載下傳安裝
yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-Time-HiRes perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL
perl-Digest-MD5 perl-Term*
請通路http://www.percona.com/software/percona-toolkit/下載下傳最新版本的Percona Toolkit。或者,從指令行擷取最新版本:
wget percona.com/get/percona-toolkit.tar.gz
wget percona.com/get/percona-toolkit.rpm
wget percona.com/get/percona-toolkit.deb
pt-online-schema-change會更改表的結構,而不會阻止讀取或寫入。在DSN中指定資料庫和表。在閱讀文檔并仔細檢查備份之前,不要使用此工具。
在sakila.actor中添加一列:
pt-online-schema-change -alter “ADD COLUMN c1 INT” D = sakila,t = actor
将sakila.actor更改為InnoDB,以非阻塞的方式有效地執行OPTIMIZE TABLE,因為它已經是InnoDB表:
pt-online-schema-change -alter “ENGINE = InnoDB” D = sakila,t = actor