以往使用MySQL遇到要執行ddl語法的時候,為了不影響線上運作,會使用工具來執行。
比較常聽到的使用工具就是pt-osc以及gh-ost。
pt-osc的概念是是透過trigger在舊表與新表間執行ddl。
#新增test_table_new,開始同步新表
test_table >>>> test_table_new
#完成後 rename表格
test_table >>>> test_table_old
test_table_new >>>> test_table
gh-ost則是將自己模擬成一個slave的角色,從原本的slave機器上搜集binlog然後再回到master的新表執行,等到新舊表資料同步,再做rename的動作。這裡的rename是可以自己安排時間手動執行的。
引用https://github.com/github/gh-ost
#產生兩個新表
create table _test_table_gho, _test_table_ghc
#在新表執行ddl,以新增欄位為例
Alter table _test_table_gho add column new_id int
#儲存執行過程的資訊到_ghc
| 257 | 2021-09-17 01:24:43 | copy iteration 0 at 1631841883 | Copy: 0/157320 0.0%; Applied: 0; Backlog: 0/1000; Time: 12s(total), 0s(copy); streamer: mysql-bin.000024:195063441; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: N/A |
| 258 | 2021-09-17 01:24:44 | copy iteration 0 at 1631841884 | Copy: 0/157320 0.0%; Applied: 0; Backlog: 0/1000; Time: 13s(total), 1s(copy); streamer: mysql-bin.000024:195067599; Lag: 0.01s, HeartbeatLag: 0.02s, State: migrating; ETA: N/A
#資料同步後,轉換新舊表
Alter table table_test rename to _table_test_del
Alter table _table_test_gho rename to table_test
而前面提到的工具DM,也可以在設定上開啟允許online ddl的參數。滿足在做資料搬移的同時,也可以執行ddl語法。
online-ddl: true
如果是執行gh-ost,DM只會在執行到最後一個步驟Alter table _table_test_gho rename to table_test 的時候,將語法轉換成 Alter table table_test add column new_id int,也就是將原本對新表執行的ddl語法,改成直接對舊表ddl,其他的語法通通省略不做。
執行pt-osc也是一樣,DM會自動無視過程中建立新表以及建立trigger等,只會等到最後要rename table_test_new to table_test時改為 Alter table table_test add column new_id int。