Est-il possible de supprimer toutes les tables vides de mon énorme base de données (mysql)?
Je recherche une commande sql pour supprimer automatiquement toutes ces tables vides.
Actuellement, j'ai 305 tables dans mon jeu de données, et environ 30% d'entre elles sont d'anciennes tables vides, qui ne seront pas utilisées dans ma nouvelle application.
Juste pour clarifier; Toutes les tables sont de type = MyISAM
Réponses:
L'idée serait probablement de chercher les tables vides en utilisant
INFORMATION_SCHEMA.TABLES
Ensuite, vous pourrez peut-être produire une requête SQL avec
Rapide et un peu sale, mais devrait en fait fonctionner.
la source
Étant donné que toutes les tables sont MyISAM, cela rend ma réponse plus facile à exprimer.
Tout d'abord, vous devez interroger INFORMATION_SCHEMA pour les tables qui n'ont aucune ligne:
Ensuite, formulez la requête pour supprimer les tables vides:
Maintenant, sauvegardez les commandes dans un fichier texte SQL externe.
Regardez le contenu avec l'un des éléments suivants
less DropTables.sql
cat DropTables.sql
Si vous êtes satisfait de son contenu, exécutez le script:
ou connectez-vous à mysql et exécutez-le comme ceci:
Essaie !!!
CAVEAT : cette technique ne fonctionne qu'avec la table MyISAM car le nombre de lignes d'une table MyISAM est physiquement stocké dans
.MYD
les tables. La table de métadonnées INFORMATION_SCHEMA.TABLES est toujours en train de lire et de mettre à jour. N'ESSAYEZ PAS CELA AVEC INNODB !!!MISE À JOUR 2014-02-05 11:46 EST
Il y a une raison pour laquelle j'ai exclu
('information_schema','mysql','performance_schema')
Le
mysql
schéma contient des tables vides. CertainsMyISAM
, certainsInnoDB
, certainsCSV
.Par exemple, voici mes tables dans le schéma mysql pour MySQL 5.6.15 sur mon bureau
Si certains de ces tableaux devaient disparaître (comme
columns_priv
,proc_priv
,tables_priv
, etc.), le mécanisme de subvention peut ne pas fonctionner correctement ou peut causer mysqld de ne pas démarrer. Vous ne voulez pas non plus casser le fichier mysql.proc car il s'agit de la base physique des procédures stockées. D'autres mécanismes peuvent ne pas fonctionner si vous souhaitez les utiliser, comme la réplication CrashSafe en utilisant les tables InnoDB à l'intérieur du schéma mysql, ou si vous souhaitez insérer des informations de fuseau horaire.MISE À JOUR 2014-02-05 12:36 EST
Je tiens à féliciter Tom Desp pour sa réponse pour une raison spécifique: sa syntaxe pourrait faire le drop sans utiliser de script externe . En utilisant son idée, permettez-moi de capturer la commande DROP TABLE dans une variable définie par l'utilisateur.
Si la sortie du
SELECT @DropCommand;
est correcte, exécutez la commande comme ceci:Cela élimine deux choses:
la source