logo mysql triggers replication

logo - MySQL desencadena+replicación con múltiples bases de datos



hbase (1)

Esto puede tener algo que ver con eso:

Una función almacenada adquiere bloqueos de tabla antes de la ejecución, para evitar inconsistencias en el registro binario debido a la falta de coincidencia del orden en que se ejecutan las sentencias y cuando aparecen en el registro. Se registran las declaraciones que invocan una función en lugar de las instrucciones 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 Triggers: http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html

Estoy ejecutando un par de bases de datos en MySQL 5.0.45 y estoy tratando de hacer que mi base de datos heredada se sincronice con un esquema revisado, de modo que pueda ejecutar ambos lado a lado. Estoy haciendo esto agregando desencadenadores a la nueva base de datos, pero estoy teniendo problemas con la replicación. Mi configuración es la siguiente.

Servidor "maestro"

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

Servidor "esclavo"

  • Base de datos "legacydb"

Mis actualizaciones de "newdb" funcionan bien y activan mis disparadores. Actualizan "legacydb" en el servidor "maestro". Sin embargo, los cambios no se replican a los esclavos. Los documentos de MySQL dicen que para simplificar la replicación mira el contexto de la base de datos actual (por ejemplo, "SELECT DATABASE();" ) al decidir qué consultas replicar en lugar de mirar el producto de la consulta. Mi desencadenador 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 decir, los datos se replican en el esclavo) cuando me conecto a "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 esto ha sido uno de los siguientes.

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

  • Replicar ambas bases de datos y tener disparadores en maestro y esclavo. Esto sería posible, pero un dolor de establecer.

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

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

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