Mysql
全域 foreign_key_checks = 0 在 RBR 從站上
範例架構:
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 約束。
我的想法有問題嗎?有沒有人試過這個?我將不勝感激任何見解。
我考慮過的其他選擇:
- 設置從屬跳過錯誤 = 1452
- 不會發生對 data.project 的插入(錯誤),因為會跳過生成錯誤的語句(根據MySQL:設置 skip-errors=1062 時行會發生什麼情況)。
- 主從 - 刪除外鍵約束
- 不理想;我們要確保主伺服器上的數據完整性。
- 從站 - 移除外鍵約束
- 也不理想;有多個從站需要維護,並且可能需要更多。有多個跨模式 FK,將來可能會添加更多。我擔心它會變得難以管理。
為了回答我自己的問題,我在奴隸上嘗試了“set global foreign_key_checks=0”。這不起作用,因為為我的 RBR 二進制日誌生成的語句明確設置了 foreign_key_checks=1。
所以,我可以試試選項 3。