Можно ли удалить все пустые таблицы из моей огромной базы данных (mysql)?
Я ищу команду sql для автоматического удаления всех этих пустых таблиц.
В настоящее время у меня есть 305 таблиц в моем наборе данных, и около 30% из них - старые пустые таблицы, которые не будут использоваться в моем новом приложении.
Чтобы уточнить; Все таблицы имеют тип = MyISAM
Ответы:
Идея, вероятно, будет искать пустые таблицы, используя
INFORMATION_SCHEMA.TABLES
Тогда вы сможете создать SQL-запрос с
Быстро и немного грязно, но на самом деле должно работать.
источник
Поскольку все таблицы являются MyISAM, это облегчает мой ответ.
Сначала вам нужно запросить у INFORMATION_SCHEMA таблицы с нулевыми строками:
Далее, сформулируйте запрос, чтобы удалить пустые таблицы:
Теперь поместите команды во внешний текстовый файл SQL.
Посмотрите на содержимое с одним из следующих
less DropTables.sql
cat DropTables.sql
Если вас устраивает его содержимое, запустите скрипт:
или войдите в MySQL и запустите его так:
Попробуйте!
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 на моем рабочем столе
Если некоторые из этих таблиц должны были исчезнуть (как
columns_priv
,proc_priv
,tables_priv
и т.д.), механизм гранта не может работать неправильно или может привести к туздЫ не пускать. Вы также не хотите взломать mysql.proc, поскольку это физический дом хранимых процедур. Другие механизмы могут не работать, если вы захотите их использовать, например, CrashSafe Replication с использованием таблиц InnoDB внутри схемы mysql или если вы хотите вставить информацию о часовом поясе.ОБНОВЛЕНИЕ 2014-02-05 12:36 EST
Я хотел бы поблагодарить Тома Деспа за его ответ по определенной причине: его синтаксис может выполнить отбрасывание без использования внешнего сценария . Используя его идею, позвольте мне записать команду DROP TABLE в пользовательскую переменную.
Если выходные данные
SELECT @DropCommand;
правильные, выполните команду следующим образом:Это устраняет две вещи:
источник