El registro binario contiene toda la información que está disponible en el registro de actualizaciones, en un formato más eficiente y de una manera que es segura para las transacciones.
El registro binario contiene todas las sentencias que han
actualizado datos o podrían haberlo hecho (por ejemplo, un
DELETE
que no encontró filas concordantes).
Las sentencias se almacenan en la forma de
“eventos” que describen las modificaciones.
Atención: El registro binario ha reemplazado al antiguo registro de actualizaciones, que ya no está disponible a partir de MySQL 5.0.
El registro binario también contiene información sobre cuanto ha tardado cada sentencia que actualizó la base de datos. No contiene sentencias que no hayan modificado datos. Si quiere registrar todas las sentencias (por ejemplo, para identificar una sentencia problemática) debería utilizar el registro de consultas general. Consulte Sección 5.10.2, “El registro general de consultas”.
El propósito principal del registro binario es el de actualizar la base de datos durante una operación de recuperación tan completamente como sea posible, porque el registro binario contiene todas las actualizaciones hechas tras la copia de seguridad.
El registro binario también se utiliza en los servidores maestros de replicación como recordatorio de las sentencias que deben ser enviadas a los servidores esclavos. Consulte Capítulo 6, Replicación en MySQL.
Ejecutar el servidor con el registro binario activado hace que el rendimiento baje un 1%. Aún así, los beneficios del registro binario para las operaciones de restauración y el hecho de permitirnos poder establecer replicación generalmente son superiores a este decremento de rendimiento.
Cuando se ha iniciado con la opción
--log-bin[=
mysqld escribe un archivo de registro que
contiene todos los comandos SQL que actualizan datos. Si no se
da ningún valor para file_name
]file_name
, el
valor por defecto es el nombre de la máuqina host seguido por
-bin
. Si se da el nombre del archivo, pero
ninguna ruta, el archivo se escribe en el directorio de datos.
Se recomienda especificar un nombre de archivo, consulte
Sección A.8.4, “Cuestiones abiertas en MySQL” para ver el motivo.
Si usted proporciona una extensión en el nombre del registro
(por ejemplo,
--log-bin=
),
la extensión se ignora y elimina sin aviso.
file_name.extension
mysqld agraga una extensión numérica a el
nombre del registro binario. Este número se incrementa cada vez
que se inicia el servidor o se vuelcan los registros. También
se crea un nuevo registro binario cuando el actual llega al
tamaño especificado en max_binlog_size
. Un
registro binario puede llegar a ser más grande de
max_binlog_size
si está utilizando
transacciones grandes: Una transacción se escribe en el
registro de una sola pieza, nunca se parte entre diferentes
registros.
Para poder averiguar qué archivos de registro binario
diferentes han sido utilizados, mysqld
también crea un archivo de índice de los registros binarios
que contiene los nombres de todos los archivos de registro
binario utilizados. Por defecto éste tiene el mismo nombre que
el archivo de registro binario, con la extensión
'.index'
. Puede cambiar el nombre del archivo
de índice con la opción
--log-bin-index[=
.
No debería editar este archivo manualmente mientras
mysqld se está ejecutando; hacerlo podría
confundir a mysqld.
file_name
]
Puede borrar todos los archivos de registro binario con la
sentencia RESET MASTER
, o sólo algunos de
ellos con PURGE MASTER LOGS
. Consulte
Sección 13.5.5.5, “Sintaxis de RESET
” y
Sección 13.6.1, “Sentencias SQL para el control de servidores maestros”.
El formato del registro binario tiene algunas limitaciones conocidas que pueden afectar a la recuperación de copias de seguridad. Consulte Sección 6.7, “Características de la replicación y problemas conocidos”.
El registro binario de procedimientos almacenados y disparadores se hace tal como se explica en Sección 19.3, “Registro binario de procedimientos almacenados y disparadores”.
Puede utilizar las siguientes opciones de mysqld para determinar lo que se registra en el registro binario. Vea también la explicación que sigue a esta lista de opciones.
--binlog-do-db=
db_name
Le dice al maestro que debería registrar los cambios en el
registro binario si la base de datos actual (es decir, la
que está seleccionada mediante USE
) es
db_name
. Todos las otras bases de
datos que no sean mencionadas explícitamente son ignoradas.
Si utiliza esto, debería asegurarse de que sólo hace
cambios en la base de datos actual.
Tenga en cuenta que hay una excepción a esto en lo que
respecta a las sentencias CREATE
DATABASE
, ALTER DATABASE
, y
DROP DATABASE
, que utilizan la base de
datos manipulada en vez de la actual para decidir si
deberían registrar la sentencia.
Un ejemplo de algo que no funciona como podría esperarse:
Si el servidor se inició con
binlog-do-db=sales
, y usted ejecuta
USE prices; UPDATE sales.january SET
amount=amount+1000;
, esta sentencia no llega a
escribirse en el registro binario.
--binlog-ignore-db=
db_name
Le dice al maestro que las actualizaciones donde la base de
datos actual (es decir, la que ha sido seleccionada mediante
USE
) es
db_name
no deberían ser
almacenadas en el registro binario. Si utiliza esto,
debería asegurarse de que solo hace actualizaciones en la
base de datos actual.
Un ejemplo de algo que no funciona como podría esperarse:
Si el servidor se inició con
binlog-ignore-db=sales
, y ejecuta
USE prices; UPDATE sales.january SET
amount=amount+1000;
, esta sentencia no se escribe
en el registro binario.
De la misma forma que en el caso de
--binlog-do-db
, hay una excepción para
las sentencias CREATE DATABASE
,
ALTER DATABASE
, y DROP
DATABASE
, que utilizan la base de datos manipulada
para decidir si deben registrar la sentencia, en vez de la
base de datos actual.
Para registrar o ignorar múltiples bases de datos, utilice múltiples opciones, especificando la opción apropiada una vez para cada base de datos.
Las reglas para registrar o ignorar actualizaciones en el
registro binario son evaluadas de acuerdo a las siguientes
normas. Tenga en cuenta que hay una excepción para las
sentencias CREATE DATABASE
, ALTER
DATABASE
, y DROP DATABASE
. En esos
casos, la base de datos que está siendo creada,
alterada, o eliminada reemplaza a la base de datos
actual en las reglas siguientes.
¿Hay alguna regla binlog-do-db
o
binlog-ignore-db
?
No: Escribir la sentencia al registro binario y salir.
Sí: Proceder al siguiente paso.
Hay algunas reglas (binlog-do-db
o
binlog-ignore-db
o ambas). ¿Hay una base
de datos actual (¿ha sido seleccionada alguna base de datos
mediante USE
?)?
No: No escribir la sentencia, y salir.
Sí: Proceder al siguiente paso.
Hay una base de datos actual. ¿Hay alguna regla
binlog-do-db
?
Sí: ¿Concuerda la base de datos con alguna de las
reglas binlog-do-db
?
Sí: Escribir la sentencia y salir.
No: No escribir la sentencia, y salir.
No: Proceder al siguiente paso.
Hay alguna regla binlog-ignore-db
.
¿Concuerda la base de datos con alguna de las reglas
binlog-ignore-db
?
Sí: No escribir la sentencia, y salir.
No: Escribir la sentencia y salir.
Por ejemplo, un esclavo ejecutándose con sólo
binlog-do-db=sales
no escribe en el registro
binario ninguna sentencia en la que la base de datos actual sea
diferente de sales
(es decir, a veces
binlog-do-db
puede significar ``ignora otras
bases de datos'').
Si está utilizando replicación, debería no borrar los
archivos de registros binarios viejos hasta que esté seguro de
que ningún esclavo los necesita. Una manera de averiguarlo es
hacer mysqladmin flush-logs una vez al día y
borrar cualquier registro que tenga más de tres días de
antigüedad. Puede borrarlos manualmente, o mejor aún mediante
PURGE MASTER LOGS
(consulte
Sección 13.6.1, “Sentencias SQL para el control de servidores maestros”), que además también
actualiza de manera segura el archivo de índice de registros
binarios (y que puede recibir parámetros de fecha).
Un cliente con el privilegio SUPER
puede
desactivar el registro binario de sus propias sentencias
utilizando una sentencia SET SQL_LOG_BIN=0
.
Consulte Sección 13.5.3, “Sintaxis de SET
”.
Puede examinar el archivo de registro binario con la utilidad mysqlbinlog. Esto podría ser útil cuando usted quiera reprocesar sentencias almacenadas en el registro. Por ejemplo, puede actualizar un servidor MySQL desde el registro binario de la siguiente manera:
shell> mysqlbinlog log-file | mysql -h server_name
Consulte Sección 8.5, “La utilidad mysqlbinlog para registros binarios” para obtener más información sobre la utilidad mysqlbinlog y su utilización.
Si usted está utilizando transacciones, debería utilizar el registro binario de MySQL para hacer las copias de seguridad, en vez del antiguo registro de actualizaciones.
El registro binario se hace inmediatamente después de que se completa una consulta, pero antes de que se libere cualquier bloqueo o se haga ningún commit. Esto asegura que el registro está almacenado en el orden de ejecución.
Las actualizaciones a las tablas no-transaccionales se almacenan
en el registro binario inmediatamente después de su ejecución.
Para las tablas transaccionales como las tablas
BDB
o InnoDB
, todas las
actualizaciones (UPDATE
,
DELETE
, o INSERT
) que
cambian alguna tabla son almacenadas en cache hasta que se
recibe una sentencia COMMIT
en el servidor.
En ese momento mysqld escribe la transacción
completa al registro binario antes de que se ejecute el
COMMIT
. Cuando el flujo de ejecución que
gestiona la transacción comienza, reserva un buffer de tamaño
binlog_cache_size
para almacenar consultas.
Si una sentencia es más grande de esto, el flujo abre un
archivo temporal para almacenar la transacción. El archivo
temporal se borra cuando acaba el flujo.
La variable de estado Binlog_cache_use
muestra el número de transacciones que han utilizado este
buffer (y posiblemente un archivo temporal) para almacenar
sentencias. La variable de estado
Binlog_cache_disk_use
muestra cuantas de esas
transacciones llegaron realmente a utilizar un archivo temporal.
Estas dos variables pueden utilizarse para establecer el valor
de binlog_cache_size
y evitar el uso de
archivos temporales.
El tamaño max_binlog_cache_size
(por defecto
4GB) se puede utilizar para restringir el tamaño total
utilizado para almacenar una transacción con múltiples
sentencias. Si una transacción es más grande que esto, falla y
se hace un rollback.
Si usted está utilizando el registro de actualizaciones o el
binario, las inserciones concurrentes se convierten a
inserciones normales cuando se utiliza CREATE ...
SELECT
o INSERT ... SELECT
. Esto se
hace así para asegurarse de que se puede reconstruir una copia
exacta de sus tablas aplicando los registros a una copia de
seguridad.
Tenga en cuenta que el formato del registro binario es diferente en MySQL 5.0 al de versiones anteriores de MySQL, debido a mejoras en la replicación. Consulte Sección 6.5, “Compatibilidad entre versiones de MySQL con respecto a la replicación”.
Por defecto, el registro binario no se sincroniza con el disco
en cada escritura. Así que si el sistema operativo o la
máquina (no únicamente el servidor MySQL) falla, existe la
posibilidad de que las últimas sentencias del registro binario
se pierdan. Para prevenir esto, puede hacer que el registro
binario se sincronice con el disco tras cada
N
escrituras, con la variable global
sync_binlog
(siendo 1 el valor más seguro,
pero también el más lento). Consulte
Sección 5.3.3, “Variables de sistema del servidor”. Aún con el valor de
sync_binlog
establecido en 1, existe una
posibilidad de que haya una inconsistencia entre las tablas y el
registro binario en el caso de fallo. Por ejemplo, si está
utilizando tablas InnoDB
, y el servidor MySQL
procesa una sentencia COMMIT
, escribe la
transacción completa al registro binario, y después la envía
a InnoDB
. Si el fallo se produce entre estas
dos operaciones, al reiniciar la transacción es rechazada por
InnoDB
, pero todavía existe en el registro
binario. Este problema puede resolverse con la opción
--innodb-safe-binlog
, que añade consistencia
entre el contenido de las tablas InnoDB
y el
registro binario.
Para que esta opción proporcione un grado mayor de seguridad,
el servidor MySQL debe estar también configurado para
sincronizar a disco, en cada transacción, el registro binario
(sync_binlog=1
) y (lo que es cierto por
defecto) los registros InnoDB
. El efecto de
esta opción es que al reiniciar tras un fallo, o tras hacer un
rollback de transacciones, el servidor MySQL elimina las
transacciones InnoDB
que han sufrido una
cancelación del registro binario. Esto asegura que el registro
binario refleje los datos exactos que hay en las tablas
InnoDB
y, así, el esclavo permanece
sincronizado con el maestro (no recibe una sentencia que ha sido
cancelada).
Tenga en cuenta que --innodb-safe-binlog
se
puede utilizar aún cuando el servidor MySQL actualice otros
motores de almacenamiento que no sean InnoDB
.
Sólo las sentencia/transacciones que afecten a tablas
InnoDB
son candidatas a ser eliminadas del
registro binario durante la recuperación de un fallo de
InnoDB
. Si durante la recuperación el
servidor MySQL descubre que el registro binario es más corto de
lo que debería ser (es decir, le falta al menos una
transacción InnoDB
realizada con éxito), lo
que no debería ocurrir con sync_binlog=1
y
el disco/sistema de archivos hace una sincronización real
cuando se le pide (algunos no lo hacen), muestra un mensaje de
error ("The binary log <name> is shorter than its expected
size"). En este caso el registro binario no es correcto, y la
replicación debería reiniciarse desde una nueva imagen de los
datos del maestro.
La escrituras al archivo del registro binario y al de índice de
registros son gestionados de la misma manera que las escrituras
a las tablas MyISAM
. Consulte
Sección A.4.3, “Cómo se comporta MySQL ante un disco lleno”.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.