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?
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?
Jawaban:
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.
Anda harus menggunakan tabel information_schema untuk mengambil metadata tentang database, dan kemudian drop tabel yang terdaftar di sana.
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 echo
setelah Anda memeriksa bahwa itu akan melakukan apa yang Anda harapkan.
$''
penyebab bash untuk menginterpretasikan urutan backslashed alih-alih menganggapnya harfiah. '\n'
akan mengandung tepat \ n, begitu saja, yang $IFS
akan 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 .
Ada entri di blog Xaprb baru-baru ini yang mencakup ini dengan baik.
Ini termasuk mengapa menggunakan INFORMATION_SCHEMA
tidak 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'
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: