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?
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?
Respuestas:
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.
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í.
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 echo
después de haber comprobado que va a hacer lo que espera.
$''
hace que bash interprete secuencias con barra invertida en lugar de tomarlas literalmente. '\n'
contendría exactamente \ n, así como así, lo $IFS
que 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 .
Hubo una entrada en el blog de Xaprb recientemente que cubre esto muy bien.
Incluye por qué usar INFORMATION_SCHEMA
no 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'
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: