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.