Editar:
O problema é confirmado no MariaDB 10.0.8 e 5.5.36 , e confirmado não existir no MySQL 5.5.36, aparentemente devido a diferenças de implementação no otimizador de consulta.
O texto abaixo é, portanto, ajustado de acordo com as recomendações de Elena Stepanova do MariaDB.
Eu reproduzi esse comportamento no MariaDB 10.0.8 no wheezy do Debian. Eu não consegui reproduzi-lo no MySQL 5.5.36.
Se você executar mysqldump -uroot
ou qualquer usuário com privilégios totais, isso gerará uma consulta que fará com que o mysqld do MariaDB verifique o superdiretório do banco de dados e os subdiretórios todos e todos Metadados de tabela para todas tabelas nesses subdiretórios.
Se você executar mysqldump com privilégios de usuário específicos, e estes forem concedidos para acesso a apenas um ou dois bancos de dados, o mysqldump é tão rápido quanto você esperaria que fosse.
Existem duas soluções possíveis.
A solução alternativa ainda está usando um usuário super privilegiado com acesso a todos os bancos de dados, mas acelera o processo desativando o recurso semijoin.
A solução alternativa B cria um usuário de backup que recebe acesso a cada banco de dados, estreitando o conjunto de privilégios.
Qual método funciona melhor para você depende de como você está confortável usando um usuário super privilegiado para acessar todos os bancos de dados, quantos bancos de dados você tem, quantos usuários você tem acesso a vários bancos de dados, quantos bancos de dados têm dependências entre eles, e como seu banco de dados está sendo acessado enquanto você faz seus despejos de banco de dados.
A solução alternativa A é provavelmente a mais rápida, contornando B ligeiramente mais devagar.
Solução alternativa A - usuário super privilegiado, semijoin desativado
Por favor, note que desabilitar semijoin pode afetar o desempenho de outras consultas. Embora possa ser configurado em my.cnf, você provavelmente não deveria.
-
Desativar semijoin temporariamente:
SET GLOBAL optimizer_switch='semijoin=off';
-
Descarregar o banco de dados, por exemplo como o usuário "root":
mysqldump db -uroot -prootpassword | gzip > DB.sql.gz
-
Ativar semijoin:
SET GLOBAL optimizer_switch='semijoin=on';
Solução alternativa B - usuário de backup separado
-
Conceda privilégios totais ao usuário de backup ao banco de dados:
GRANT USAGE ON 'db'.* TO 'backup'@'%' IDENTIFIED BY 'backuppassword'; GRANT SELECT, LOCK TABLES ON 'mysql'.* TO 'backup'@'%'; GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON 'db'.* TO 'backup'@'%'; FLUSH PRIVILEGES;
-
Descarregar o banco de dados como esse usuário:
mysqldump db -ubackup -pbackuppassword | gzip > DB.sql.gz
-
Revogar os privilégios:
REVOKE ALL PRIVILEGES ON 'db'.* FROM 'backup'@'%'; REVOKE ALL PRIVILEGES ON 'mysql'.* FROM 'backup'@'%'; FLUSH PRIVILEGES;
Se cada banco de dados pertencer a um usuário separado e você souber as senhas desses usuários, você poderá usá-las em vez do usuário de backup e sua senha e, portanto, ignorar completamente as etapas 1 e 3.
BTW: Também relatei isso para a equipe de desenvolvimento do MariaDB, se você tiver alguma coisa útil para contribuir, sinta-se à vontade para acompanhar isso aqui: