Mysql

將 slave 添加到現有的 master-master 配置會引發外鍵約束失敗錯誤

  • September 6, 2017

我們有兩台 MySQL 伺服器在 master - master 配置中執行。

現在我們必須在現有配置中添加一個從屬伺服器,但是在添加第三個數據庫伺服器並在其上啟動從屬伺服器時,它會拋出:

無法添加或更新子行。外鍵約束失敗

我們已經嘗試mysqldump從主人那裡獲取--master-data並恢復它。之後,我們在從屬數據庫上啟動了從屬。但即便如此,它也會說同樣的錯誤。我們也試過了XtraBackup。但這也會引發同樣的錯誤。我們錯過了什麼嗎?

mysqldump 命令:

mysqldump --master-data -uroot -p dbname > dbname.sql

我們也嘗試過這種方式:percona xtrabackup

在這兩種情況下,在收到外鍵錯誤時,我們嘗試手動將外鍵引用的各個表從主伺服器轉儲和恢復到從伺服器。執行此操作後,複製開始並且似乎在 master 後 0 秒後正常工作幾分鐘,之後出現另一個外鍵錯誤,停止複制。

  • auto_increment_increment在兩個主控中都設置為 2。
  • auto_increment_offset在 Master 1 中設置為 1,在 Master 2 中設置為 2。
  • 我們主要有innoDB桌子和一些MyISAM桌子。
  • MySQL 版本 5.5.30。

有一個後續問題:將一個從屬添加到主控配置後,從屬只從一個主控同步

鑑於以下

+<------+
|       ^
V       |
M1      M2
|       ^
V       |
+-------+

你想要以下

     +<------+
     |       ^
     V       |
S1<---M1      M2
     |       ^
     V       |
     +-------+

給定主 IP 是 10.1.2.30

登錄到 Slave 並像這樣執行 mysqldump

MAS_IP=10.1.2.30
SLV_IP=localhost
MYSQL_MAS_CONN="${MAS_IP} -uroot -ppassword"
MYSQL_SLV_CONN="${SLV_IP} -uroot -ppassword"
MYSQLDUMP_OPTIONS="--single-transaction --master-data=1 --flush-privileges"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --routines --triggers"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --add-drop-database --all-databases"
mysql ${MYSQL_MAS_CONN} -e"FLUSH LOGS;"
echo "STOP SLAVE;" > MySQLData.sql
mysqldump ${MYSQL_MAS_CONN} ${MYSQLDUMP_OPTIONS} >> MySQLData.sql
echo "START SLAVE;" >> MySQLData.sql
mysql ${MYSQL_MAS_CONN} < MySQLData.sql

如果您已經執行了此操作,請讓我談談您的意見。

但是在添加第三個數據庫伺服器並在其上啟動從屬伺服器時,它會拋出無法添加或更新子行。外鍵約束失敗錯誤。

如果將數據從 Master 複製到 Slave,為什麼會出現外鍵問題?Slave 上的 auto_increment id 根本與 Master 上的不匹配。即使您從奴隸的主人那裡獲得數據也是如此。為什麼?

auto_increment_increment 在兩個主控中都設置為 2。auto_increment_offset 在 Master 1 中設置為 1,在 Master 2 中設置為 2。我們主要有 innoDB 表和一些 MyISAM 表。

您必須確保 Slave 與auto_increment_incrementauto_increment_offset從中複製的 Master 完全相同。

轉到大師並執行

SHOW VARIABLES LIKE 'auto_increment%';

將這些值放入從站my.cnf並重新啟動 mysql。

記住:Slave 的 auto_increment 行為需要與其 master 相同。

試一試 !!!

更新 2013-04-06 17:26

這是問題所在:假設您有設置

     +<------+
     |       ^
     V       |
S1<---M1      M2
     |       ^
     V       |
     +-------+

如果您執行了以下操作:

  • 來自 M1 的 mysqldump 數據
  • 負載轉儲它 S1
  • 啟用從 M1 到 S1 的複制
  • M1 和 S1 具有相同的 auto_increment_offset
  • M1 和 S1 具有相同的 auto_increment_increment

永遠不應該有外鍵違規。

您可能需要做的是清理每個伺服器的自動增量值視圖

這裡有一些東西可以嘗試

  • 在 M1 的 /etc/my.cnf 上設置這些值

    • auto_increment_increment = 10
    • auto_increment_offset = 1
  • 在 M2 的 /etc/my.cnf 上設置這些值

    • auto_increment_increment = 10
    • auto_increment_offset = 1
  • 在 S1 的 /etc/my.cnf 上設置這些值

    • auto_increment_increment = 10
    • auto_increment_offset = 1

在所有三台伺服器上重新啟動 mysql

像這樣載入數據:

  • mysqldump 從 M1 到
  • 執行 SET GLOBAL sql_log_bin = 0; 在 M1 上
  • 將 mysqldump 載入到 M1
  • 執行 SET GLOBAL sql_log_bin = 1; 在 M1 上
  • 執行 SET GLOBAL sql_log_bin = 0; 在 M2 上
  • 將 mysqldump 載入到 M2
  • 執行 SET GLOBAL sql_log_bin = 1; 在 M2 上
  • 將 mysqldump 載入到 S1
  • 重置三個伺服器之間的複制

如果沒有任何問題,您可以執行此操作

在 M2 的 /etc/my.cnf 上設置這些值 - auto_increment_increment = 10 - auto_increment_offset = 2

在 M2 上重啟 mysql

現在一切都應該干淨了。從這裡開始,應該正確處理 INSERT。

試試看!!1

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