Execute o MySQLDump sem travar tabelas


437

Quero copiar um banco de dados de produção ao vivo no meu banco de dados de desenvolvimento local. Existe uma maneira de fazer isso sem bloquear o banco de dados de produção?

Atualmente, estou usando:

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

Mas está bloqueando cada tabela enquanto é executada.


Outra solução tardia: você também pode usar o Percona XtraBackup para despejar seu banco de dados de produção sem interrupção em relação ao processamento de transações. Ele permite fazer um backup quente, ou seja, não afeta as atividades atuais. Veja aqui: percona.com/software/mysql-database/percona-xtrabackup (. Eu não tenho nenhuma filiação de alguma forma com Percona)
Delx

Respostas:


625

A --lock-tables=falseopção funciona?

De acordo com a página do manual , se você estiver descartando tabelas do InnoDB, poderá usar a --single-transactionopção:

--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 o innodb DB :

mysqldump --single-transaction=TRUE -u username -p DB

23
para mysodldump do banco de dados mysqldump - único-transação = TRUE -u nome de usuário -p DB
AMB

19
E se você tiver innodb e myisam?
CMCDragonkai

Isso está ativado por padrão?
CMCDragonkai

obviamente ligado (ie. bloqueado)?
evandrix 16/04

290

Isso é muito tarde, mas bom para quem está pesquisando o tópico. Se você não está no innoDB e não está preocupado com o bloqueio enquanto despeja, basta usar a opção:

--lock-tables=false

1
Obrigado pela resposta Warren, isso foi muito útil e funcionou como um encanto.
Gavin

7
usando '--lock-table = false --quick' usa menos recursos do servidor
SyntaxGoonoo 14/03

43
Mas você deve estar preocupado com o bloqueio de mesas. Se várias tabelas forem gravadas enquanto o mysqldump estiver em execução (e você usar chaves estrangeiras), seu dump poderá ser inconsistente. Você não saberá até restaurá-lo e executar consultas JOIN nos dados inconsistentes. Pode demorar um pouco para que os dados inconsistentes sejam descobertos porque os JOINs são usados ​​pelo seu aplicativo e não pelo Mysql (com tabelas MyISAM); a restauração funcionará perfeitamente, o mysql não avisará sobre as inconsistências. Então: MyIsam -> sempre bloqueie suas tabelas. InnoDB -> uso --single-transaction.
Costa

12
@ Costa Eu não acho que bloquear tabelas seja suficiente para tabelas MyISAM. Se o mysqldump bloquear as tabelas entre as consultas executadas pelo aplicativo, você terminará com as mesmas inconsistências. A resposta é ainda mais simples: MyISAM -> use o InnoDB.
Cdhowie

@ Costa, você definitivamente deve se preocupar com o bloqueio de tabelas, mas apenas se precisar de um despejo consistente . Existem alguns casos raros em que você não. Por exemplo, um fgrep bruto no dump do banco de dados (depuração): aposto que não queremos que os usuários esperem ~ 20 minutos para criar o dump do banco de dados de produção (história verdadeira). Se o objetivo é fazer o dump não apenas o mais rápido possível, mas também CONSISTENTE , deve-se fazer dump do slave replicado ou usar snapshotting de nível inferior (lvm, zfs, btrfs, etc.), mantendo em mente as FLUSH TABLES WITH READ LOCKcoisas.
Alex Offshore

44

A resposta varia dependendo do mecanismo de armazenamento que você está usando. O cenário ideal é se você estiver usando o InnoDB. Nesse caso, você pode usar o --single-transactionsinalizador, que fornecerá uma captura instantânea coerente do banco de dados no momento em que o despejo começa.


35

--skip-add-locks ajudou para mim


2
ou também --compact para incluir ignorar bloqueios com outras otimizações.
ppostma1

77
Isso remove as instruções LOCK TABLES e UNLOCK TABLES do arquivo de despejo, não afeta o bloqueio durante a exportação.
precisa saber é o seguinte

11
Não, não é o que você está procurando! Veja o comentário de dabest1. Isso não faz nada para impedir que suas tabelas fiquem bloqueadas enquanto você faz um mysqldump. Esta NÃO é uma resposta para a pergunta.
orrd 28/07

@dabest e @orrd estão corretos: --skip-add-lockstornaria a restauração do dump mais rápida. Esta não é uma resposta correta.
Dr_



10

Honestamente, eu configuraria a replicação para isso, como se você não bloqueie tabelas, obterá dados inconsistentes do dump.

Se o despejo demorar mais tempo, as tabelas que já foram despejadas podem ter sido alteradas, juntamente com alguma tabela que está prestes a ser despejada.

Portanto, bloqueie as tabelas ou use replicação.


Todo esse banco de dados é quase totalmente somente leitura, então não estou muito preocupado com a mudança.
187 Greg Greg

2
Este comentário está incorreto. O MVCC permite a leitura de um estado consistente sem bloqueios no InnoDB.
Scott Hyndman

5
Se você ainda não possui a replicação configurada, precisará fazer um dump para configurá-la. O mesmo problema existe.
Matt Connolly

3
Se você ainda não possui a replicação configurada, será necessário bloquear as tabelas para fazer o despejo para garantir a integridade dos dados. Portanto, é uma pegadinha 22.
JordanC 6/08/14

9

Isso é tão tarde em comparação com o cara que disse que estava atrasado quanto a resposta original, mas no meu caso (MySQL via WAMP no Windows 7), eu tive que usar:

--skip-lock-tables

Isto é o que funcionou para eu despejar information_schema sem ter o erro "Acesso negado para o usuário 'debian-sys-maint' @ 'localhost' no banco de dados 'information_schema' ao usar 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

Voto a favor, este funcionou para mim, basta adicionar os parâmetros --skip-opt - única transação - max_allowed_packet = 1G #
9265 Steven Lizarazo 18/14

1
Eu não recomendo "--skip-opt" para esse fim. Isso faz muito mais do que o que a pergunta original pediu. Desativa o modo rápido, não inclui o conjunto de caracteres, etc. etc.
orrd 28/07

3

Ao usar o MySQL Workbench, na Data Export, clique em Opções Avançadas e desmarque as opções "lock-tables".

insira a descrição da imagem aqui


1

Como nenhuma dessas abordagens funcionou para mim, eu simplesmente fiz:

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

Ele excluirá os comandos LOCK TABLE <x>e UNLOCK TABLES.

Nota: Espero que seus dados não contenham essa string!


2
--skip-add-bloqueios durante o despejo faz isso também
codewandler


0

Outra resposta tardia:

Se você está tentando fazer uma cópia quente do banco de dados do servidor (em um ambiente Linux) e o mecanismo de banco de dados de todas as tabelas é MyISAM, você deve usar mysqlhotcopy.

De acordo com a documentação:

Ele usa FLUSH TABLES, LOCK TABLES e cp ou scp para fazer um backup do banco de dados. É uma maneira rápida de fazer um backup do banco de dados ou de tabelas únicas, mas pode ser executado apenas na mesma máquina em que os diretórios do banco de dados estão localizados. O mysqlhotcopy funciona apenas para fazer backup das tabelas MyISAM e ARCHIVE.

O LOCK TABLEStempo depende do tempo em que o servidor pode copiar arquivos MySQL (não faz um despejo).


0

Hoje mesmo eu enfrentei o mesmo problema, mas não tinha acesso à linha de comando.

LOCK TABLES `yourtable name` WRITE;

então eu importei para o meu ambiente de desenvolvimento. espero que ajude alguém

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.