¿Cómo obtener un volcado correcto usando mysqldump y una sola transacción cuando se usa DDL al mismo tiempo?
-
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 queSELECT
realizado pormysqldump
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
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
--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.