Red de conocimientos sobre prescripción popular - Conocimiento del confinamiento - Utilice Python para operar MySQL. Los datos que se muestran en la interfaz de Python se modifican, pero los datos no se modifican al ingresar a la tabla de vista desde MySQL.

Utilice Python para operar MySQL. Los datos que se muestran en la interfaz de Python se modifican, pero los datos no se modifican al ingresar a la tabla de vista desde MySQL.

Binlog de MySQL registra toda la información de cambios de la base de datos MySQL. Comprender la estructura de Binlog puede ayudarnos a analizar Binlog e incluso realizar algunas modificaciones o "manipulación" en Binlog, como implementar funciones similares al flashback de Oracle, recuperar registros eliminados accidentalmente y recuperar registros actualizados. Este artículo lo llevará a explorar la implementación de estas funciones mágicas y descubrirá que es mucho más fácil de lo que cree. El Binlog al que se hace referencia en este artículo es el Binlog en modo fila, que también es el modo predeterminado en MySQL 8. El patrón de declaración se usa cada vez menos porque existen muchas restricciones en su uso.

Binlog consta de eventos. Tenga en cuenta que los eventos no son transacciones y una transacción puede contener varios eventos. Este evento describe una modificación en la base de datos.

Ahora que conocemos la estructura de Binlog, podemos intentar modificar los datos en Binlog. Por ejemplo, en el ejemplo anterior, Binlog eliminó un registro y podemos intentar restaurar este registro. Hay un evento de eliminación de filas (DELETE_ROWS_EVENT) en Binlog, que elimina registros. La estructura de datos de este evento es exactamente la misma que la del evento de escritura de filas (WRITE_ROWS_EVENT), excepto que el tipo de evento para eliminar filas es 32 y el tipo de evento para escribir filas es 30. Ponemos la ubicación de Binlog correspondiente. En el "Mostrar eventos binlog" anterior, podemos ver que DELETE_ROWS_EVENT comienza desde la posición 378, que es la posición real del archivo Binlog (en bytes). De la estructura del evento, podemos ver que type_code está en el quinto byte del evento. Podemos escribir un pequeño programa Python para cambiar el byte 383 (378+5 = 383) a 30. Por supuesto, también puedes utilizar herramientas de edición binaria para cambiarlo.

Encontrar transacciones grandes en Binlog

Dado que Binlog en modo fila registra un registro para cada cambio, un SQL simple puede generar una transacción enorme en Binlog, como declaraciones de actualización o eliminación. Sin dónde, modifique todos los registros en toda la tabla y cada registro se registrará una vez en Binlog, lo que dará como resultado un registro de transacciones enorme. Cosas importantes como ésta suelen ser fuente de problemas. Uno de mis clientes se quejó una vez de que se había implementado un Binlog durante dos días, pero no pasó nada. Analicé el Binlog y descubrí que una transacción generó 1,4G de registros y modificó 660.000 registros. A continuación se muestra un subprograma de Python simple para encontrar transacciones grandes en Binlog. Sabemos que en el Binlog analizado por mysqlbinlog, cada transacción comienza con BEGIN y termina con COMMIT. Averigüemos la posición de "# at" antes de BENGIN y verifiquemos la posición de "# at" después de COMMIT. El tamaño de esta operación se puede calcular restando estas dos posiciones. A continuación se muestra un ejemplo de este programa Python.

Reducir transacciones grandes en Binlog

Para transacciones grandes, MySQL las dividirá en múltiples eventos (tenga en cuenta que uno es una transacción y el otro es el tamaño del evento). está determinado por el parámetro binlog Determinado por -row-event-max-size, el valor predeterminado es 8K. Entonces podemos dividir varios eventos en una transacción un poco más pequeña.

En modo fila, incluso si solo actualizamos un campo en el registro, se registrará el valor de cada campo antes y después del cambio. Este comportamiento está controlado por el parámetro binlog_row_image, que tiene tres valores. El valor predeterminado es FULL, es decir, todas las modificaciones en la columna se registrarán, incluso si el campo no ha cambiado. De esta forma, se puede lograr una función similar al flashback de Oracle. Personalmente, estimo que las futuras versiones de MySQL nunca lanzarán una característica basada en Binlog.

Después de conocer la estructura de Binlog y agregar la navaja suiza de Python, puedes lograr muchas funciones. Por ejemplo, podemos contar qué tabla se ha modificado más.

También podemos cortar Binlog en segmentos y luego volver a ensamblarlos para modificar y migrar de manera flexible la base de datos MySQL.