AFAICT quando você envia uma consulta ao MySQL de qualquer cliente, ele sempre bloqueia e espera que o servidor responda com sucesso ou falha.
Ao executar uma operação lenta, como adicionar um novo índice em uma tabela grande, isso pode ser um problema, pois deixa o cliente em estado ocioso, aguardando muito tempo pela resposta.
No meu caso, especificamente, quero enviar a solicitação da função AWS Lambda.
Encontrei algumas dicas aqui https://stackoverflow.com/a/41371255/202168 sobre como desanexar e colocar o mysql
processo do cliente em segundo plano, e também algumas sugestões de que o servidor MySQL provavelmente cancelará a solicitação se o cliente fechar a conexão. Mas o host onde o mysql
cliente foi lançado ainda precisa continuar em execução.
Parece que isso não pode ser tudo o que existe?
O PostgreSQL tem CREATE INDEX CONCURRENTLY
para esse propósito, ou seja, a consulta retorna rapidamente e a construção do índice continua no servidor.
Estou ciente de que o MySQL não suportaCREATE INDEX CONCURRENTLY
Mas é estranho que não exista um método de cliente sem bloqueio? (bem... existem clientes "assíncronos" ou "sem bloqueio", mas eles ainda precisam manter a mesma conexão aberta)
O que eu quero fazer é algo como:
- envie uma
ALTER TABLE ... ADD KEY
consulta - obtenha o ID do processo do lado do servidor para a consulta
- faça logoff do cliente mysql (e encerre minha execução do Lambda)
- o
ADD KEY
continua rodando no servidor - de um novo processo, pesquise periodicamente o ID do processo da minha consulta DDL e veja se ele foi concluído ou falhou
Existe alguma maneira de conseguir isso?
Pergunta relacionada ou alternativa: se eu simplesmente desconectar o cliente após enviar a consulta, a ADD KEY
execução continuará até a conclusão/falha em vez de ser cancelada?
O servidor é MySQL 8.0.35 em tabelas AWS RDS e InnoDB.
Sim esta correto. A consequência prática é que você não pode executar uma consulta de longa duração, incluindo DDL, a partir de um Lambda, pois um Lambda tem um limite de tempo de 15 minutos.
Você pode investigar usando o AWS Batch para executar tarefas de longa duração. Não tenho nenhuma experiência com isso, mas vi outros posts recomendando isso para casos em que um Lambda é muito breve.
Fora isso, seria melhor executar o DDL de um cliente em uma instância EC2, para que não haja tempo limite. Você pode usar qualquer instância do EC2 que tenha uma rota de rede para sua instância do MySQL. Poderia até estar em outra região, já que a largura de banda necessária para executar uma única instrução SQL é muito pequena.
Eu não acho. O servidor pode detectar que o cliente foi desconectado e encerrar a sessão e qualquer consulta que esteja em andamento. Talvez não sempre, mas eu não confiaria nisso.
Além disso, você deve permitir que o cliente seja executado até o fim, caso a operação DDL apresente um erro antes de terminar. Você deseja obter um resultado OK para saber se foi bem-sucedido ou não.