Requirements 要求:
- server 必須開啟
log_bin,若為 Slave 同時也必須開啟log_slave_updates
- 需要一台
binlog_format為ROW模式的 server
- 如果在slave上使用,必須確保要ALTER的TABLE在Master和Slave上Schema相同
權限:
ALTER, CREATE, DELETE, DROP, INDEX, INSERT, LOCK TABLES, SELECT, TRIGGER, UPDATE ON database.* OR *.*SUPER, REPLICATION SLAVE on *.* 或 REPLICATION CLIENT, REPLICATION SLAVE on *.*SUPER權限用於 STOP SLAVE 和 START SLAVE,具體用途為:
- 當
binlog_format不是ROW並且指定--switch-to-rbr時,將切換binlog_format並重啟 replication。如果是ROW模式可以指定--assume-rbr避免STOP SLAVE和START SLAVE,在此情況下,不需要提供SUPER權限。
(提醒!若自行切換
binlog_format 須記得重啟replication!)- 運行
--test-on-replica時,gh-ost切換表後會停止replication,讓使用者比較兩張表。
Limitations 限制:
- 目前不支持外鍵。未來可能會提供一定程度的支持
- 目前不支持trigger。未來可能會提供支持
- 支持MySQL 5.7的
JSON,但前提是不能是PRIMARY KEY的一部分
- 新表和舊表必須使用相同的
PRIMARY KEY或UNIQUE KEY。因為複製時會gh-ost會利用該 KEY遍歷所有行。遷移鍵必須為NOT NULL(可以為空值)。或是有NULL屬性並使用--allow-nullable-unique-key但必須確保實際上沒有NULL值,否則可能導致數據不完整。
- 當存在名稱相同僅大小寫不同的table時無法進行
- 阿里雲RDS能正常運作,僅需要添加
--aliyun-rds
- Google Cloud SQL可使用,僅需添加
--gcp
- Amazon RDS可以使用,但有些限制,請參閱:https://github.com/github/gh-ost/blob/master/doc/rds.md
- 當
SLAVE的來源為multi時,無法支持在SLAVE上執行,建議直接在MASTER上進行,需添加--allow-on-master
- 目前當在
master-master運行gh-ost時,沒有辦法支援兩邊都有寫入的情況。將來可能支援
- 若將
enum型態的欄位作為PRIMARY KEY將使性能降低
- 不支援
federated Table,並且與gh-ost想要解決的方案無關
- 不支持
ALTER TABLE ... RENAME TO some_other_name,這樣的操作不應該是用gh-ost
Concurrent migrations 並發遷移:
- 絕對不要運行在同一個
Table上。
- 如果運行在不同的
SLAVE上,不需要其他調整。例如:table1 on slave1 和 table2 on slave2。
如果在同一個機器運行 gh-ost
- 確保
-server-socket-file設置不同名稱(或由gh-ost命名)。
- 透過
-throttle-additional-flag-file控制所有gh-ost,另外透過throttle-flag-file控制單一gh-ost。
- 如果
-host相同,則必須對每個gh-ost設定唯一的replica-server-id避免衝突。