Los ficheros de log binario que el servidor genera se escriben en formato binario. Para examinar estos ficheros en formato de texto, se utiliza la utilidad mysqlbinlog .
Invoque mysqlbinlog así:
shell> mysqlbinlog [opciones
]fichero_de_log
...
Por ejemplo, para mostrar el contenido del log binario
binlog.000003
, use este comando:
shell> mysqlbinlog binlog.0000003
La salida incluye todos los comandos contenidos en
binlog.000003
, junto con otra información
tal como el tiempo que ha tardado cada comando, el ID del thread
del cliente que lo lanzó, la hora en que se ejecutó, etcétera.
Normalmente, mysqlbinlog se utiliza para leer
ficheros de log binarios directamente y aplicarlos al servidor
MySQL local. También es posible leer logs binarios de un servidor
remoto usando la opción
--read-from-remote-server
.
Cuando se vaya a leer logs binarios remotos, deben darse los
parámetros de conexión para indicar cómo conectar con el
servidor, pero se ignoran a no ser que también se especifique la
opción --read-from-remote-server
. Estas
opciones son --host
, --password
,
--port
, --protocol
,
--socket
y --user
.
También puede utilizarse mysqlbinlog para leer ficheros de logs de relay escritos por un servidor esclavo en el arranque de una replicación. Los logs de relay tienen el mismo formato que los ficheros de log binarios.
El log binario se discute en Sección 5.10.3, “El registro binario (Binary Log)”.
mysqlbinlog soporta las siguientes opciones:
-
--help
,-?
Muestra un mensaje de ayuda y sale.
-
--database=
nombre_de_base_de_datos
,-d
nombre_de_base_de_datos
Muestra las entradas sólo para esta base de datos (sólo log local)
-
--force-read
,-f
Con esta opción, si mysqlbinlog lee de un log binario un evento que no reconoce, muestra una advertencia, ignora el comando, y continúa. Sin esta opción, mysqlbinlog se detiene si lee un evento que no reconoce.
-
--host=
nombre_de_equipo
,-h
nombre_de_equipo
Obtiene el log binario del servidor MySQL del equipo dado.
-
--local-load=
ruta
,-l
ruta
Prepara ficheros temporales locales para
LOAD DATA INFILE
en el directorio especificado. -
--offset=
N
,-o
N
Ignora las primeras
N
entradas. -
--password[=
contraseña
],-p[
contraseña
]La contraseña a usar cuando se conecta al servidor. Si usa la forma corta de opción (
-p
), no puede tener un espacio entre la opción y la contraseña. Si omite el valorcontraseña
siguiente a la opción--password
o-p
en la línea de comandos, aparece un prompt para que lo introduzca. -
--port=
número_de_puerto
,-P
número_de_puerto
El puerto TCP/IP a usar cuando conecta con un servidor remoto.
-
--position=
N
,-j
N
Obsoleto, use
--start-position
. -
--protocol={TCP | SOCKET | PIPE | MEMORY}
Protocolo de conexión a usar.
-
--read-from-remote-server
,-R
Lee el log binario de un servidor MySQL en vez de leer el local. Cualquier opción de parámetros de conexión se ignora a no ser que esta opción se dé también. Estas opciones son
--host
,--password
,--port
,--protocol
,--socket
, y--user
. -
--result-file=
nombre
,-r
nombre
Salida directa al fichero dado.
-
--short-form
,-s
Muestra sólo los comandos contenidos en el log, sin ninguna información extra.
-
--socket=
ruta
,-S
ruta
Fichero socket a usar para la conexión.
-
--start-datetime=
datetime
Comienza a leer el log binario en el primer evento que tenga una fecha igual o posterior a la del argumento
datetime
. El valordatetime
es relativo a la zona horaria local en la máquina donde se ejecuta mysqlbinlog. El valor debe estar en un formato aceptado por los tipos de datosDATETIME
oTIMESTAMP
. Por ejemplo:shell> mysqlbinlog --start-datetime="2004-12-25 11:25:56" binlog.000003
Esta opción es útil para recuperaciones en un punto temporal concreto.
-
--stop-datetime=
datetime
Detiene la lectura del log binario en el primer evento que tenga una fecha igual o posterior a la del argumento
datetime
. Consulte la descripción de la opción--start-datetime
para información acerca del valor dedatetime
. -
--start-position=
N
Comienza a leer el log binario en el primer evento que tenga una posición igual al argumento
N
. -
--stop-position=
N
Deja de leer el log binario en el primer evento que tenga una posición igual o superior al argumento
N
. -
--to-last-log
,-t
No se detiene al final del log binario solicitado del servidor MySQL, sino que sigue mostrando información hasta el final del último log binario. Si se envía la salida (output) al mismo servidor MySQL, esto puede conducir a un bucle infinito. Esta opción requiere
--read-from-remote-server
. -
--disable-log-bin
,-D
Desactiva el log binario. Esto es útil para eliminar un bucle infinito si se utiliza la opción
--to-last-log
y envía la salida (output) al mismo servidor MySQL. Esta opción también es útil cuando se restaura tras un fallo para evitar duplicación de comandos que se han logueado. Nota: Esta opción requiere privilegiosSUPER
. -
--user=
nombre_de_usuario
,-u
nombre_de_usuario
Nombre de usuario MySQL a usar cuando se conecta a un servidor remoto.
-
--version
,-V
Muestra versión de información y sale.
Puede cambiar las siguientes variales con las opciones
--
nombre_de_variable
=valor
:
-
open_files_limit
Especifica el número de descriptores de ficheros abiertos a reservar.
Puede enviar la salida (output) de mysqlbinlog a un cliente mysql para que ejecute los comandos contenidos en el log binario. Esto se usa para recuperar de un fallo cuando tiene una copia de seguridad antigua (consulte Sección 5.8.1, “Copias de seguridad de bases de datos”):
shell> mysqlbinlog nombre_de_equipo
-bin.000001 | mysql
O:
shell> mysqlbinlog hostname
-bin.[0-9]* | mysql
También puede redirigir la salida (output) de mysqlbinlog a un fichero de texto, si necesita modificar el log de comandos primero (por ejemplo, para eliminar comandos que no quiere ejecutar por alguna razón). Tras editar el fichero, ejecute los comandos que contiene usándolo como entrada del programa mysql .
mysqlbinlog tiene la opción
--start-position
, que muestra sólo aquellos
comandos con un desplazamiento en el log binario mayor o igual a
una posición dada (la posición dada debe coincidir con el
comienzo de un evento). También tiene las opciones de parar o
arrancar cuando ve un evento de una fecha y hora dada. Esto
permite ejecutar recuperaciones a partir de un punto temporal
usando la opción --stop-datetime
(que permite
decir, por ejemplo, "devuelve mi base de datos al estado en que
estaba hoy a las 10:30 AM").
Si tiene más de un log binario para ejecutar en el servidor MySQL, el método seguro es procesarlos todos usando una conexión única con el servidor. El siguiente ejemplo muestra una forma peligrosa de hacerlo:
shell> mysqlbinlognombre_de_equipo
-bin.000001 | mysql # PELIGRO!! shell> mysqlbinlognombre_de_equipo
-bin.000002 | mysql # PELIGRO!!
Procesar logs binarios de esta manera, utilizando diferentes
conexiones con el servidor provoca problemas si el primer fichero
de log contiene un comando CREATE TEMPORARY
TABLE
y el segundo log contiene un comando que usa la
tabla temporal. Cuando el primer proceso mysql
termina, el servidor elimina la tabla temporal. Cuando el segundo
proceso mysql trata de usar la tabla, el
servidor devuelve “tabla desconocida”.
Para evitar problemas como éste, utilice una única conexión para ejecutar los contenidos de todos los logs binarios que quiere procesar. Sigue una forma de hacerlo:
shell> mysqlbinlognombre_de_equipo
-bin.000001nombre_de_equipo
-bin.000002 | mysql
Otra forma de hacerlo es escribir todos los logs a un único fichero y luego procesar el fichero:
shell> mysqlbinlognombre_de_equipo
-bin.000001 > /tmp/statements.sql shell> mysqlbinlognombre_de_equipo
-bin.000002 >> /tmp/statements.sql shell> mysql -e "source /tmp/statements.sql"
En MySQL 5.0, mysqlbinlog puede producir la
salida (output) que reproduce una operación LOAD DATA
INFILE
sin el fichero de datos original.
mysqlbinlog copia los datos en un fichero
temporal y escribe un comando LOAD DATA LOCAL
INFILE
que se refiere a este fichero. La localización
por defecto del directorio donde estos ficheros se escriben es
específico del sistema. Para espeficar un directorio
explícitamente, use la opción --local-load
.
Como mysqlbinlog convierte comandos
LOAD DATA INFILE
en comandos LOAD DATA
LOCAL INFILE
(esto es, añade LOCAL
).
Tanto el cliente como el servidor que se utiliza para procesar los
comandos deben estar configurados para permitir
LOCAL
. Consulte
Sección 5.5.4, “Cuestiones relacionadas con la seguridad y LOAD DATA LOCAL
”.
Atención: Los ficheros
temporales creados por comandos LOAD DATA LOCAL
no se borran automáticamente ya que se
necesitan hasta que los comandos se ejecutan totalmente. Debe
borrar los ficheros temporales cuando no necesite el log de
comandos. Los ficheros pueden encontrarse en el directorio de
ficheros temporales y tienen nombres como
original_file_name-#-#
.
En el futuro, eliminaremos este problema permitiendo que
mysqlbinlog pueda conectarse directamente a un
servidor mysqld. Así será posible eliminar
los ficheros de log automáticamente cuando los comandos
LOAD DATA INFILE
se hayan ejecutado.