Use mysqlbinlog para descargar de forma remota los archivos de registro binario de un clúster de PolarDB for MySQL y analizarlos localmente. Esto le permite auditar datos, recuperar información en un momento específico o solucionar problemas de replicación.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Enabled binary logging para el clúster de PolarDB for MySQL. El registro binario está deshabilitado de forma predeterminada. Sin esta función,
SHOW BINARY LOGS;devuelveYou are not using binary logging. Habilitar o deshabilitar el registro binario reinicia automáticamente el clúster. Por ello, aplique este cambio fuera del horario de mayor actividad y compruebe que sus aplicaciones se reconecten de manera automática.Un cliente de MySQL instalado en su servidor local.
El endpoint del clúster (privado o público). Consulte Manage the endpoints of a cluster.
Una cuenta de base de datos para el clúster de PolarDB for MySQL. Consulte Create and manage a database account.
Funcionamiento
El nodo que proporciona los registros binarios depende del endpoint al que se conecte:
|
Método de conexión |
Origen de los registros binarios |
|
Endpoint principal, endpoint predeterminado del clúster o endpoint personalizado del clúster asociado al nodo principal |
Nodo principal |
|
Endpoint personalizado del clúster asociado únicamente a nodos de solo lectura |
Uno de los nodos de solo lectura |
Para descargar registros binarios desde un nodo de solo lectura, se requiere una de las siguientes versiones:
PolarDB for MySQL 8.0, versión de revisión 8.0.1.1.12 o posterior
PolarDB for MySQL 5.7, versión de revisión 5.7.1.0.12 o posterior
Si no se cumple este requisito de versión, mysqlbinlog devuelve Only allow to dump binary log file on primary instance. Consulte Minor version update para actualizar la versión.
Descarga de los archivos de registro binario
-
Conéctese al clúster de PolarDB desde el cliente de MySQL. Consulte Database connection.
root@xxx:~# mysql -h xxx-polardb.rwlb.rds.aliyuncs.com -P3306 -utest_api -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is xxx Server version: 8.0.13 Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> -
Enumere los archivos de registro binario disponibles:
SHOW BINARY LOGS;La salida muestra el nombre y el tamaño de cada archivo de registro:
+------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000005 | 2639 | +------------------+-----------+ 1 row in set (0.00 sec)Anote el valor de
Log_name, ya que lo utilizará en el siguiente paso. -
Salga del cliente de MySQL:
exit -
Ejecute mysqlbinlog para descargar el archivo de registro binario en su servidor local. Formato del comando:
Parámetros:
Parámetro
Descripción
--read-from-remote-serverObligatorio. Se conecta al clúster como cliente de replicación para transmitir los registros binarios de forma remota.
--host/-hEl endpoint privado o público del clúster. Utilice un endpoint privado si el clúster y su servidor están en la misma región y virtual private cloud (VPC); de lo contrario, use un endpoint público. Si el endpoint utiliza un puerto distinto al predeterminado, agregue el número de puerto después del endpoint.
--user/-uEl nombre de la cuenta de base de datos del clúster de PolarDB for MySQL.
--password/-pLa contraseña de la cuenta. Omita el valor para introducirla de forma interactiva después de ejecutar el comando.
--rawGuarda el registro binario en su formato binario original, sin convertirlo a texto.
mysql-bin.<log-number>El nombre del archivo de registro binario obtenido del campo
Log_nameen el paso 2.mysqlbinlog -u<Username> -p<Password> -h<Endpoint> --read-from-remote-server --raw mysql-bin.******Por ejemplo:
mysqlbinlog -utest_api -p -htest-polardb.rwlb.rds.aliyuncs.com --read-from-remote-server --raw mysql-bin.000005mysql> exit Bye root@xxx:~# mysqlbinlog -utest_api -p -hxxx-polardb.rwlb.rds.aliyuncs.com --read-from-remote-server --raw mysql-bin.000005 Enter password: root@xxx:~#
Consulta y análisis de los archivos de registro binario
Ejecute mysqlbinlog sobre el archivo descargado para decodificar y consultar su contenido:
mysqlbinlog -vv --base64-output=decode-rows mysql-bin.<log-number> | more
-vv: muestra instrucciones SQL detalladas y cambios a nivel de fila.--base64-output=decode-rows: decodifica los eventos de fila codificados en base64 y los convierte en instrucciones SQL legibles.
La salida muestra el contenido decodificado de cada evento del archivo de registro binario:
[root@iZ ~]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000110 | more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#160217 23:04:37 server id 2802943055 end_log_pos 107 Start: binlog v 4, server v 5.5.18.1-log created 160217 23:04:37
# at 107
#160217 23:04:38 server id 2802943055 end_log_pos 171 Query thread id=584632 exec time=0 error code=0
SET TIMESTAMP=1455721478/*!*/;
SET @@session.pseudo_thread_id=584632/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=2097152/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 171
Utilice la misma versión de MySQL que la versión del motor de base de datos del clúster de PolarDB para evitar errores de análisis.
Para conocer la sintaxis completa y las opciones de mysqlbinlog, consulte la documentación de MySQL.
Preguntas frecuentes
¿Por qué SHOW BINARY LOGS devuelve "You are not using binary logging"?
El registro binario está deshabilitado de forma predeterminada. Siga los pasos de Enable binary logging para habilitarlo en el clúster e inténtelo de nuevo.
Habilitar o deshabilitar el registro binario reinicia automáticamente el clúster.
¿Por qué mysqlbinlog falla con un error de comprobación de integridad o de suma de verificación?
ERROR: Error in Log_event::read_log_event(): 'Sanity check failed', data_len: 151, event_type: 35
ERROR: Could not read entry at offset 120: Error in log format or read error.
ERROR: Got error reading packet from server: 'Slave can not handle replication events with the checksum that master is configured to log;
La versión de mysqlbinlog es demasiado antigua. Actualícela a una versión más reciente; por ejemplo, si usa la V3.3, actualice a la V3.4.
¿Por qué mysqlbinlog falla con el mensaje "Lost connection to MySQL server"?
ERROR: Failed on connect: Lost connection to MySQL server at 'reading initial communication packet', system error: 104
Compruebe lo siguiente:
Conectividad de red: compruebe que su servidor pueda alcanzar el endpoint del clúster.
Lista de permitidos de IP: asegúrese de que la dirección IP de su servidor esté agregada a la lista de permitidos del clúster. Consulte Configure an IP whitelist.
Configuración de la base de datos: compruebe si su servidor local de MySQL puede conectarse a las bases de datos y asegúrese de poder acceder correctamente a ellas.
¿Por qué no se decodifica el contenido de los archivos de registro binario?
Si ejecuta mysqlbinlog sin --base64-output=decode-rows, los eventos de fila se muestran como cadenas base64 sin procesar:
A continuación se muestra un ejemplo de la salida de un registro binario sin decodificar cuando no se utiliza --base64-output=decode-rows. Las instrucciones BINLOG contienen datos codificados en base64 que no se han analizado sintácticamente:
[root@iz ~]# mysqlbinlog -vv mysql-bin.000110 | more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#160217 23:04:37 server id 2802943055 end_log_pos 107 Start: binlog v 4, server v 5.5.18.1-log created 160217 23:04:37
BINLOG '
BYzEVg9PhBGnZwAAAGsAAAAAAAAQANS41LjE4LjEtbG9nAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAAA==
'/*!*/;
# at 107
#160217 23:04:38 server id 2802943055 end_log_pos 171 Query thread_id=584632 exec_time=0 error_code=0
Incluya siempre --base64-output=decode-rows al consultar archivos de registro binario.
¿Por qué aparece "Only allow to dump binary log file on primary instance" al conectarse a un nodo de solo lectura?
La versión de su clúster no cumple con el requisito mínimo para acceder a los registros binarios desde un nodo de solo lectura. Actualice a PolarDB for MySQL 8.0, revisión 8.0.1.1.12 o posterior, o bien a PolarDB for MySQL 5.7, revisión 5.7.1.0.12 o posterior. Consulte Minor version update.
¿Por qué los registros binarios de un nodo de solo lectura a veces van atrasados respecto al nodo principal?
El nodo principal replica los archivos de registro binario a los nodos de solo lectura de forma asíncrona. Si se produce latencia de sincronización, es posible que los nodos de solo lectura aún no tengan los archivos de registro escritos más recientemente. Este retraso suele ser breve cuando el volumen de datos es pequeño.
¿Por qué no se elimina un archivo de registro binario caducado tras el periodo de retención binlog_expire_logs_seconds?
Si un hilo de un nodo de solo lectura está leyendo activamente el archivo cuando este caduca, el sistema lo conserva hasta que finaliza la lectura. Una vez que el nodo principal escribe un nuevo archivo de registro binario, el sistema busca los archivos caducados que ya no se estén leyendo y los elimina.