Bagaimana cara menjatuhkan semua tabel dalam database MySQL tanpa menjatuhkan database?

12

Saya perlu membuang semua tabel dalam database tanpa mengetahui nama mereka sebelumnya. Prosedur tipikal adalah menjatuhkan dan kemudian membuat ulang basis data tetapi ini bukan pilihan. Apa cara terbaik untuk melakukannya?

Angel Chiang
sumber
1
Mungkin seharusnya menanyakan hal ini sebelumnya, tetapi lebih baik terlambat daripada tidak pernah saya kira: OS apa?
Jeff Snider
Unix / Linux menyukai OS.
Angel Chiang

Jawaban:

18

Ada bash one-liner yang lebih sederhana menggunakan mysqldump (dari Thingy Ma Jig Blog ).

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

Jika Anda mendapatkan kesalahan ini:

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

Coba yang berikut ini:

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

Sekarang ia mengabaikan kendala.

Angel Chiang
sumber
5

Anda harus menggunakan tabel information_schema untuk mengambil metadata tentang database, dan kemudian drop tabel yang terdaftar di sana.

Joril
sumber
3

Anda dapat mencoba skrip shell cepat untuk melakukannya juga:

#!/bin/bash

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

Hapus echosetelah Anda memeriksa bahwa itu akan melakukan apa yang Anda harapkan.

Jeff Snider
sumber
Omong-omong, mengapa Anda menulis '$' sebelum nilai IFS? Mengapa itu tidak terlihat seperti "IFS = '\ n'"?
kolypto
@ o_OTync Menggunakan $''penyebab bash untuk menginterpretasikan urutan backslashed alih-alih menganggapnya harfiah. '\n'akan mengandung tepat \ n, begitu saja, yang $IFSakan mengerti untuk membagi karakter \ dan n. $'\n'akan berisi karakter baris baru, 0x0D. Lihatlah di sini untuk info lebih lanjut: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Jeff Snider
Saya pikir ini lebih sederhana daripada menggunakan INFORMATION_SCHEMA.
Angel Chiang
0

Ada entri di blog Xaprb baru-baru ini yang mencakup ini dengan baik.

Ini termasuk mengapa menggunakan INFORMATION_SCHEMAtidak selalu merupakan hal yang baik dan merujuk pada alat dari orang-orang cantik di Maatkit .

Coba yang berikut ini dengan mk-find:

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

Jika Anda puas dengan hasilnya, maka:

mk-find '<database>' --exec 'DROP TABLE %D.%N'
Dan Carley
sumber
-2

Jika Anda memiliki akses sistem file, maka cukup rm -rf databasename/*:).

Pernyataan Drop database melakukan hal yang sama ... Kutipan dari manual MySQL:

Pernyataan DROP DATABASE menghapus dari direktori database yang diberikan file dan direktori yang dapat dibuat sendiri oleh MySQL selama operasi normal:

Jauzsika
sumber
2
Gagasan yang sangat buruk untuk pengaturan non-sepele karena MySQL tidak mengharapkan file-file ini tiba-tiba menghilang dan bisa saja ada di tengah-tengah sejumlah operasi, transaksi, replikasi, kunci ...
bot403
Apakah Anda mempertimbangkan untuk merevisi jawaban Anda untuk memasukkan perintah dan prosedur yang tepat?
bot403