Поскольку все таблицы являются MyISAM, это облегчает мой ответ.
Сначала вам нужно запросить у INFORMATION_SCHEMA таблицы с нулевыми строками:
SELECT table_schema,table_name FROM information_schema.tables
WHERE table_rows = 0 AND table_schema NOT IN
('information_schema','mysql','performance_schema');
Далее, сформулируйте запрос, чтобы удалить пустые таблицы:
SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name,';') DropTableCommand
FROM information_schema.tables
WHERE table_rows = 0 AND table_schema NOT IN
('information_schema','mysql','performance_schema');
Теперь поместите команды во внешний текстовый файл SQL.
SQL="SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name,';') DropTableCommand"
SQL="${SQL} FROM information_schema.tables WHERE table_rows = 0 AND table_schema"
SQL="${SQL} NOT IN ('information_schema','mysql','performance_schema')"
mysql -uroot -p -ANe"${SQL}" > DropTables.sql
Посмотрите на содержимое с одним из следующих
less DropTables.sql
cat DropTables.sql
Если вас устраивает его содержимое, запустите скрипт:
mysql -uroot -p < DropTables.sql
или войдите в MySQL и запустите его так:
mysql> source DropTables.sql
Попробуйте!
CAVEAT : этот метод работает только с таблицей MyISAM, поскольку счетчик строк таблицы MyISAM физически хранится в .MYD
таблицах. Таблица метаданных INFORMATION_SCHEMA.TABLES всегда читает это и обновляет. НЕ ПЫТАЙТЕСЬ С INNODB !!!
ОБНОВЛЕНИЕ 2014-02-05 11:46 EST
Есть причина, по которой я исключил ('information_schema','mysql','performance_schema')
В mysql
схеме есть пустые таблицы. Некоторые MyISAM
, некоторые InnoDB
, некоторые CSV
.
Например, вот мои таблицы в схеме MySQL для MySQL 5.6.15 на моем рабочем столе
mysql> select table_name,engine,table_rows
-> from information_schema.tables
-> where table_schema='mysql';
+---------------------------+--------+------------+
| table_name | engine | table_rows |
+---------------------------+--------+------------+
| columns_priv | MyISAM | 0 |
| db | MyISAM | 2 |
| event | MyISAM | 0 |
| func | MyISAM | 0 |
| general_log | CSV | 2 |
| help_category | MyISAM | 40 |
| help_keyword | MyISAM | 485 |
| help_relation | MyISAM | 1090 |
| help_topic | MyISAM | 534 |
| innodb_index_stats | InnoDB | 0 |
| innodb_table_stats | InnoDB | 0 |
| ndb_binlog_index | MyISAM | 0 |
| plugin | MyISAM | 0 |
| proc | MyISAM | 0 |
| procs_priv | MyISAM | 0 |
| proxies_priv | MyISAM | 1 |
| servers | MyISAM | 0 |
| slave_master_info | InnoDB | 0 |
| slave_relay_log_info | InnoDB | 0 |
| slave_worker_info | InnoDB | 0 |
| slow_log | CSV | 2 |
| tables_priv | MyISAM | 0 |
| time_zone | MyISAM | 0 |
| time_zone_leap_second | MyISAM | 0 |
| time_zone_name | MyISAM | 0 |
| time_zone_transition | MyISAM | 0 |
| time_zone_transition_type | MyISAM | 0 |
| user | MyISAM | 6 |
+---------------------------+--------+------------+
28 rows in set (0.01 sec)
mysql>
Если некоторые из этих таблиц должны были исчезнуть (как columns_priv
, proc_priv
, tables_priv
и т.д.), механизм гранта не может работать неправильно или может привести к туздЫ не пускать. Вы также не хотите взломать mysql.proc, поскольку это физический дом хранимых процедур. Другие механизмы могут не работать, если вы захотите их использовать, например, CrashSafe Replication с использованием таблиц InnoDB внутри схемы mysql или если вы хотите вставить информацию о часовом поясе.
ОБНОВЛЕНИЕ 2014-02-05 12:36 EST
Я хотел бы поблагодарить Тома Деспа за его ответ по определенной причине: его синтаксис может выполнить отбрасывание без использования внешнего сценария . Используя его идею, позвольте мне записать команду DROP TABLE в пользовательскую переменную.
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(DBTB),';')
INTO @DropCommand
FROM (SELECT CONCAT(table_schema,'.',table_name) DBTB
FROM information_schema.tables
WHERE table_rows = 0 AND table_schema NOT IN
('information_schema','mysql','performance_schema')) A;
SELECT @DropCommand;
Если выходные данные SELECT @DropCommand;
правильные, выполните команду следующим образом:
PREPARE s FROM @DropCommand;
EXECUTE s;
DEALLOCATE PREPARE s;
Это устраняет две вещи:
- необходимость внешнего текстового файла SQL
- запуск отдельной команды DROP TABLE для каждой таблицы