¿Cómo soltar todas las tablas en una base de datos MySQL sin soltar la base de datos?

12

Necesito soltar todas las tablas en una base de datos sin saber sus nombres de antemano. El procedimiento típico es colocar y volver a crear la base de datos, pero esta no es una opción. ¿Cuál es la mejor manera de hacerlo?

Angel Chiang
fuente
1
Probablemente debería haber preguntado esto de antemano, pero mejor tarde que nunca, supongo: ¿qué sistema operativo?
Jeff Snider el
Unix / Linux como SO.
Angel Chiang

Respuestas:

18

Hay un bash one-liner más simple usando mysqldump (del blog Thingy Ma Jig ).

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

Si recibes este error:

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

Intenta lo siguiente:

(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]

Ahora ignora las restricciones.

Angel Chiang
fuente
5

Debe usar las tablas de información_esquema para obtener los metadatos sobre la base de datos y luego soltar las tablas que se enumeran allí.

Joril
fuente
3

También puedes probar un script de shell rápido para hacerlo:

#!/bin/bash

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

Elimine echodespués de haber comprobado que va a hacer lo que espera.

Jeff Snider
fuente
Por cierto, ¿por qué escribes '$' antes del valor de IFS? ¿Por qué no se ve como "IFS = '\ n'"?
kolypto
@o_OTync El uso $''hace que bash interprete secuencias con barra invertida en lugar de tomarlas literalmente. '\n'contendría exactamente \ n, así como así, lo $IFSque entendería es dividir en \ y n caracteres. $'\n'contendría un carácter de nueva línea, 0x0D. Eche un vistazo aquí para obtener más información: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Jeff Snider el
Creo que esto es más simple que usar el INFORMATION_SCHEMA.
Angel Chiang
0

Hubo una entrada en el blog de Xaprb recientemente que cubre esto muy bien.

Incluye por qué usar INFORMATION_SCHEMAno siempre es algo bueno y hace referencia a una herramienta de esas personas encantadoras en Maatkit .

Pruebe lo siguiente con mk-find:

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

Si está satisfecho con los resultados, entonces:

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

Si tiene acceso al sistema de archivos, entonces solo rm -rf databasename/*:).

La declaración de la base de datos Drop hace lo mismo ... Extracto del manual de MySQL:

La instrucción DROP DATABASE elimina del directorio de base de datos dado aquellos archivos y directorios que MySQL puede crear durante el funcionamiento normal:

Jauzsika
fuente
2
Muy mala idea para cualquier configuración no trivial como MySQL no está esperando estos archivos a desaparecer repentinamente y podría estar en el medio de cualquier número de operaciones, transacciones, replicación, cerraduras ...
bot403
¿Consideraría revisar su respuesta para incluir los comandos y el procedimiento adecuados?
bot403