pt-online-schema-change 觸發問題
我需要使用 Percona 工具執行更改,但它給出了錯誤:
表
gts
。xml_bookings
有觸發器。這個工具需要自己創建觸發器,所以表不能已經有觸發器所以我檢查了這樣的觸發器:
顯示像’xml_bookings’\G這樣的觸發器;
輸出:
Trigger: booking_status_update2 Event: UPDATE Table: xml_bookings Statement: BEGIN IF (OLD.backofficestatus <> NEW.backofficestatus AND left(OLD.booktime,10) <> curdate()) THEN insert into booking_status_changes set processid=new.processid, oldstatus=OLD.backofficestatus, newstatus=NEW.backofficestatus, website=NEW.website; END IF; END Timing: BEFORE Created: NULL sql_mode: Definer: root@localhost character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: latin1_swedish_ci 1 row in set (0.00 sec)
錯誤:未指定查詢
我有哪些選擇?最終我需要
pt-online-schema-change
習慣改變。
如您所知,
pt-online-schema-change
以這種方式工作:
- 創建一個與原始表相同但為空的新表
- 更改新表
- 在原始表上創建觸發器以開始保持表同步(更新/刪除已複製的行,插入新行)
- 複製成束的行
- 交換錶名
因此觸發器是該過程的基本部分(除非表是只讀的,或者您確定現在沒有人會修改它)。問題是,在 MySQL 5.8 和 MariaDB 10.3 之前,表 + 計時 + 事件的每種組合只能有一個觸發器。例如,您的表只能有一個觸發器
BEFORE UPDATE
。您可以嘗試的一件事是,將您現有的
BEFORE UPDATE
觸發器轉換為AFTER UPDATE
- 除非您已經有AFTER UPDATE
觸發器,否則這將起到作用。並對 INSERT 和DELETE
触發器執行相同的操作。或者嘗試
gh-ost
從 GitHub 使用,正如有人已經建議的那樣。這會起作用,因為此工具不會創建任何觸發器:相反,它會讀取二進制日誌並將更改手動應用於新表。
你有沒有在 Percona 論壇上發布過這個問題?那裡的人應該確定是否有辦法使其與現有觸發器一起工作。
你在使用複制嗎?如果您可以在主伺服器上禁用觸發器,但在從伺服器上啟用,則應用程序可以從從伺服器讀取 booking_status_changes。
應用程序可以更改以不需要觸發器嗎?
您是否將 gh-ost 視為 pt-online-schema-change 的替代品? https://github.com/github/gh-ost。它是基於複製的,因此退出觸發器不會成為問題。
祝你好運!
編輯: 我將改寫為陳述……
您在 pt-online-schema-change 中遇到了限制。您的選擇:
- 停機進行正常更改
- 先修改所有slave上的表,進行slave提升
- 將應用程序更改為不需要觸發器
- 使用 gh-ost 而不是 pt-online-schema-change,因為它不依賴於觸發器
- 禁用主機上的觸發器,並讓觸發器在從機上觸發,從從機讀取排隊的更改。可能不太理想。