Як скинути всі таблиці в базу даних MySQL, не скидаючи базу даних?


12

Мені потрібно скинути всі таблиці в базу даних, не знаючи заздалегідь їхніх імен. Типовою процедурою є скидання та повторне відтворення бази даних, але це не варіант. Який найкращий спосіб це зробити?


1
Напевно, слід було б запитати це заздалегідь, але краще пізно, ніж ніколи я гадаю: Яка ОС?
Джефф Снайдер

Unix / Linux, як ОС.
Ангел Чіанг

Відповіді:


18

Існує більш простий одношаровий баш за допомогою 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, щоб отримати метадані про базу даних, а потім скинути таблиці, перелічені там.


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 робить те саме ... Уривок з посібника MySQL:

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


2
Надзвичайно погана ідея для будь-якої нетривіальної установки, оскільки MySQL не очікує, що ці файли раптово зникнуть і можуть опинитися в середині будь-якої кількості операцій, транзакцій, реплікації, блокування ...
bot403

Чи могли б ви переглянути свою відповідь, щоб потім включити належні команди та процедуру?
bot403
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.