Muszę upuścić wszystkie tabele w bazie danych, nie znając wcześniej ich nazw. Typową procedurą jest upuszczenie, a następnie odtworzenie bazy danych, ale nie jest to opcja. Jak najlepiej to zrobić?
Muszę upuścić wszystkie tabele w bazie danych, nie znając wcześniej ich nazw. Typową procedurą jest upuszczenie, a następnie odtworzenie bazy danych, ale nie jest to opcja. Jak najlepiej to zrobić?
Odpowiedzi:
Istnieje prostszy bash one-liner za pomocą mysqldump (z Thingy Ma Jig Blog ).
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]
Jeśli pojawia się ten błąd:
ERROR 1217 (23000) at line 1: Cannot delete or update a parent row:
a foreign key constraint fails
Spróbuj wykonać następujące czynności:
(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]
Teraz ignoruje ograniczenia.
Powinieneś użyć tabel Information_schema, aby pobrać metadane dotyczące bazy danych, a następnie upuścić wymienione tam tabele.
Możesz również wypróbować szybki skrypt powłoki:
#!/bin/bash
IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
echo mysql <databaseName> -e "drop table $table"
done
Usuń echo
po sprawdzeniu, że zrobi to, czego oczekujesz.
$''
powoduje, że bash interpretuje sekwencje odwrócone zamiast traktować je dosłownie. '\n'
zawiera dokładnie \ n, dokładnie tak, co $IFS
rozumiałoby podział na znaki \ in. $'\n'
będzie zawierał znak nowej linii 0x0D. Zajrzyj tutaj, aby uzyskać więcej informacji: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Niedawno na blogu Xaprb pojawił się wpis, który ładnie to opisuje.
Obejmuje to, dlaczego używanie INFORMATION_SCHEMA
nie zawsze jest dobrą rzeczą i odwołuje się do narzędzia od tych uroczych ludzi w Maatkit .
Spróbuj wykonać następujące czynności z mk-find
:
mk-find '<database>' --printf 'DROP TABLE %D.%N'
Jeśli jesteś zadowolony z wyników, to:
mk-find '<database>' --exec 'DROP TABLE %D.%N'
Jeśli masz dostęp do systemu plików, to po prostu rm -rf databasename/*
:).
Instrukcja Drop bazy danych robi to samo ... Fragment podręcznika MySQL:
Instrukcja DROP DATABASE usuwa z podanego katalogu bazy danych te pliki i katalogi, które sam MySQL może utworzyć podczas normalnej pracy: