Czy można usunąć wszystkie puste tabele z mojej ogromnej bazy danych (mysql)?
Szukam polecenia sql, aby automatycznie usunąć wszystkie puste tabele.
Obecnie mam w zestawie danych 305 tabel, a około 30% z nich to stare puste tabele, które nie będą używane w mojej nowej aplikacji.
Aby wyjaśnic; Wszystkie tabele są typu = MyISAM
Odpowiedzi:
Pomysł prawdopodobnie polegałby na szukaniu pustych tabel przy użyciu
INFORMATION_SCHEMA.TABLES
Wtedy możesz wygenerować zapytanie SQL za pomocą
Szybki i nieco brudny, ale powinien działać.
źródło
Ponieważ wszystkie tabele są MyISAM, dzięki temu moja odpowiedź jest łatwiejsza do wyrażenia.
Najpierw musisz wysłać zapytanie do Information_SCHEMA dla tabel, które mają zero wierszy:
Następnie sformułuj zapytanie, aby usunąć puste tabele:
Teraz zrzuć polecenia do zewnętrznego pliku tekstowego SQL.
Przejrzyj zawartość za pomocą jednego z poniższych
less DropTables.sql
cat DropTables.sql
Jeśli jesteś zadowolony z jego zawartości, uruchom skrypt:
lub zaloguj się do mysql i uruchom go w następujący sposób:
Spróbuj !!!
CAVEAT : Ta technika działa tylko z tabelą MyISAM, ponieważ liczba wierszy tabeli MyISAM jest fizycznie przechowywana w
.MYD
tabelach. Tabela metadanych INFORMACJE_SCHEMA.TABLES zawsze czyta to i aktualizuje. NIE WYPRÓBUJ TEGO W INNODB !!!AKTUALIZACJA 2014-02-05 11:46 EST
Jest powód, który wykluczyłem
('information_schema','mysql','performance_schema')
mysql
Schemat ma pustych tabel w nim. NiektóreMyISAM
, niektóreInnoDB
, niektóreCSV
.Na przykład, oto moje tabele w schemacie mysql dla MySQL 5.6.15 na moim pulpicie
Jeśli niektóre z tych tabel miały zniknąć (jak
columns_priv
,proc_priv
,tables_priv
, itd.), Mechanizm grant może nie działać poprawnie lub może powodować mysqld nie uruchamia się. Również nie chcesz bić mysql.proc, ponieważ jest to fizyczny dom przechowywanych procedur. Inne mechanizmy mogą nie działać, jeśli chcesz ich użyć, takie jak replikacja CrashSafe przy użyciu tabel InnoDB w schemacie mysql lub jeśli chcesz wstawić informacje o strefie czasowej.AKTUALIZACJA 2014-02-05 12:36 EST
Chciałbym pochwalić Toma Despa za jego odpowiedź z konkretnego powodu: jego składnia może upuścić bez użycia zewnętrznego skryptu . Korzystając z jego pomysłu, pozwól mi przechwycić polecenie DROP TABLE do zmiennej zdefiniowanej przez użytkownika.
Jeśli wynik
SELECT @DropCommand;
jest prawidłowy, wykonaj polecenie w następujący sposób:To eliminuje dwie rzeczy:
źródło