É possível descartar todas as tabelas vazias do meu enorme banco de dados (mysql)?
Estou procurando um comando sql para remover automaticamente todas essas tabelas vazias.
Atualmente, tenho 305 tabelas no meu conjunto de dados e cerca de 30% delas são tabelas vazias antigas, que não serão usadas no meu novo aplicativo.
Só para esclarecer; Todas as tabelas são do tipo = MyISAM
Respostas:
A idéia provavelmente seria procurar as tabelas vazias usando
INFORMATION_SCHEMA.TABLES
Em seguida, você poderá produzir uma consulta SQL com
Rápido e um pouco sujo, mas deve realmente funcionar.
fonte
Como todas as tabelas são MyISAM, isso facilita minha expressão.
Primeiro, você precisa consultar o INFORMATION_SCHEMA para as tabelas que possuem zero linhas:
Em seguida, formule a consulta para descartar as tabelas vazias:
Agora, despeje os comandos em um arquivo de texto SQL externo.
Veja o conteúdo com um dos seguintes
less DropTables.sql
cat DropTables.sql
Se você estiver satisfeito com seu conteúdo, execute o script:
ou faça o login no mysql e execute-o assim:
De uma chance !!!
CAVEAT : Esta técnica funciona apenas com a tabela MyISAM porque a contagem de linhas de uma tabela MyISAM é fisicamente armazenada nas
.MYD
tabelas. A tabela de metadados INFORMATION_SCHEMA.TABLES está sempre lendo isso e atualizando. NÃO TENTE ISTO COM INNODB !!!ATUALIZAÇÃO 05-02-2014 11:46 EST
Há uma razão pela qual eu excluí
('information_schema','mysql','performance_schema')
O
mysql
esquema possui tabelas vazias. AlgunsMyISAM
, algunsInnoDB
, algunsCSV
.Por exemplo, aqui estão minhas tabelas no esquema mysql para MySQL 5.6.15 na minha área de trabalho
Se algumas dessas mesas estavam a desaparecer (como
columns_priv
,proc_priv
,tables_priv
, etc.), o mecanismo de subvenção pode não funcionar corretamente ou pode causar mysqld não iniciar. Você também não quer bater o mysql.proc, pois é o lar físico dos Procedimentos Armazenados. Outros mecanismos podem não funcionar, caso você queira usá-los, como CrashSafe Replication, usando as tabelas InnoDB dentro do esquema mysql, ou se desejar inserir informações de fuso horário.ATUALIZAÇÃO 05-02-2014 12:36 EST
Gostaria de felicitar Tom Desp por sua resposta por um motivo específico: sua sintaxe pode ser eliminada sem o uso de um script externo . Usando sua ideia, deixe-me capturar o comando DROP TABLE em uma variável definida pelo usuário.
Se a saída do
SELECT @DropCommand;
estiver correta, execute o comando da seguinte maneira:Isso elimina duas coisas:
fonte