Mysql

pt-online-schema-change 觸發問題

  • July 25, 2018

我需要使用 Percona 工具執行更改,但它給出了錯誤:

gtsxml_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,因為它不依賴於觸發器
  • 禁用主機上的觸發器,並讓觸發器在從機上觸發,從從機讀取排隊的更改。可能不太理想。

引用自:https://dba.stackexchange.com/questions/184056