¿Cómo obtener un volcado correcto usando mysqldump y una sola transacción cuando se usa DDL al mismo tiempo?

StackOverflow https://stackoverflow.com/questions/451404

  •  19-08-2019
  •  | 
  •  

Pregunta

Soy nuevo en MySQL y estoy descubriendo la mejor manera de realizar una copia de seguridad lógica en línea usando mysqldump . Esta página sugiere esta línea de comando:

mysqldump --single-transaction --flush-logs --master-data=2
          --all-databases > backup_sunday_1_PM.sql

pero ... si lee la documentación detenidamente encuentra que :

  

Mientras se está procesando un volcado de --single-transacción , para garantizar un archivo de volcado válido   (contenido correcto de la tabla y posición del registro binario), ninguna otra conexión debe usar   las siguientes declaraciones: ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE . UNA   la lectura consistente no está aislada de esas declaraciones, así que úselas en una tabla para   ser volcado puede hacer que SELECT realizado por mysqldump recupere el contenido de la tabla   para obtener contenidos incorrectos o fallar.

Entonces, ¿hay alguna manera de prevenir este posible escenario de corrupción de volcado? Es decir. comandos que podrían bloquear esas declaraciones temporalmente.

PD: entrada de error de MySQL sobre este tema http://bugs.mysql.com/ bug.php? id = 27850

¿Fue útil?

Solución

Abra una ventana de comando mysql y emita este comando:

mysql> FLUSH TABLES WITH READ LOCK;

Esto bloqueará todas tablas en todas bases de datos en esta instancia de MySQL hasta que emita UNLOCK TABLES (o finalice la conexión del cliente que contiene estas leer bloqueos).

Para confirmar esto, puede abrir otra ventana de comando e intentar hacer un ALTER , DROP , RENAME o TRUNCATE . Estos comandos se cuelgan, esperando que se libere el bloqueo de lectura. Presiona Ctrl-C para terminar la espera.

Pero aunque las tablas tienen un bloqueo de lectura, aún puede realizar una copia de seguridad mysqldump .

El comando FLUSH TABLES WITH READ LOCK puede ser el mismo que usar la opción --lock-all-tables de mysqldump . No está totalmente claro, pero este documento parece admitir it:

  

Otro uso para UNLOCK TABLES es   liberar el bloqueo de lectura global adquirido   con FLUSH TABLES CON READ LOCK.

Tanto ENJUAGAR TABLAS CON READ LOCK como --lock-all-tables usan la frase " global read lock, " así que creo que es probable que hagan lo mismo. Por lo tanto, debe poder usar esa opción para mysqldump y protegerse contra ALTER, DROP, RENAME y TRUNCATE concurrentes.


Re. su comentario: Lo siguiente es de Guilhem Bichot en el registro de errores de MySQL al que se vinculó:

  

Hola. --lock-all-tables llama a FLUSH   TABLAS CON BLOQUEO LEÍDO. Así es   se espera que bloquee ALTER, DROP, RENAME,   o TRUNCATE (a menos que haya un error o   Me equivoco). Sin embargo, --lock-all-tables   - transacción única no puede funcionar (mysqldump arroja un mensaje de error):   porque lock-all-tables bloquea todo   tablas del servidor contra escrituras   durante la duración de la copia de seguridad,   mientras que la transacción única está destinada   dejar que las escrituras sucedan durante la copia de seguridad   (utilizando un SELECT de lectura consistente en   una transacción), son incompatibles   en la naturaleza.

A partir de esto, parece que no puede obtener acceso simultáneo durante una copia de seguridad, y simultáneamente bloquea ALTER, DROP, RENAME y TRUNCATE.

Otros consejos

Pensé lo mismo al leer esa parte de la documentación, pero encontré más información:

4.5.4. mysqldump & # 8212; Un programa de respaldo de base de datos http://dev.mysql.com/doc/en/mysqldump.html

  

Para las tablas InnoDB, mysqldump proporciona una forma de hacer un en línea   copia de seguridad:

shell> mysqldump --all-databases --single-transaction > all_databases.sql
     

Esta copia de seguridad adquiere un bloqueo de lectura global en todas las tablas (usando FLUSH   TABLAS CON BLOQUEO DE LECTURA) al comienzo del volcado. Tan pronto como esto   se ha adquirido el bloqueo, se leen las coordenadas del registro binario y se   Se libera el bloqueo. Si se ejecutan largas declaraciones de actualización cuando el   Se emite una declaración FLUSH, el servidor MySQL puede bloquearse hasta   esas declaraciones terminan. Después de eso, el volcado queda libre de bloqueo y   No molesta las lecturas y escrituras en las tablas. Si la actualización   las declaraciones que recibe el servidor MySQL son cortas (en términos de   tiempo de ejecución), el período de bloqueo inicial no debe ser notable,   incluso con muchas actualizaciones.

Existe un conflicto con el - opt y - opciones de una sola transacción :

  

--opt

     

Esta opción es abreviada. Es lo mismo que especificar   --add-drop-table --add-locks --create-options --disable-keys --extend-insert --lock-tables --quick --set-charset. Debería darle una operación de volcado rápido y producir un archivo de volcado que se pueda volver a cargar   en un servidor MySQL rápidamente.

     

La opción --opt está habilitada por defecto. Use --skip-opt para deshabilitarlo.

Si entiendo su pregunta correctamente, quiere los datos reales y el DDL (Lenguaje de definición de datos) juntos, porque si solo desea el DDL, usaría --no-data . Puede encontrar más información sobre esto en:

http: //dev.mysql .com / doc / workbench / es / wb-reverse-engineer-create-script.html

  

Use la opción --databases con mysqldump si desea crear el   base de datos, así como todos sus objetos. Si no hay CREATE DATABASE   db_name en su archivo de script, debe importar la base de datos   objetos en un esquema existente o, si no hay esquema, uno nuevo   Se crea un esquema sin nombre.

Según lo sugerido por La guía definitiva de MySQL 5 por Michael Kofler Sugeriría las siguientes opciones:

--skip-opt
--single-transaction
--add-drop-table
--create-options
--quick
--extended-insert
--set-charset
--disable-keys

Además, no se menciona --order-by-primary Además, si está utilizando --databases , también debe usar --add-drop-database especialmente si se combina con esta respuesta Si está haciendo una copia de seguridad de bases de datos que están conectadas en diferentes redes, es posible que necesite usar --compress opción.

Entonces, un comando mysqldump (sin usar --compress , --databases o --add-

No se puede obtener un volcado constante sin bloquear las tablas. Acabo de hacer el mío durante un momento del día en que no se notan los 2 minutos que lleva hacer el volcado.

Una solución es hacer la replicación, luego hacer una copia de seguridad del esclavo en lugar del maestro. Si el esclavo no escribe durante la copia de seguridad, se pondrá al día más tarde. Esto también lo dejará con un servidor de respaldo en vivo en caso de que el maestro falle. Lo cual es bueno.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top