2015-09-24 19 views
12

Sto provando a utilizzare MySQL Replication Listener Library per eseguire la replica dei dati tra HostA e HostB.Problemi nell'esecuzione della replica MySQL basata su riga da solo

La replica è basata su istruzioni diverse da righe. So che esiste già una funzionalità incorporata in MySQL, ma voglio farlo da solo --- Leggere tutte le modifiche di riga dal registro bin di HostA e applicare tutte queste modifiche a HostB.

Il problema che sto riscontrando è, non sono in grado di disabilitare temporaneamente i trigger, il che causerà la sincronizzazione dei dati.

Prendete un esempio, supponiamo che il database da sincronizzare sia TestSyncDB e ci sono due tabelle in esso che sono Dati e DataOp. La tabella dati ha un trigger con esso e una volta inserito un record in questa tabella, il trigger genererà un nuovo record per DataOp.

Ora un nuovo record viene inserito in HostA.TestSyncDB.Data, poiché esiste un trigger, quindi saranno effettivamente aggiunti due record al database e la libreria del listener di replica restituirà due query, ad esempio:

  1. inserto in valori HostA.TestSyncDB.Data (...)
  2. inserto in valori HostA.TestSyncDB.DataOp (...) // dal grilletto

Il problema è che se io riprodurre queste due query su HostB, ci saranno tre nuovi record aggiunti alle tabelle in HostA.TestSyncDB, a causa dei trigger. Quindi i dati non hanno mai ragione, mai dopo.

Quindi come risolvere questo? È possibile disabilitare temporaneamente i trigger? In caso contrario, come farlo correttamente come ciò che MySQL Replication fa?

risposta

3

Nella replica mysql quando è stato creato il trigger su master, verrà creato su slave. Quindi se vuoi un trigger diverso su slave, puoi modificare quel trigger o rilasciarlo se non vuoi. Per il formato della reliquia nel binlog del tuo master binlog_format = ROW, verrà copiato come master, non è adatto per i trigger se lo slave desidera un'azione di trigger diversa da quella della situazione. In questa situazione binlog richiede una dichiarazione basata su binlog_format = STATEMENT. Quindi è possibile in mysql cambiare questi due in base alle necessità.

Quindi il punto chiave qui è necessario binlog_format = MIXED. È abbastanza intelligente decidere quando utilizzare STATEMENT basato e quando utilizzare basato su ROW. Si tratterà come STATEMENT BASED per questa situazione. Altrimenti funzionerà come ROW BASED.

Potete leggere qui più- replication format e Advantages and Disadvantages

0

non credo che è possibile disattivare i trigger in MySQL.
Ma si potrebbe trovare una soluzione sotto:
mysql-disable-all-triggers

Io personalmente Basta inserire i trigger sulla HostB e quindi mi sento che replicano i log binari basati su riga non dovrebbe essere un problema.

Problemi correlati