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?


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.


5

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


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.


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'

-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:


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.