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