6.7. Características de la replicación y problemas conocidos

MySQL 5.0

6.7. Características de la replicación y problemas conocidos

En general, la compatibilidad de la replicación en nivel SQL requiere que cualquier característica usada sea soportado tanto por el maestro como por los servidores esclavos. Por ejemplo, la función se implementó en MySQL 5.0.0. Si usa esta función en el maestro, no puede replicar a un servidor esclavo que sea más antiguo que MySQL 5.0.0. Si planea usar replicación entre 5.0 y versiones prévias de MySQL debe consultar el Manual de referencia de MySQL 4.1 para información acerca de las características de replicación en versiones prévias de MySQL.

La siguiente lista proporciona detalles acerca de qué se soporta y qué no. Información específica adicional de acerca de replicación se da en Sección 15.6.5, “ y replicación MySQL”. Aspectos de replicación acerca de rutinas almacenadas y disparadores se describen en Sección 19.3, “Registro binario de procedimientos almacenados y disparadores”.

  • La replicación se da correctamente con , , y .

  • Las funciones , , y se replican sin cambios y no funcionan correctamente con el esclavo.

  • Las funciones que tratan bloqueos a nivel de usuario: , , , se replican sin que el esclavo sepa el contexto de concurrencia del maestro; así que estas funciones no deben usarse para insertar en una tabla del maestro ya que el contexto del esclavo puede diferir (p.e. no haga ).

  • Las variables , , , and se replican todas en MySQL 5.0. La variable , también conocida como no se replica todavía, lo que es bueno para replicación entre distintos motores de almacenamiento.

  • A partir de MySQL 5.0.3 (maestro y esclavo), la replicación funciona bien incluso si el maestro y el esclavo tienen distintos conjuntos de carácteres globalres. A partir de MySQL 5.0.4 (maestro y esclavo), la replicación funciona bien incluso si el maestro y el esclavo tienen distintas variables de zonas horarias.

  • Lo siguiente se aplica para replicación entre servidores MySQL usando distintos conjuntos de carácteres:

    1. Debe siempre usar las mismas colaciones y conjuntos de carácteres globales (, ) en el maestro y esclavo. De otro modo, puede obtener errores de claves duplicadas en el esclavo, debido a que una clave que se trata como única en el conjunto de carácteres del maestro puede no ser único en el conjunto de carácteres del esclavo.

    2. Si el maestro es anterior a MySQL 4.1.3, el conjunto de carácteres de la sesión nunca debería ser distinto al del valor global (en otras palabras, no use , , y así) ya que este cambio del conjunto de carácteres no es conocido por el esclavo. Si tanto el maestro coom el esclavo son de la versión 4.1.3 o posterior, la sesión puede cambiar los valores locales del conjunto de carácteres (tales como , , , y ) ya que estos cambios se escriben en el log binario y son conocidos por el esclavo. Sin embargo, la sesión no puede cambiar estos valores globales ya que el maestro y esclavo deben tener conjuntos de carácteres idénticos.

    3. Si tiene bases de datos en el maestro con distintos conjuntos de carácteres al valor global de , debe diseñar su comando que no se base en el conjunto de carácteres por defecto de la base de datos, ya que actualmente hay un bug (Bug #2326); una solución es poner el conjunto de carácteres y colación explícitamente en .

  • Tanto el maestro como el esclavo deben tener la misma zona horaria. De otro modo algunos comandos, por ejemplo comandos que usen o no se replicarán apropiadamente. Se podría poner una zona horaria en que el servidor MySQL se ejecute usando la opción del script o asignando un valor a la variable de entorno . Tanto el maestro como el esclavo deben tener la misma zona horaria para las conexiones; esto es, el parámetro debe tener el mismo valor para maestro y servidor.

  • no se replica apropiadamente. se replica apropiadamente sólo si el maestro y esclavo son de la versión 5.0.4 o posterior.

  • Las variables de sesión no se replican apropiadamente cuando se usan en comandos que actualizan tablas; por ejemplo: no insertará los mismos datos en el maestro y el esclavo. Esto no se aplica a , que se arregla en MySQL 5.0.4.

  • Es posible replicar tablas transaccionales en el maestro usando tablas no transaccionales en el esclavo. Por ejemplo, puede replicar una tabla maestra como una tabla esclava . Sin embargo, si lo hace, hay problemas si el esclavo se para en medio de un bloque / , ya que el esclavo reinicia al principio del bloque . Este tema se encuentra en la lista de temas pendientes y se arreglará próximamente.

  • Los comandos de actualización que se refieren a variables de usuario (esto es, variables de la forma ) se replican correctamente en MySQL 5.0; sin embargo esto no es cierto para versiones prévias a 4.1. Tenga en cuenta que los nombres de las variables de usuario no son sensibles a mayúsculas desde MySQL 5.0; debe tener esto en cuenta cuando prepare una replicación entre 5.0 y versiones antiguas.

  • Los esclavos MySQL 5.0 pueden conectar a maestros 5.0 usando SSL.

  • En MYSQL 5.0 (desde 5.0.3), hay una variable de sistema global : Si el flujo SQL del esclavo de replicación falla al ejecutar una transacción debido a un deadlock o excede el de InnoDB o o de NDB, automáticamente reintenta veces antes de parar con un error. El valor por defecto en MySQL 5.0 es 10. A partir de MySQL 5.0.4, el número total de reintentos pueden verse en la salida de ; consulte Sección 5.3.4, “Variables de estado del servidor”.

  • Si o se usa en un comando en el maestro, la cláusula se usa en el esclavo. Esto puede causar problemas si no existe el directorio correspondiente en el sistema de ficheros del esclavo o existe pero no es accesible en el esclavo. MySQL 5.0 soporta una opción llamada . Si el esclavo se ejecuta con este modo SQL , ignora estas cláusulas al replicar el comando . El resultado es que los datos y ficheros índice se crean en el directorio de la base de datos de la tabla.

  • Es posible que los datos del maestro y el esclavo diverjan si se diseña una consulta tal que la modificación de los datos no sea determinista; esto es, si se deja a criterio del optimizador de consultas. (Esto no es generalmente una buena práctica en ningún caso, incluso fuera de la replicación.) Para una explicación detallada de este tema consulte Sección A.8.4, “Cuestiones abiertas en MySQL”.

  • Lo siguiente se aplica sólo si el maestro o el esclavo están ejecutando la versión 5.0.3 o anterior: Si se interrumpe un en el maestro (violación de integridad, conexión muerta, o así), el esclavo ignora el totalmente. Esto significa que si este comando inserta o actualiza registros en tablas de forma permanente antes de interrumpirse, estas modificaciones no se replican en el esclavo.

  • , , , y no se loguean ya que cualquiera de ellos puede causar problemas al replicarse en un esclavo.) Para un ejemplo de sintaxis, consulte Sección 13.5.5.2, “Sintaxis de . En MySQL 5.0, , , , y se escriben en el log binario y por lo tanto se replican en los esclavos. Esto no es un problema normalmente porque estos comandos no modifican los datos de las tablas. Sin embaargo, esto puede causar dificultades bajo ciertas circunstancias. Si replica las tablas de privilegios en la base de datos y actualiza estas tablas directamente sin usar , debe ejecutar un comando en los esclavos para poner los nuevos privilegios en efecto. Además, si usa cuando queda una tabla que es parte de una tabla , debe ejecutar un manualmente en los esclavos. En MySQL 5.0, estos comandos se escriben en el log binario a no ser que especifique o su alias .

  • MySQL sólo soporta un maestro y varios esclavos. En el futuro planeamos añadir un algoritmo de voto para cambiar el maestro automáticamente en caso de problemas con el maestro actual. También planeamos introducir procesos agentes para ayudar a realizar balanceo de carga mandando consultas a distintos esclavos.

  • Cuando un servidor para y reinicia, sus tablas () se vacían . En MySQL 5.0, el maestro replica este efecto como sigue: La primera vez que el maestro usa cada tabla tras arrancar, lo notifica a los esclavos que la tabla necesita vacíar escribiendo un comando para esa tabla en el log binario. Consulte Sección 14.3, “El motor de almacenamiento ()” para más información.

  • Las tablas temporales se replican excepto en el caso donde para el esclavo (no sólo los flujos esclavos) y ha replicado tablas temporales que se usan en actualizaciones que no se han ejecutado todavía en el esclavo. Si para el esclavo, las tablas temporales necesitadas por estas actualizaciones no están disponibles cuando el esclavo se reinicia. Para evitar este problema, no pare el esclavo mientras tiene tablas temporales abiertas. En lugar de eso, use el siguiente procedimiento:

    1. Ejecute un comando .

    2. Use para chequear el valor de la variable .

    3. Si el valor es 0, ejecute un comando mysqladmin shutdown para parar el esclavo.

    4. Si el valor no es 0, reinicie los flujos esclavos con .

    5. Repita el procedimiento posteriormente para comprobar si tiene mejor suerte la próxima vez.

    Planeamos arreglar este problema en el futuro cercano.

  • Es correcto conectar servidores de modo circular en una relación maestro/esclavo con la opción . Tenga en cuenta, sin embargo, que varios comandos no funcionan correctamente en esta clase de inicialización a no ser que su código cliente esté escrito para tener en cuenta que pueden ocurrir actualizaciones en distintas secuencias de diferentes servidores.

    Esto significa que puede crear una inicialización como esta:

    A -> B -> C -> A
    

    Los IDs de los servidores se codifican en los logs binarios de eventos, así que el servidor A conoce cuando un evento que lee fue creado originalmente por sí mismo y no ejecuta el evento ( a no ser que el servidor A se iniciara con la opción , que tiene significado sólo en inicializaciones raras). Por lo tanto, no hay bucles infinitos. Sin embargo, esta inicialización circular funciona sólo si no realiza actualizaciones conflictivas entre tablas. En otras palabras, si inserta datos tanto en A y C, no debe insertar un registro en A que pueda tener una clave que entre en conflicto con un registro insertado en C. Tampoco debe actualizar el mismo registro en dos servidores si el orden de las actualizaciones es significativo.

  • Si un comando en el esclavo produce un error, el flujo esclavo SQL termina, y el esclavo escribe un mensaje en su log de errores. Luego debe conectar al esclavo manualmente, arreglar el problema (por ejemplo, una tabla no existente), y luego ejecutar .

  • Es correcto parar un maestro y reiniciarlo posteriormente. Si un esclavo pierde su conexión con el maestro, el esclavo trata de reconectar inmediatamente. Si falla, el esclavo reintenta periódicamente. (Por defecto reinicia cada 60 segundos. Esto puede cambiarse con la opción .) El esclavo también es capaz de tratar con problemas de conectividad de red. Sin embargo, el esclavo se da cuenta del problema de red sólo tras no recibir datos del maestro durante segundos. Si los problemas son cortos, puede decrementar . Consulte Sección 5.3.3, “Variables de sistema del servidor”.

  • Parar el esclavo (correctamente) es seguro, ya que toma nota de dónde lo dejó. Las paradas no correctas pueden producir problemas, especialmente si la caché de disco no se volcó a disco antes que parara el sistema. La tolerancia a fallos del sistema se incrementa generalmente si tiene proveedores de corriente ininterrumpidos. Las paradas no correctas del maestro pueden causar inconsistencias entre los contenidos de tablas y el log binario en el maestro; esto puede evitarse usando tablas y la opción en el maestro. Consulte Sección 5.10.3, “El registro binario (Binary Log)”.

  • Debido a la naturaleza no transaccional de las tablas , es posible tener un comando que actualice parcialmente una tabla y retorne un código de error. Esto puede ocurrir, por ejemplo, en una inserción de varios registros que tenga un registro que viole una clave, o si una actualización larga se mata tras actualizar algunos de los registros. Si esto ocurre en el maestro, el flujo esclavo sale y para hasta que el administrador de base de datos decida qué hacer acerca de ello a no ser que el código de error se legitime y la ejecución del comando resulte en el mismo código de error. Si este comportamiento de validación de código de error no es deseable, algunos o todos los errores pueden ser ignorados con la opción .

  • Si actualiza tablas transaccionales para tablas no transaccionales dentro de una secuencia / , las actualizaciones del log binario pueden desincronizarse si la tabla no transaccional se actualiza antes de que acabe la transacción. Esto se debe a que la transacción se escribe en el log binario sólo cuando acaba.

  • En situaciones donde las transacciones mezclan actualizaciones transaccionales y no transaccionales, el orden de los comandso en el log binario es correcto , y todos los comandos necesarios se escriben en el log binario incluso en caso de un ). Sin embargo, cuando una segunda conexión actualiza la tabla no transaccional antes que la primera transacción se complete, los comandos pueden loguearse fuera de orden, ya que la actualización de la segunda conexión se escribe inmediatamente al ejectarse, sin tener en cuenta el estado de la transacción que se ejecuta en la primera conexión.