Ejecute MySQLDump sin bloquear tablas

437

Quiero copiar una base de datos de producción en vivo en mi base de datos de desarrollo local. ¿Hay alguna manera de hacer esto sin bloquear la base de datos de producción?

Actualmente estoy usando:

mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1

Pero está bloqueando cada mesa mientras se ejecuta.

Greg
fuente
Otra solución tardía: también puede usar Percona XtraBackup para volcar su base de datos de producción sin interrupción con respecto al procesamiento de transacciones. Permite hacer una copia de seguridad en caliente, es decir, no afecta a las actividades actuales. Ver aquí: percona.com/software/mysql-database/percona-xtrabackup (no tengo afiliación de ninguna manera con Percona.)
delx

Respuestas:

626

¿Funciona la --lock-tables=falseopción?

Según la página del manual , si está volcando tablas InnoDB puede usar la --single-transactionopción:

--lock-tables, -l

Lock all tables before dumping them. The tables are locked with READ
LOCAL to allow concurrent inserts in the case of MyISAM tables. For
transactional tables such as InnoDB and BDB, --single-transaction is
a much better option, because it does not need to lock the tables at
all.

Para innodb DB :

mysqldump --single-transaction=TRUE -u username -p DB
John Millikin
fuente
23
para innodb DB mysqldump --single-transaction = TRUE -u username -p DB
19
¿Qué pasa si tienes innodb y myisam?
CMCDragonkai
¿Está activado por defecto?
CMCDragonkai
obviamente en (es decir, bloqueado)?
evandrix
290

Esto es demasiado tarde, pero es bueno para cualquiera que esté buscando el tema. Si no es innoDB, y no le preocupa bloquearse mientras descarga, simplemente use la opción:

--lock-tables=false
Warren Krewenki
fuente
1
Gracias por la respuesta Warren, esto fue muy útil y funcionó de maravilla.
Gavin
77
usando '--lock-table = false --quick' usa la menor cantidad de recursos del servidor
SyntaxGoonoo
43
Pero debe preocuparse por bloquear las mesas. Si se escriben varias tablas mientras mysqldump se está ejecutando (y usa claves foráneas), su volcado puede ser inconsistente. No lo sabrá hasta que lo restaure y ejecute consultas JOIN en los datos inconsistentes. Es posible que los datos inconsistentes tarden un tiempo en descubrirse porque la aplicación utiliza JOINs, no Mysql (con tablas MyISAM); la restauración funcionará bien, mysql no le advertirá sobre las inconsistencias. Entonces: MyIsam -> siempre bloquea sus tablas. InnoDB -> uso --single-transaction.
Costa
12
@Costa No creo que el bloqueo de tablas sea suficiente para las tablas MyISAM. Si mysqldump bloquea las tablas entre consultas ejecutadas por la aplicación, entonces terminas con las mismas inconsistencias. La respuesta es aún más simple: MyISAM -> use InnoDB en su lugar.
cdhowie
@Costa definitivamente debería preocuparse por bloquear las tablas, pero solo si necesita un volcado constante . Hay algunos casos raros cuando no lo hace. Por ejemplo, un crudo crudo en el volcado de toda la base de datos (depuración): apuesto a que uno no quiere que los usuarios esperen unos 20 minutos para crear un volcado de la base de datos de producción (historia real). Si el punto es obtener el volcado no solo lo antes posible, sino también CONSISTENTE , uno debe volcar el esclavo replicado o usar instantáneas de nivel inferior (lvm, zfs, btrfs, etc.), teniendo en cuenta las FLUSH TABLES WITH READ LOCKcosas.
Alex Offshore
44

La respuesta varía según el motor de almacenamiento que esté utilizando. El escenario ideal es si está utilizando InnoDB. En ese caso, puede usar el --single-transactionindicador, que le dará una instantánea coherente de la base de datos en el momento en que comienza el volcado.

dvorak
fuente
35

--skip-add-locks me ayudó

Azamat Tokhtaev
fuente
2
o también --compacto para incluir bloqueos de omisión con otras optimizaciones.
ppostma1
77
Esto elimina las instrucciones LOCK TABLES y UNLOCK TABLES del archivo de volcado, no afecta el bloqueo durante la exportación.
dabest1
11
¡No, no es lo que estás buscando! Ver el comentario de dabest1. Esto no hace NADA para evitar que sus tablas se bloqueen mientras realiza un mysqldump. Esta NO es una respuesta a la pregunta.
orden
@dabest y @orrd son correctos: --skip-add-lockssolo haría que la restauración del volcado sea más rápida. Esta no es una respuesta correcta.
dr_
10

Honestamente, configuraría la replicación para esto, ya que si no bloquea las tablas obtendrá datos inconsistentes del volcado.

Si el volcado lleva más tiempo, las tablas que ya se volcaron podrían haber cambiado junto con alguna tabla que está a punto de ser volcada.

Entonces, bloquee las tablas o use la replicación.

Miguel
fuente
Todo este DB es de lectura casi completa, así que no me preocupa demasiado que cambie.
Greg
2
Este comentario es incorrecto. MVCC permite leer el estado consistente sin bloqueos en InnoDB.
Scott Hyndman
55
Si aún no tiene configurada la replicación, entonces necesita hacer un volcado para configurarla. El mismo problema existe.
Matt Connolly
3
Si aún no ha configurado la replicación, deberá bloquear las tablas para realizar el volcado para garantizar la integridad de los datos. Entonces es una
trampa
9

Esto es casi tan tarde en comparación con el tipo que dijo que llegó tarde a la respuesta original, pero en mi caso (MySQL a través de WAMP en Windows 7), tuve que usar:

--skip-lock-tables
dtbarne
fuente
Esto es lo que me funcionó para volcar información_esquema sin tener el error "Acceso denegado para el usuario 'debian-sys-maint' @ 'localhost' a la base de datos 'información_esquema' cuando utilizo LOCK TABLES"
Rui F Ribeiro
6
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db
naveen_sfx
fuente
Hasta el voto, este funcionó para mí, solo agregue los parámetros --skip-opt --single-transaction --max_allowed_packet = 1G
Steven Lizarazo
1
No recomiendo "--skip-opt" para este propósito. Eso hace mucho más de lo que pedía la pregunta original. Desactiva el modo rápido, no incluye el
juego de
3

Cuando use MySQL Workbench, en Exportación de datos, haga clic en Opciones avanzadas y desactive las opciones de "tablas de bloqueo".

ingrese la descripción de la imagen aquí

Samuel Diogo
fuente
1

Como ninguno de estos enfoques funcionó para mí, simplemente hice un:

mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]

Excluirá ambos LOCK TABLE <x>y los UNLOCK TABLEScomandos.

Nota: ¡ Esperemos que sus datos no contengan esa cadena!

augustomen
fuente
2
--skip-add-locks durante el volcado hace eso también
codewandler
0

Otra respuesta tardía:

Si está intentando hacer una copia en caliente de la base de datos del servidor (en un entorno Linux) y el motor de la base de datos de todas las tablas es MyISAM, debe usarlo mysqlhotcopy.

Según la documentación:

Utiliza FLUSH TABLES, LOCK TABLES y cp o scp para hacer una copia de seguridad de la base de datos. Es una forma rápida de hacer una copia de seguridad de la base de datos o tablas individuales, pero solo se puede ejecutar en la misma máquina donde se encuentran los directorios de la base de datos. mysqlhotcopy solo funciona para hacer copias de seguridad de las tablas MyISAM y ARCHIVE.

El LOCK TABLEStiempo depende del tiempo que el servidor puede copiar archivos MySQL (no hace un volcado).

Andrés Morales
fuente
0

Hoy, incluso me enfrenté al mismo problema, pero no tenía acceso a la línea de comandos, así que abrí el archivo sql en el editor de Bloc de notas y eliminé la línea de abajo de las tablas

LOCK TABLES `yourtable name` WRITE;

luego importé a mi entorno de desarrollo. Funciona bien. espero que ayude a alguien

iCoders
fuente