Devo eliminare tutte le tabelle in un database senza conoscerne prima i nomi. La procedura tipica è eliminare e quindi ricreare il database ma questa non è un'opzione. Qual'è il miglior modo di farlo?
Devo eliminare tutte le tabelle in un database senza conoscerne prima i nomi. La procedura tipica è eliminare e quindi ricreare il database ma questa non è un'opzione. Qual'è il miglior modo di farlo?
Risposte:
Esiste un semplice bash one-liner usando mysqldump (dal blog di Thingy Ma Jig ).
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]
Se ricevi questo errore:
ERROR 1217 (23000) at line 1: Cannot delete or update a parent row:
a foreign key constraint fails
Prova quanto segue:
(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]
Ora ignora i vincoli.
È necessario utilizzare le tabelle information_schema per recuperare i metadati sul database, quindi eliminare le tabelle elencate lì.
Puoi provare anche uno script di shell rapido per farlo:
#!/bin/bash
IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
echo mysql <databaseName> -e "drop table $table"
done
Rimuovi echo
dopo aver verificato che farà ciò che ti aspetti.
$''
fa sì che bash interpreti le sequenze rovesciate invece di prenderle alla lettera. '\n'
conterrebbe esattamente \ n, proprio come quello, che $IFS
comprenderebbe la divisione in \ e n caratteri. $'\n'
conterrà un carattere di nuova riga, 0x0D. Dai un'occhiata qui per maggiori informazioni: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Recentemente sul blog di Xaprb è stata inserita una voce che tratta questo argomento in modo chiaro .
Comprende perché l'uso INFORMATION_SCHEMA
non è sempre una buona cosa e fa riferimento a uno strumento di quelle persone adorabili di Maatkit .
Prova quanto segue con mk-find
:
mk-find '<database>' --printf 'DROP TABLE %D.%N'
Se sei soddisfatto dei risultati, allora:
mk-find '<database>' --exec 'DROP TABLE %D.%N'
Se hai accesso al filesystem, allora rm -rf databasename/*
:).
L'istruzione Drop database fa lo stesso ... Estratto dal manuale di MySQL:
L'istruzione DROP DATABASE rimuove dalla directory del database indicata i file e le directory che MySQL stesso può creare durante il normale funzionamento: