मुझे पहले से उनके नाम को जाने बिना एक डेटाबेस में सभी तालिकाओं को छोड़ने की आवश्यकता है। विशिष्ट प्रक्रिया को गिराना और फिर डेटाबेस को फिर से बनाना है लेकिन यह एक विकल्प नहीं है। यह करने के लिए सबसे अच्छा तरीका क्या है?
मुझे पहले से उनके नाम को जाने बिना एक डेटाबेस में सभी तालिकाओं को छोड़ने की आवश्यकता है। विशिष्ट प्रक्रिया को गिराना और फिर डेटाबेस को फिर से बनाना है लेकिन यह एक विकल्प नहीं है। यह करने के लिए सबसे अच्छा तरीका क्या है?
जवाबों:
Mysqldump ( Thingy Ma Jig Blog से ) का उपयोग करके एक सरल बैश वन-लाइनर है ।
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]
अब यह बाधाओं की अनदेखी करता है।
आपको डेटाबेस के बारे में मेटाडेटा लाने के लिए information_schema तालिकाओं का उपयोग करना चाहिए , और फिर वहाँ सूचीबद्ध तालिकाओं को छोड़ देना चाहिए।
आप इसे करने के लिए एक त्वरित शेल स्क्रिप्ट आज़मा सकते हैं:
#!/bin/bash
IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
echo mysql <databaseName> -e "drop table $table"
done
echo
आपके द्वारा जाँच के बाद निकालें कि यह वह करने जा रहा है जिसकी आप अपेक्षा करते हैं।
$''
उन्हें शाब्दिक रूप से लेने के बजाय बैकस्लेस्ड अनुक्रमों की व्याख्या करने का कारण बनता है। '\n'
वास्तव में \ n सम्मिलित होगा, ठीक उसी तरह, जो $IFS
\ n और वर्णों में विभाजित होना समझेगा। $'\n'
एक नया वर्ण, 0x0D शामिल होगा। अधिक जानकारी के लिए एक नज़र डालें: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting ।
Xaprb ब्लॉग पर हाल ही में एक प्रविष्टि थी जो इसे अच्छी तरह से कवर करती है।
इसमें यह शामिल है कि क्यों INFORMATION_SCHEMA
हमेशा एक अच्छी बात नहीं है और Maatkit में उन प्यारे लोगों से एक उपकरण का संदर्भ लेता है ।
निम्नलिखित के साथ प्रयास करें mk-find
:
mk-find '<database>' --printf 'DROP TABLE %D.%N'
यदि आप परिणाम से खुश हैं तो:
mk-find '<database>' --exec 'DROP TABLE %D.%N'
यदि आपके पास फ़ाइल सिस्टम एक्सेस है, तो बस rm -rf databasename/*
:)।
ड्रॉप डेटाबेस स्टेटमेंट वही करता है ... MySQL मैनुअल से अंश:
DROP DATABASE कथन दिए गए डेटाबेस निर्देशिका से उन फ़ाइलों और निर्देशिकाओं को हटा देता है जिन्हें MySQL स्वयं सामान्य ऑपरेशन के दौरान बना सकता है: