Comment supprimer toutes les tables d'une base de données MySQL sans supprimer la base de données?

12

J'ai besoin de supprimer toutes les tables d'une base de données sans connaître au préalable leurs noms. La procédure typique consiste à supprimer puis à recréer la base de données, mais ce n'est pas une option. Quelle est la meilleure façon de procéder?

Angel Chiang
la source
1
J'aurais probablement dû demander cela à l'avance, mais mieux vaut tard que jamais, je suppose: quel système d'exploitation?
Jeff Snider,
Unix / Linux comme OS.
Angel Chiang

Réponses:

18

Il existe une ligne simple bash utilisant mysqldump (du Thingy Ma Jig Blog ).

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

Si vous obtenez cette erreur:

ERROR 1217 (23000) at line 1: Cannot delete or update a parent row: 
    a foreign key constraint fails

Essayez ce qui suit:

(echo 'SET foreign_key_checks = 0;'; 
 (mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | 
     grep ^DROP); 
 echo 'SET foreign_key_checks = 1;') | \
    mysql -u[USERNAME] -p[PASSWORD] -b [DATABASE]

Maintenant, il ignore les contraintes.

Angel Chiang
la source
5

Vous devez utiliser les tables information_schema pour extraire les métadonnées de la base de données, puis supprimer les tables qui y sont répertoriées.

Joril
la source
3

Vous pouvez également essayer un script shell rapide pour le faire:

#!/bin/bash

IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
    echo mysql <databaseName> -e "drop table $table"
done

Supprimer echoaprès avoir vérifié qu'il fera ce que vous attendez.

Jeff Snider
la source
Au fait, pourquoi écrivez-vous «$» avant la valeur d'IFS? Pourquoi ne ressemble-t-il pas à "IFS = '\ n'"?
kolypto
@o_OTync L'utilisation de $''bash pour interpréter les séquences avec barre oblique inverse au lieu de les prendre littéralement. '\n'contiendrait exactement \ n, juste comme ça, qui $IFScomprendrait la division en \ et n caractères. $'\n'contiendrait un caractère de nouvelle ligne, 0x0D. Jetez un œil ici pour plus d'informations: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Jeff Snider
Je pense que c'est plus simple que d'utiliser le INFORMATION_SCHEMA.
Angel Chiang
0

Il y a eu récemment une entrée sur le blog Xaprb qui couvre bien cela.

Il comprend pourquoi l'utilisation INFORMATION_SCHEMAn'est pas toujours une bonne chose et fait référence à un outil de ces charmantes personnes chez Maatkit .

Essayez ce qui suit avec mk-find:

mk-find '<database>' --printf 'DROP TABLE %D.%N'

Si vous êtes satisfait des résultats, alors:

mk-find '<database>' --exec 'DROP TABLE %D.%N'
Dan Carley
la source
-2

Si vous avez accès au système de fichiers, alors juste rm -rf databasename/*:).

L'instruction Drop database fait de même ... Extrait du manuel MySQL:

L'instruction DROP DATABASE supprime du répertoire de base de données donné les fichiers et répertoires que MySQL lui-même peut créer pendant le fonctionnement normal:

Jauzsika
la source
2
Extrêmement mauvaise idée pour toute configuration non triviale car MySQL ne s'attend pas à ce que ces fichiers disparaissent soudainement et pourraient être au milieu d'un certain nombre d'opérations, de transactions, de réplication, de verrous ...
bot403
Envisageriez-vous de réviser votre réponse pour y inclure les commandes et la procédure appropriées?
bot403