Domanda

Sto eseguendo un paio di database su MySQL 5.0.45 e sto cercando di sincronizzare il mio database legacy con uno schema rivisto, in modo da poterli eseguire entrambi fianco a fianco.Lo sto facendo aggiungendo trigger al nuovo database ma sto riscontrando problemi con la replica.La mia configurazione è la seguente.

Server "maestro"

  • Database "legacydb", replica sul server "slave".
  • Il database "newdb" dispone di trigger che aggiornano "legacydb" e nessuna replica.

Server "schiavo"

  • Database "legacydb"

I miei aggiornamenti a "newdb" funzionano correttamente e attivano i miei trigger.Aggiornano "legacydb" sul server "master".Tuttavia, i cambiamenti non vengono replicati fino agli schiavi.I documenti MySQL affermano che per semplicità la replica esamina il contesto corrente del database (ad es. "SELECT DATABASE();" ) al momento di decidere quali query replicare anziché guardare il prodotto della query.Il mio trigger viene eseguito dal contesto del database "newdb", quindi la replica ignora gli aggiornamenti.

Ho provato a spostare la dichiarazione di aggiornamento in una procedura memorizzata in "legacydb".Funziona bene (es.i dati si replicano sullo slave) quando mi collego al "master" ed eseguo manualmente "USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);".Tuttavia, quando questa procedura viene richiamata da un trigger, non viene replicata.

Finora il mio pensiero su come risolvere questo problema è stato uno dei seguenti.

  • Forza il trigger per impostare un nuovo database corrente.Sarebbe la cosa più semplice, ma non credo che sia possibile.Questo è ciò che speravo di ottenere con la procedura memorizzata.

  • Replica entrambi i database e disponi di trigger sia nel master che nello slave.Questo sarebbe possibile, ma è difficile da configurare.

  • Forza la replica a raccogliere tutte le modifiche a "legacydb", indipendentemente dal contesto del database corrente.

  • Se la replica viene eseguita a un livello troppo alto, non vedrà mai alcun aggiornamento eseguito dal mio trigger, nel qual caso nessuna quantità di hacking otterrà ciò che desidero.

Qualsiasi aiuto su come raggiungere questo obiettivo sarebbe molto apprezzato.

È stato utile?

Soluzione

Questo potrebbe avere qualcosa a che fare con questo:

Una funzione memorizzata acquisisce i blocchi della tabella prima dell'esecuzione, per evitare incoerenze nel log binario dovute alla mancata corrispondenza dell'ordine in cui vengono eseguite le istruzioni e quando appaiono nel log.Vengono registrate le istruzioni che richiamano una funzione anziché le istruzioni eseguite all'interno della funzione.Di conseguenza, le funzioni archiviate che aggiornano le stesse tabelle sottostanti non vengono eseguite in parallelo.

Al contrario, le procedure memorizzate non acquisiscono blocchi a livello di tabella.Tutte le istruzioni eseguite all'interno delle procedure memorizzate vengono scritte nel log binario.

Inoltre, c'è un intero elenco di problemi con i Trigger:http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top