Önceden adlarını bilmeden bir veritabanındaki tüm tabloları bırakmanız gerekiyor. Tipik prosedür, veritabanını bırakıp yeniden oluşturmaktır, ancak bu bir seçenek değildir. Bunu yapmanın en iyi yolu nedir?
Önceden adlarını bilmeden bir veritabanındaki tüm tabloları bırakmanız gerekiyor. Tipik prosedür, veritabanını bırakıp yeniden oluşturmaktır, ancak bu bir seçenek değildir. Bunu yapmanın en iyi yolu nedir?
Yanıtlar:
Mysqldump ( Thingy Ma Jig Blog'dan) kullanarak daha basit bir bash tek katmanlı var .
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]
Bu hatayı alıyorsanız:
ERROR 1217 (23000) at line 1: Cannot delete or update a parent row:
a foreign key constraint fails
Takip etmeyi dene:
(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]
Şimdi kısıtlamaları görmezden geliyor.
Veritabanı ile ilgili meta verileri almak için information_schema tablolarını kullanmalı ve orada listelenen tabloları bırakmalısınız.
Bunu yapmak için hızlı bir kabuk komut dosyası da deneyebilirsiniz:
#!/bin/bash
IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
echo mysql <databaseName> -e "drop table $table"
done
echo
Beklediğiniz şeyi yapacağını kontrol ettikten sonra kaldırın .
$''
ters eğik çizgileri tam anlamıyla almak yerine yorumlamasına neden olur. '\n'
tam olarak \ n, tıpkı bunun gibi $IFS
, \ ve n karakterlerine bölündüğünü anlayacaktı. $'\n'
yeni satır karakteri (0x0D) içerir. Daha fazla bilgi için buraya bakın: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Son zamanlarda Xaprb blogunda bunu güzel bir şekilde kapsayan bir giriş vardı .
Kullanmanın neden INFORMATION_SCHEMA
her zaman iyi bir şey olmadığını içerir ve Maatkit'teki bu sevimli insanlardan bir araca referans verir .
Aşağıdakileri deneyin mk-find
:
mk-find '<database>' --printf 'DROP TABLE %D.%N'
Sonuçlardan memnunsanız:
mk-find '<database>' --exec 'DROP TABLE %D.%N'
Dosya sistemi erişiminiz varsa, sadece rm -rf databasename/*
:).
Drop veritabanı deyimi aynı şeyi yapar ... MySQL kılavuzundan alıntı:
DROP DATABASE deyimi, verilen veritabanı dizininden, MySQL'in kendisinin normal çalışma sırasında oluşturabileceği dosyaları ve dizinleri kaldırır: