工作原理:
如果存在外鍵,根據alter-foreign-keys-method參數的值,檢測外鍵相關的表,針對相應的設定進行處理。
建立一個新的表,表結構為修改後的資料表,用于從源資料表向新表中導入資料。
建立觸發器,在複制資料開始之後,将對源資料表繼續進行資料修改的操作記錄下來,以便在資料複制結束後執行這些操作,保證資料不會丢失。
複制資料,從源資料表中複制資料到新表中。
修改外鍵相關的子表,根據修改後的資料,修改外鍵關聯的子表。
更改源資料表為old表,把新表改為源表名,并将old表删除。
删除觸發器。
注意:
對操作的表必須要有主鍵或者唯一鍵
增加的字段如果為NOT NULL,會報錯,需要添加預設值才可以成功。
[root@managed bin]# ./pt-online-schema-change --alter="add column yy varchar(22)" -u root -p root -S /mysql/data/mysql.sock D=bhs,t=pp --execute
Found 1 slaves:
slv2
Will check slave lag on:
Operation, tries, wait:
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
Altering <code>bhs</code>.<code>pp</code>...
Creating new table...
Created new table bhs._pp_new OK.
Altering new table...
Altered <code>bhs</code>.<code>_pp_new</code> OK.
2017-11-21T13:40:39 Creating triggers...
2017-11-21T13:40:39 Created triggers OK.
2017-11-21T13:40:39 Copying approximately 2 rows...
2017-11-21T13:40:39 Copied rows OK.
2017-11-21T13:40:39 Swapping tables...
2017-11-21T13:40:39 Swapped original and new tables OK.
2017-11-21T13:40:39 Dropping old table...
2017-11-21T13:40:39 Dropped old table <code>bhs</code>.<code>_pp_old</code> OK.
2017-11-21T13:40:39 Dropping triggers...
2017-11-21T13:40:39 Dropped triggers OK.
Successfully altered <code>bhs</code>.<code>pp</code>.
[root@managed bin]# ./pt-online-schema-change --alter="add column y varchar(22) not null" -u root -p root -S /mysql/data/mysql.sock D=bhs,t=pp --execute
2017-11-21T13:42:08 Creating triggers...
2017-11-21T13:42:09 Created triggers OK.
2017-11-21T13:42:09 Copying approximately 2 rows...
2017-11-21T13:42:09 Dropping triggers...
2017-11-21T13:42:09 Dropped triggers OK.
2017-11-21T13:42:09 Dropping new table...
2017-11-21T13:42:09 Dropped new table OK.
<code>bhs</code>.<code>pp</code> was not altered.
2017-11-21T13:42:09 Error copying rows from <code>bhs</code>.<code>pp</code> to <code>bhs</code>.<code>_pp_new</code>: 2017-11-21T13:42:09 Copying rows caused a MySQL error 1364:
Message: Field 'y' doesn't have a default value
[root@managed bin]# ./pt-online-schema-change --alter="add column y varchar(22) not null default 0" -u root -p root -S /mysql/data/mysql.sock D=bhs,t=pp --execute
2017-11-21T13:44:32 Creating triggers...
2017-11-21T13:44:32 Created triggers OK.
2017-11-21T13:44:32 Copying approximately 2 rows...
2017-11-21T13:44:32 Copied rows OK.
2017-11-21T13:44:32 Swapping tables...
2017-11-21T13:44:32 Swapped original and new tables OK.
2017-11-21T13:44:32 Dropping old table...
2017-11-21T13:44:32 Dropped old table <code>bhs</code>.<code>_pp_old</code> OK.
2017-11-21T13:44:32 Dropping triggers...
2017-11-21T13:44:32 Dropped triggers OK.