Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo utilizar Python para operar múltiples bases de datos en MySQL?

¿Cómo utilizar Python para operar múltiples bases de datos en MySQL?

Binlog de MySQL registra todos los cambios en la base de datos MySQL. Comprender la estructura de Binlog puede ayudarnos a analizar Binlog e incluso realizar algunas modificaciones o "manipular" Binlog, por ejemplo, para implementar funciones similares al "flashback" de Oracle. Por ejemplo, puede implementar funciones similares al flashback de Oracle, restaurar registros eliminados accidentalmente, restaurar registros actualizados, etc. Este artículo analizará estas increíbles características. Este artículo lo llevará a explorar la implementación de estas funciones mágicas y descubrirá que es mucho más simple de lo que cree. El Binlog en este artículo es el Binlog en modo FILA, que es el modo predeterminado en MySQL 8. El patrón STATEMENT se utiliza cada vez menos porque tiene muchas limitaciones en su uso.

Binlog se compone de eventos en lugar de transacciones, y una transacción puede contener múltiples eventos. Los eventos describen lo que se modificó en la base de datos.

Ahora que hemos entendido la estructura de Binlog, podemos intentar modificar los datos en Binlog. Por ejemplo, en el ejemplo anterior, Binlog eliminó un registro. Podemos intentar restaurar este registro. Hay un evento de eliminación de fila (DELETE_ROWS_EVENT) en Binlog. Este evento elimina el registro. (WRITE_ROWS_EVENT) Lo mismo, excepto que el tipo de evento de fila de eliminación es 32, y la estructura de datos del evento de fila de escritura y el evento WRITE_ROWS_EVENT son exactamente iguales, excepto que el tipo de evento WRITE_ROWS_EVENT es 32, mientras que el tipo. del evento WRITE_ROWS_EVENT es 30. Como se puede ver en el "mostrar eventos binlog" anterior (mostrar eventos binlog), DELETE_ROWS_EVENT comienza desde la posición 378, que es la posición real del archivo Binlog en bytes. Como puede ver en la estructura del evento, el código de tipo se encuentra en el quinto byte del evento, así que escribamos 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 hacer esto.

Encontrar transacciones grandes en Binlog

Dado que Binlog en modo ROW registra cada cambio, en Binlog, un SQL simple puede conducir a una transacción enorme, como una declaración de actualización o eliminación ( sin incluir dónde) modificará todas las filas de toda la tabla. Por ejemplo, una declaración de actualización o eliminación sin dónde modificará todas las filas de la tabla completa y cada registro se registrará una vez en Binlog, lo que dará como resultado un registro de transacciones enorme. Asuntos tan importantes a menudo traen problemas. Una vez, uno de mis clientes se quejó de que un binlog había estado avanzando durante dos días sin ningún movimiento. 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. Encontramos la posición de "# at" antes de BENGIN y verificamos la posición de "# at" después de COMMIT. Estas dos posiciones se pueden calcular restando el tamaño de la transacción.

Cortar transacciones grandes en Binlog

Para transacciones grandes, MySQL las descompondrá en múltiples eventos (tenga en cuenta que uno es la transacción TRANSACCIÓN y el otro es el evento EVENTO El tamaño es). determinado por el parámetro binlog-row-event-max-size, y el valor predeterminado es 8K.

Por lo tanto, podemos dividir varios eventos en una transacción un poco más pequeña

En el modo FILA, incluso si solo actualizamos un campo en el registro, se registrará el valor de cada campo antes y después del cambio. La fila está controlada por el parámetro binlog_row_image, que tiene tres valores. El valor predeterminado es COMPLETO, lo que significa que todos los cambios en la columna se registrarán incluso si el campo no ha cambiado. Este comportamiento está controlado por el parámetro binlog_row_image. Esto nos permite implementar una funcionalidad similar al flashback de Oracle, que personalmente sospecho que se introducirá en futuras versiones de MySQL basadas en Binlog.

Al comprender la estructura de Binlog y utilizar Python como nuestra navaja suiza, podemos hacer más cosas, como contar qué tablas se han modificado más. También podemos dividir y reorganizar Binlog para modificar y migrar de manera flexible la base de datos MySQL.