Pregunta

Estoy ejecutando un par de bases de datos en MySQL 5.0.45 y estoy intentando sincronizar mi base de datos heredada con un esquema revisado, para poder ejecutar ambas en paralelo.Hago esto agregando activadores a la nueva base de datos, pero tengo problemas con la replicación.Mi configuración es la siguiente.

Servidor "maestro"

  • Base de datos "legacydb", se replica en el servidor "esclavo".
  • La base de datos "newdb" tiene activadores que actualizan "legacydb" y no tiene replicación.

Servidor "esclavo"

  • Base de datos "legacydb"

Mis actualizaciones de "newdb" funcionan bien y activan mis activadores.Actualizan "legacydb" en el servidor "maestro".Sin embargo, los cambios no se replican en los esclavos.Los documentos de MySQL dicen que, para simplificar, la replicación analiza el contexto actual de la base de datos (p. ej. "SELECT DATABASE();" ) al decidir qué consultas replicar en lugar de mirar el producto de la consulta.Mi disparador se ejecuta desde el contexto de la base de datos "newdb", por lo que la replicación ignora las actualizaciones.

Intenté mover la declaración de actualización a un procedimiento almacenado en "legacydb".Esto funciona bien (es decirlos datos se replican en el esclavo) cuando me conecto al "maestro" y ejecuto manualmente "USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);".Sin embargo, cuando se llama a este procedimiento desde un desencadenador, no se replica.

Hasta ahora, mi pensamiento sobre cómo solucionar este problema ha sido uno de los siguientes.

  • Fuerce el disparador para establecer una nueva base de datos actual.Esto sería más fácil, pero no creo que sea posible.Esto es lo que esperaba lograr con el procedimiento almacenado.

  • Replica ambas bases de datos y ten activadores tanto en maestra como en esclava.Esto sería posible, pero sería complicado configurarlo.

  • Fuerce la replicación para que recoja todos los cambios en "legacydb", independientemente del contexto actual de la base de datos.

  • Si la replicación se ejecuta a un nivel demasiado alto, ni siquiera verá ninguna actualización ejecutada por mi disparador, en cuyo caso ninguna cantidad de piratería logrará lo que quiero.

Cualquier ayuda sobre cómo lograr esto sería muy apreciada.

¿Fue útil?

Solución

Esto puede tener algo que ver con esto:

Una función almacenada adquiere bloqueos de tabla antes de ejecutarse, para evitar inconsistencias en el registro binario debido a una falta de coincidencia entre el orden en que se ejecutan las declaraciones y cuándo aparecen en el registro.Las declaraciones que invocan una función se registran en lugar de las declaraciones ejecutadas dentro de la función.En consecuencia, las funciones almacenadas que actualizan las mismas tablas subyacentes no se ejecutan en paralelo.

Por el contrario, los procedimientos almacenados no adquieren bloqueos a nivel de tabla.Todas las declaraciones ejecutadas dentro de los procedimientos almacenados se escriben en el registro binario.

Además, hay una lista completa de problemas con los activadores:http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top