天天看點

pt-online-schema-change使用介紹

工作原理:

如果存在外鍵,根據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.

繼續閱讀