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

9

Estou procurando uma solução de backup para meus servidores mysql e preciso do menor 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 aumentar, portanto, configurar uma replicação mestre / escravo não será uma boa ideia.

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

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

tounano
fonte

Respostas:

7

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

Se você pode efetuar login no mysql enquanto um mysqldump estiver em andamento, você verá algo assim:

SELECT /* SQL_NO_CACHE */ * FROM tblname

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

  • Todo banco de dados é despejado em ordem alfabética
  • Todas as tabelas despejadas por banco de dados são despejadas em ordem alfabética (independentemente do mecanismo de armazenamento)

Isso deve ser bom para uma instância do MySQL que não possui outra atividade de banco de dados. As tabelas InnoDB e MyISAM não se afetam.

O uso --single-transactionem uma Instância MySQL totalmente InnoDB cria um ponto de verificação e despeja todas as tabelas do mesmo ponto no tempo. Depois que uma tabela MyISAM é encontrada, todas as apostas estão desativadas. Isso poderia fazer com que todas as tabelas do InnoDB após o MyISAM fossem despejadas de um ponto no tempo diferente.

Para ter um dump point-in-time consistente para uma mistura de InnoDB e MyISAM, você tem opções

OPÇÃO 1

Reinicie o mysql para que ninguém mais possa fazer login via TCP / IP e, em seguida, 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 gravada, - única transação não é suficiente

Você terá que fazer 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 a conclusão do mysqldump, entre no mysql e faça show processlist;. Procure a consulta SELECT SLEEP(86400), encontre o ID do processo e executeKILL <procidnumn>;

RolandoMySQLDBA
fonte
5

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

Alex
fonte
Uau, obrigado por esta ótima ferramenta! Você conhece uma ferramenta que pode automatizar backups diários, semanais e mensais com o mydumper? Algo como "automysqlbackup", apenas com mydumper? Obrigado.
Tounano
0

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

Wasif
fonte