Mysql

全域 foreign_key_checks = 0 在 RBR 從站上

  • February 15, 2019

範例架構:

CREATE SCHEMA account;
CREATE TABLE `user` (
   `id` INT(11) NOT NULL AUTO_INCREMENT,
   `name` VARCHAR(50) NULL DEFAULT NULL,
   `address` VARCHAR(50) NULL DEFAULT NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB;

CREATE SCHEMA data;
CREATE TABLE `project` (
   `id` INT(11) NOT NULL,
   `account_user_id` INT(11) NOT NULL,
   PRIMARY KEY (`id`),
   INDEX `fk_user` (`user_id`),
   CONSTRAINT `fk_user` FOREIGN KEY (`account_user_id`) REFERENCES 
`accounts`.`user` (`id`)
) ENGINE=InnoDB;

問題背景

我有基於行的複制(RBR)從屬,它不應該包含“帳戶”模式。我使用 replicate_wild_ignore_table ‘accounts’.’%’ 以便只存在 ‘data’ 架構。

唯一的問題是,當我們插入 data.project 時複製中斷:“Error_code: 1452; handler error HA_ERR_NO_REFERENCED_ROW;” 因為從站上不存在accounts.user.id。

問題:

在這種情況下,在從屬設備上永久設置“set global set foreign_key_checks = 0”似乎是一個很好的解決方案。我的想法是:

  • 關鍵約束在主伺服器上強制執行,寫入/更新發生在哪裡;拒絕的語句不會出現在 binlog 中/不要復製到從站。
  • 插入/更新的每條記錄的值由基於行的複制顯式設置。如果 FK 導致更新,它將在另一個 binlog 語句中擷取,該語句將復製到從站。
  • 因此,我不需要擔心讓從屬檢查 FK 約束。

我的想法有問題嗎?有沒有人試過這個?我將不勝感激任何見解。

我考慮過的其他選擇:

  1. 設置從屬跳過錯誤 = 1452
  1. 主從 - 刪除外鍵約束
  • 不理想;我們要確保主伺服器上的數據完整性。
  1. 從站 - 移除外鍵約束
  • 也不理想;有多個從站需要維護,並且可能需要更多。有多個跨模式 FK,將來可能會添加更多。我擔心它會變得難以管理。

為了回答我自己的問題,我在奴隸上嘗試了“set global foreign_key_checks=0”。這不起作用,因為為我的 RBR 二進制日誌生成的語句明確設置了 foreign_key_checks=1。

所以,我可以試試選項 3。

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