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-transaction
em 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>;