Aqui estão as coisas que não posso mudar: Temos uma replicação myISAM do mySQL executando um mestre e alguns escravos. Um escravo está sendo usado para backups noturnos usando mysqldump. Os backups estão usando travas pesadas forçando seu slave a "envelhecer" em relação ao master. mysqldump está se conectando como root despejando todos os bancos de dados enquanto todas as outras conexões estão usando um usuário não-SUPER por banco de dados. Os dumps são iniciados usando um script de shell simples em um servidor de backup dedicado.
Aqui está o problema: gostaria de detectar se um backup está em execução ou não enquanto estou conectado como um usuário "normal" a um dos bancos de dados em execução no servidor que está sendo feito o backup. Os Cronjobs devem ser capazes de reagir ao backup em execução saindo antecipadamente ou processando apenas os trabalhos necessários realmente importantes que não podem esperar até que o backup seja concluído. O servidor que executa o script de backup não tem conexões com os servidores da web, seu único ponto comum é o servidor mysql. O script de backup pode fazer algumas coisas para sinalizar o servidor como "atualmente executando um backup". Prefiro definir algum tipo de "variável de ambiente global do lado do servidor visível para todos os usuários" para ignorar apenas o único escravo executando o backup, mas também seria bom simplesmente saber que um backup está sendo executado naquele banco de dados ou cadeia de replicação .
Tentei criar uma tabela temporária no início do backup (existente = o backup está em execução, não existente = nenhum backup em execução), mas as tabelas temporárias aparecem apenas para a conexão que a criou originalmente (como esperado). Pesquisei no Google se um usuário não SUPER poderia obter permissão para ver o SHOW PROCESSLIST de todas as conexões, incluindo outros usuários e root (qualquer conexão do servidor de backup = o backup está em execução) - mas sem sorte. Dar SUPER a todos os usuários do banco de dados não é uma opção.
Alguma sugestão?
Obrigado por ler (e responder).
Sua única esperança neste cenário é ter o privilégio PROCESS.
O privilégio SUPER permite que você mate processos. Naturalmente, você não quer isso. Por outro lado, o privilégio PROCESS permite que você veja a lista de processos.
De acordo com a documentação do MySQL sobre o privilégio PROCESS
OK, grande coisa. O Privilégio PROCESS permite que você veja a Lista de Processos. Como isso ajuda?
Você pode detectar rapidamente um mysqldump em andamento ao executar
SHOW PROCESSLIST;
e ver um padrão como este no campo Info:Se você tiver o privilégio PROCESS e estiver executando o MySQL 5.1+, poderá executar esta consulta:
Aqui está um exemplo de saída:
Tudo o que você precisa fazer é consultar esse número. Se você obtiver um diferente de zero, mysqldump deve estar em execução.
De uma chance !!!
Faça com que seu script de backup configure um valor em alguma tabela separada antes do início do backup e redefina-o quando terminar. Em seguida, você pode apenas consultar esse valor.
Você pode querer ler sobre como usar instantâneos LVM para fazer backup de suas tabelas myisam e minimizar o tempo de inatividade da replicação para alguns minutos:
http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/
Se você conseguir migrar para o innodb, poderá usar o xtrabackup e fazer backups ao vivo com quase nenhuma interferência perceptível.
Editar
Pessoalmente, estávamos usando instantâneos LVM para uma instância de aproximadamente 220 GB abrangendo 3 bancos de dados. A sobrecarga do instantâneo LVM e a carga nos discos causaram atrasos de replicação de até 8.000 segundos todas as noites. Não havia travamento, mas os pobres disquetes simplesmente não conseguiam acompanhar a pesada carga de replicação e o backup. Tivemos que mudar para o fusion io. Isso certamente é bom - mas muito caro.