single - mysqldump--no-data
Ejecutar MySQLDump sin bloquear tablas (13)
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.
¿ --lock-tables=false
la --lock-tables=false
?
De acuerdo con la página del manual , si está volcando tablas InnoDB puede usar la opción --single-transaction
:
--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
Como ninguno de estos enfoques funcionó para mí, simplemente hice una:
mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]
UNLOCK TABLES
comandos LOCK TABLE <x>
y UNLOCK TABLES
.
Nota: ¡ Esperemos que sus datos no contengan esa cadena!
Debido a https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_lock-tables :
Algunas opciones, como --opt (que está habilitada de manera predeterminada), habilitan automáticamente --lock-tables. Si desea anular esto, use --skip-lock-tables al final de la lista de opciones.
Esto es casi tan tarde en comparación con el tipo que dijo que llegó tarde como lo fue a la respuesta original, pero en mi caso (MySQL a través de WAMP en Windows 7), tuve que usar:
--skip-lock-tables
Esto es demasiado tarde, pero bueno para cualquiera que esté buscando el tema. Si no está en noDB y no está preocupado por el bloqueo mientras realiza el volcado, simplemente use la opción:
--lock-tables=false
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 estaban volcadas podrían haber cambiado junto con alguna tabla que está a punto de ser volcada.
Entonces, o bien bloquear las tablas o usar la replicación.
Hoy, incluso tuve el mismo problema, pero no tuve acceso a la línea de comandos. Así que abrí el archivo sql en el editor de Bloc de notas y lo eliminé debajo de la línea de las tablas
LOCK TABLES `yourtable name` WRITE;
Luego lo importé a mi entorno de desarrollo. Funciona bien. espero que ayude a alguien
La respuesta varía según el motor de almacenamiento que estés usando. El escenario ideal es si estás usando InnoDB. En ese caso, puede utilizar el --single-transaction
, que le dará una instantánea coherente de la base de datos en el momento en que comienza el volcado.
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 usar 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 realizar una copia de seguridad de la base de datos o tablas individuales, pero solo puede ejecutarse en la misma máquina donde se encuentran los directorios de la base de datos. mysqlhotcopy funciona solo para realizar copias de seguridad de tablas MyISAM y ARCHIVE.
El tiempo de LOCK TABLES
depende de la hora en que el servidor pueda copiar los archivos MySQL (no hace un volcado).
Para tablas InnoDB use --single-transaction
"descarga el estado consistente de la base de datos en el momento en que se emitió BEGIN sin bloquear ninguna aplicación" MySQL DOCS
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction
Para volcar tablas grandes, debe combinar la opción --single-transaction con --quick.
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction
--skip-add-locks
me ayudó
mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db | mysql -u root --password=xxx -h localhost db