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?


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.


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.


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.


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'

-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:


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.