Backup sincronizado de dois bancos de dados

2

Eu tenho um sistema que precisa de dois bancos de dados para funcionar. Eu preciso de um script para fazer backup de ambos os bancos de dados em um determinado ponto do tempo. Eu preciso de bancos de dados para estar em sincronia, então eu preciso ter certeza de que o backup não permite alterações em um dos bancos de dados quando o outro está sendo feito o backup.

mysqldump db1 db2 > db1_db2.sql

É o código acima apropriado para isso. Será que vai bloquear os dois bancos de dados para o tempo de backup, então eu vou ter backup sincronizado? Qual é a maneira correta de conseguir isso? Como eu faria isso, mas com arquivo separado para cada banco de dados?

EDITAR:

A maioria das tabelas usa o mecanismo InnoDB, mas há poucas tabelas menos importantes que usam o mecanismo de arquivamento.

    
por rumburak 25.06.2014 / 19:01

2 respostas

1

Sua melhor opção é a seguinte

mysqldump --single-transaction --databases db1 db2 > db1_db2.sql

A opção --single-transaction cria um ponto janela no tempo para todos os dados no dump. A única restrição é que você não execute nenhuma DDL

Contanto que você não execute nenhum destes durante a duração do mysqldump, o db1 e o db2 serão um instantâneo perfeito a partir do momento em que o mysqldump for iniciado.

Suas tabelas não-InnoDB devem estar bem, desde que você não faça nada para elas: sem DDL, sem INSERTs, sem UPDATEs, sem DELETEs.

ATUALIZAÇÃO 2014-06-26 19:43 EDT

Você perguntou

Are single-transaction and lock-all-tables mutually exclusive? Is one of them implied\default?

Diretamente da documentação do MySQL em - transação única

The --single-transaction option and the --lock-tables option are mutually exclusive because LOCK TABLES causes any pending transactions to be committed implicitly.

Sim, eles são mutuamente exclusivos.

Diretamente da documentação do MySQL em - bloqueio todas as tabelas

Lock all tables across all databases. This is achieved by acquiring a global read lock for the duration of the whole dump. This option automatically turns off --single-transaction and --lock-tables.

Assim, lock-all-tables desativará --single-transaction

CAVEAT: Tenha em mente que FLUSH TABLES WITH READ LOCK; e todos os outros mecanismos de travamento pesados (tudo ou nada) não impedirão completamente que o InnoDB faça gravações no espaço de tabela do sistema. escrevi sobre antes no DBA StackExchange .

Aqui está um mapa do InnoDB para você visualizar as outras partes móveis do InnoDB:

Porfavor,leia Como FLUSH TABLES WITH READ LOCK trabalha com o Innodb Tables (MySQL Performance Blog) sobre outros efeitos nocivos de travar todas as tabelas contra o InnoDB.

    
por 26.06.2014 / 23:30
1

Dê uma olhada nesta URL para ter uma visão geral dos backups do MySQL.

link

Você precisa adicionar o seguinte argumento para bloquear os dois bancos de dados.

- lock-all-tables, -x

"Bloqueie todas as tabelas em todos os bancos de dados. Isso é obtido com a aquisição de um bloqueio de leitura global durante todo o despejo".

Seu comando deve ser como mostrado abaixo.

mysqldump -x --databases db1 db2

Você também pode considerar replicar seus bancos de dados MySQL para um servidor escravo e fazer backup do escravo.

    
por 25.06.2014 / 19:26