Cómo inyectar una transacción XA vacía en MySQL

Si está utilizando transacciones XA, es probable que haya encontrado algunos problemas de replicación con 2PC (confirmaciones de 2 fases). Aquí hay un error común que vemos en los servicios administrados de Percona y algunas formas de lidiar con él, incluida la inyección de una transacción XA vacante.

Qué significa eso?

Esto significa que la replicación intentó confirmar un XID (ID de transacción XA) que no existe en el servidor. Podemos verificar que no hay cheque:

En este caso, hay una transacción XA preparada en el servidor pero es XID X’2B ‘, X’B2’, 1 ′ No X’1a ‘, X’a1’, 1 ′. Entonces, realmente, el XID no existe.

¿Cómo lo arreglamos?

Algunas formas … Cuando se usa la replicación anónima, se puede omitir como cualquier otro error:

Al usar GTID, se puede omitir inyectando normalmente un GTID vacío:

Otra opción es que podemos inyectar una transacción XA vacía, como hacemos con GTID. Luego, podemos reanudar la replicación para que pueda comprometerse naturalmente con ese XID.

Para preparar un XA vacío, primero copie el SQL + XID del error. En ese caso, «XA COMPROMISO X’1a ‘, X’a1 ′, 1«.

Ahora pase a tres declaraciones y ejecute la réplica incorrecta.

Esto creará una transacción XA lista en el servidor. Podemos comprobar ejecutando:

Entonces, comencemos la replicación:

Oh oh, ahora que? Cuando prepara una transacción XA en un servidor, su sesión no puede realizar ningún otro SQL. Debe desconectarse de MySQL, volver a conectarse y luego iniciar la replicación.

Independientemente de cómo maneje el error, es recomendable realizar una suma de comprobación para confirmar la coherencia de los datos.

¿Como sucedió esto?

2PC escriben en los binlogs en dos … fases 🙂 La primera fase contiene el {XA START / transacción SQL / XA END / XA PREPARE}. Piense en todas estas declaraciones como un solo GTID. Una vez que se ha ejecutado el comando XA PREPARE, toda la transacción se escribe en el registro binario, por lo que estas declaraciones siempre se escribirán juntas. Ejemplo:

Ahora tenemos un XA listo en la fuente y las réplicas (que pueden mantener las colas bloqueadas y bloquear otras transacciones). La transacción ahora se puede comprometer o aplazar, esto depende de la segunda fase y de ahí vienen los problemas.

La segunda fase de confirmación / reversión puede ocurrir segundos después, minutos después, días después o incluso nunca. Todo depende de cuándo / si el Administrador de transacciones emite el comando. En este caso, fue 4 minutos más tarde:

Puede haber cientos o miles de otras transacciones escritas en el registro binario entre la primera y la segunda fase. También se pueden escribir en diferentes bitácoras.

Esta explicación es solo para mostrar cómo funcionan las 2PC para comprender las partes separadas de una transacción XA.

Resumen

Ahora, para intentar dar una respuesta a «¿cómo sucede esto?» … podría ser por restaurar una copia de seguridad, pero MySQL no le dijo que preparara un XID en el servidor. Ahora comienza la replicación y lee los eventos del binlog de origen. Luego se encontró con un XA COMMIT pero que XID no estaba preparado para ese error. En última instancia, estos problemas generalmente se reducen a unos pocos errores (aquí hay uno por ejemplo).

¿Tiene XA que bloquea otras transacciones? Descubra aviones, trenes y automóviles: transacciones MySQL XA.

aquí vamos otra publicación sobre cómo arreglar la recuperación de XA.

Percona Server para MySQL también está funcionando hace que XA RECOVER CONVERT XID sea más útil!

Author: Ing. Luis

A lo largo de conocer Windows y otros sistemas operativos me eh encontrado con diversos tipos de error, ahora brindo soluciones según mi experiencia-

Deja un comentario