Respostas:
Se uma tabela do InnoDB estiver sendo acessada via SELECT ou DML (INSERT, UPDATE, DELETE), você deverá esperar, com razão, um bloqueio de metadados.
De acordo com a documentação do MySQL sobre o bloqueio de MetaData :
Para garantir a serialização da transação, o servidor não deve permitir que uma sessão execute uma instrução DDL (Data Definition Language) em uma tabela usada em uma transação incompleta em outra sessão. O servidor consegue isso adquirindo bloqueios de metadados em tabelas usadas em uma transação e adiando a liberação desses bloqueios até o término da transação. Um bloqueio de metadados em uma tabela impede alterações na estrutura da tabela. Essa abordagem de bloqueio implica que uma tabela que está sendo usada por uma transação em uma sessão não pode ser usada em instruções DDL por outras sessões até que a transação termine.
Dito isto, você deve determinar se outra sessão de banco de dados está ou não mantendo bloqueios na tabela. Se essa sessão for uma transação incompleta, é possível que ocorra o atraso.
Se você simplesmente precisar do espaço em disco de volta rapidamente, poderá executar TRUNCATE TABLE
.
Tente renomear a tabela antes de tentar descartá-la da seguinte maneira:
ALTER TABLE mydb.mytable RENAME mydb.mytabletodrop;
TRUNCATE TABLE mydb.mytabletodrop;
DROP TABLE mydb.mytabletodrop;
foo
. Depois que todas essas conexões forem feitas, o ALTER TABLE
procedimento poderá prosseguir.
Você deve descobrir qual consulta causa um bloqueio de transação executando:
SHOW ENGINE INNODB STATUS
e ver uma seção chamada TRANSACTION
. Mais tarde, você deve matar essa consulta para descartar um banco de dados.
Referência: como localizo qual transação está causando o estado "Aguardando bloqueio de metadados da tabela"?
foo
renomeaçãofootodrop