As tabelas InnoDB foram bloqueadas durante o mysqldump quando misturadas com o MyISAM?

9

Estou procurando uma solução de backup para meus servidores mysql e preciso de menos tempo de inatividade possível. Eu tenho o seguinte:

  • servidores MySQL
  • eles não são replicados
  • cada servidor representa seu próprio

Esse número pode crescer, portanto, configurar uma replicação mestre / escrava não será uma boa ideia.

A maneira mais fácil de backup, como eu vejo, seria usar o mysqldump com um software como o "automysqlbackup". Meus dados mais importantes usam o InnoDB. Minhas tabelas InnoDB são bem pesadas.

A pergunta é: Se eu fizer um mysqldump em todos os bancos de dados do servidor, ele bloqueará minhas tabelas Innodb?

    
por tounano 24.07.2012 / 09:49

3 respostas

7

mysqldumps com InnoDB e MyISAM juntos são tratados como mutuamente exclusivos. Aqui está o porquê:

Se você puder logar no mysql enquanto um mysqldump estiver em progresso, você verá algo como isto:

SELECT /* SQL_NO_CACHE */ * FROM tblname

Por padrão, o mysqldump fará o seguinte:

  • Todo banco de dados é despejado em ordem alfabética
  • Toda tabela despejada por banco de dados é despejada em ordem alfabética (independentemente do mecanismo de armazenamento)

Isso deve ser bom para uma Instância MySQL que não possui outra atividade de banco de dados. Tabelas InnoDB e tabelas MyISAM não afetam umas às outras.

Usando o --single-transaction contra um all-InnoDB O MySQL Instance cria um ponto de verificação e copia todas as tabelas do mesmo ponto no tempo. Quando uma tabela MyISAM é encontrada, todas as apostas estão desativadas. Isso poderia fazer com que todas as tabelas do InnoDB depois do MyISAM fossem despejadas de um ponto diferente no tempo.

Para ter um despejo consistente no ponto no tempo para uma mistura de InnoDB e MyISAM você tem opções lá

OPÇÃO # 1

Reinicie o mysql para que ninguém mais possa logar via TCP / IP e depois mysqldump

service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart 

OPÇÃO # 2

Se todas as tabelas MyISAM são apenas para leitura, apenas mysqldump usando --single-transaction

OPÇÃO # 3

Se alguma tabela MyISAM estiver sendo escrita, - a transação única não é suficiente

Você fará o seguinte:

mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql

Imediatamente após o mysqldump terminar, faça o login no mysql e faça show processlist; . Procure a consulta SELECT SLEEP(86400) , encontre o ID do processo e execute KILL <procidnumn>;

    
por 24.07.2012 / 20:06
5

mysqldump --single-transaction não bloqueia tabelas, mas não é garantido que as tabelas MyISAM tenham dumps consistentes com essa opção. É melhor usar mydumper , mydumper bloqueia as tabelas MyISAM e não bloqueia o InnoDB para que o despejo seja consistente.

    
por 24.07.2012 / 12:27
0

mysqldump bloqueia a tabela durante o despejo. Use instantâneos do LVM ou Xtrabackup .

    
por 24.07.2012 / 11:40