Как удалить все таблицы в базе данных MySQL, не удаляя базу данных?

12

Мне нужно удалить все таблицы в базе данных, не зная их имена заранее. Типичная процедура - удалить и затем заново создать базу данных, но это не вариант. Каков наилучший способ сделать это?

Анхель Чан
источник
1
Наверное, стоило спросить об этом заранее, но лучше поздно, чем никогда, я полагаю: какая ОС?
Джефф Снайдер
Unix / Linux, как ОС.
Ангел Чан

Ответы:

18

Есть простой однострочный bash, использующий mysqldump (из блога Thingy Ma Jig ).

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

Если вы получаете эту ошибку:

ERROR 1217 (23000) at line 1: Cannot delete or update a parent row: 
    a foreign key constraint fails

Попробуйте следующее:

(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]

Теперь он игнорирует ограничения.

Анхель Чан
источник
5

Вам следует использовать таблицы information_schema для извлечения метаданных о базе данных, а затем отбросить перечисленные там таблицы.

Joril
источник
3

Вы можете попробовать быстрый скрипт для этого:

#!/bin/bash

IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
    echo mysql <databaseName> -e "drop table $table"
done

Удалить echoпосле того, как вы проверили, что он будет делать то, что вы ожидаете.

Джефф Снайдер
источник
Кстати, почему вы пишете '$' перед значением IFS? Почему это не выглядит как "IFS = '\ n'"?
Колыпто
@o_OTync Использование $''заставляет bash интерпретировать последовательности с обратной косой чертой вместо буквального восприятия . '\n'будет точно такой же \ n, как и тот, который $IFSбудет разбиваться на \ и n символов. $'\n'будет содержать символ новой строки, 0x0D. Посмотрите здесь для получения дополнительной информации: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Джефф Снайдер
Я думаю, что это проще, чем использовать INFORMATION_SCHEMA.
Ангел Чанг
0

Недавно в блоге Xaprb появилась запись, в которой об этом хорошо сказано .

Это объясняет, почему использование INFORMATION_SCHEMAне всегда хорошо, и ссылается на инструмент тех милых людей из Maatkit .

Попробуйте следующее с mk-find:

mk-find '<database>' --printf 'DROP TABLE %D.%N'

Если вы довольны результатами, тогда:

mk-find '<database>' --exec 'DROP TABLE %D.%N'
Дэн Карли
источник
-2

Если у вас есть доступ к файловой системе, то просто rm -rf databasename/*:).

Оператор Drop database делает то же самое ... Выдержка из руководства MySQL:

Оператор DROP DATABASE удаляет из заданного каталога базы данных те файлы и каталоги, которые сам MySQL может создать во время нормальной работы:

Jauzsika
источник
2
Чрезвычайно плохая идея для любой нетривиальной установки, так как MySQL не ожидает, что эти файлы внезапно исчезнут и могут быть в середине любого числа операций, транзакций, репликации, блокировок ...
bot403
Не могли бы вы пересмотреть свой ответ, включив в него правильные команды и процедуру?
bot403