Мені потрібно скинути всі таблиці в базу даних, не знаючи заздалегідь їхніх імен. Типовою процедурою є скидання та повторне відтворення бази даних, але це не варіант. Який найкращий спосіб це зробити?
Мені потрібно скинути всі таблиці в базу даних, не знаючи заздалегідь їхніх імен. Типовою процедурою є скидання та повторне відтворення бази даних, але це не варіант. Який найкращий спосіб це зробити?
Відповіді:
Існує більш простий одношаровий баш за допомогою 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]
Тепер він ігнорує обмеження.
Ви повинні використовувати таблиці information_schema, щоб отримати метадані про базу даних, а потім скинути таблиці, перелічені там.
Ви можете спробувати швидкий скрипт оболонки, щоб зробити це теж:
#!/bin/bash
IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
echo mysql <databaseName> -e "drop table $table"
done
Видаліть echo
після того, як ви перевірили, що він буде робити те, що ви очікуєте.
$''
викликає bash для інтерпретації накладених послідовностей замість того, щоб приймати їх буквально. '\n'
містив би точно \ n, саме так, що $IFS
було б розбито на \ і n символів. $'\n'
містив би символ нового рядка, 0x0D. Подивіться тут, щоб отримати докладнішу інформацію: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Нещодавно з'явився запис у блозі Xaprb, який чудово висвітлює це питання.
Він включає, чому використовувати INFORMATION_SCHEMA
не завжди гарну річ, і посилається на інструмент тих чудових людей Maatkit .
Спробуйте наступне mk-find
:
mk-find '<database>' --printf 'DROP TABLE %D.%N'
Якщо ви задоволені результатами, виконайте такі дії:
mk-find '<database>' --exec 'DROP TABLE %D.%N'
Якщо у вас є доступ до файлової системи, то просто rm -rf databasename/*
:).
Оператор бази даних Drop робить те саме ... Уривок з посібника MySQL:
Оператор DROP DATABASE видаляє із заданої каталогу бази даних ті файли та каталоги, які MySQL може створювати під час звичайної роботи: