Todos los datos son InnoDB
Esto es lo que le dará una instantánea exacta de los datos en un momento dado:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
produce un punto de control que permite que el volcado capture todos los datos antes del punto de control mientras recibe los cambios entrantes. Esos cambios entrantes no se convierten en parte del volcado. Eso garantiza el mismo punto en el tiempo para todas las tablas.
--routines
vuelca todos los procedimientos almacenados y funciones almacenadas
--triggers
vuelca todos los disparadores para cada tabla que los tiene
Todos los datos son MyISAM o Mix de InnoDB / MyISAM
Tendrá que imponer un bloqueo de lectura global, ejecutar mysqldump y liberar el bloqueo global
mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
sleep 5
mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt
SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'`
echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
mysql -uuser -ppass -A < /tmp/kill_sleep.sql
Darle una oportunidad !!!
ACTUALIZACIÓN 2012-06-22 08:12 EDT
Como tiene <50 MB de datos totales, tengo otra opción. En lugar de lanzar un comando SLEEP en segundo plano para mantener el bloqueo de lectura global durante 86400 segundos (esas 24 horas) solo para obtener la identificación del proceso y matar afuera, intentemos configurar un tiempo de espera de 5 segundos en mysql en lugar de en el sistema operativo:
SLEEP_TIMEOUT=5
SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})"
mysql -uuser -ppass -Ae"${SQLSTMT}" &
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
Este es un enfoque más limpio y simple para bases de datos muy pequeñas.
ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
un mensaje de error esperado?--single-transaction
opción, como se menciona en otra respuesta.--lock-tables
.Vea la documentación oficial aquí.
fuente
Si desea hacer esto para MyISAM o tablas mixtas sin ningún tiempo de inactividad por el bloqueo de las tablas, puede configurar una base de datos esclava y tomar sus instantáneas desde allí. La configuración de la base de datos esclava, desafortunadamente, causa un tiempo de inactividad para exportar la base de datos en vivo, pero una vez que se está ejecutando, debería poder bloquear sus tablas y exportar utilizando los métodos que otros han descrito. Cuando esto sucede, se quedará atrás del maestro, pero no impedirá que el maestro actualice sus tablas y se pondrá al día tan pronto como se complete el respaldo.
fuente
Así es como lo hice. Debería funcionar en todos los casos, ya que utiliza
FLUSH TABLES WITH READ LOCK
.El
sleep
comando shell es solo para asegurarse de que la tarea en segundo plano que ejecuta el comando de bloqueo mysql se ejecute antes de que se inicie mysqldump. Podría reducirlo a 1 segundo y aún debería estar bien. Aumente a 30 segundos e intente insertar valores en cualquier tabla de otro cliente durante esos 30 segundos, verá que está bloqueado.Hay 2 ventajas al usar este bloqueo manual de fondo, en lugar de usar las
mysqldump
opciones--single-transaction
y--lock-tables
:mysqldump
durante el mismo período de bloqueo. Es útil, por ejemplo, al configurar la replicación en un nodo maestro, porque necesita obtener la posición del registro binarioSHOW MASTER STATUS;
en el estado exacto del volcado que creó (antes de desbloquear la base de datos), para poder crear una replicación esclava.fuente
La sugerencia de la documentación oficial de mysql es que debe tener una base de datos maestra "M1" y una base de datos esclava "S1" que se describe en "Escenario 2: Copia de seguridad con un esclavo de solo lectura" Copia de seguridad de un maestro o esclavo al hacerlo Solo lectura
Debe configurar la base de datos esclava de solo lectura y realizar
fuente
Si tiene una tabla MYISAM muy grande y necesita volcar la tabla sin bloqueo y evitar una carga elevada del servidor, puede usar el siguiente script.
fuente