2009-01-19 17 views
48

मैं एक सर्वर में mySQL चला रहा हूं जहां मुझे कई डेटाबेस ड्रॉप करना होगा (सर्वर के साथ कुछ परीक्षण के बाद)। मुझे छोड़ने वाले सभी डेटाबेस में वही उपसर्ग "जो भी_" है।कुछ वाइल्डकार्ड से मेल खाने वाले MySQL डेटाबेस ड्रॉप करें?

उपसर्ग के बाद, नाम यादृच्छिक हैं। तो आपके पास जो कुछ भी है, कुछ भी, जो भी हो, 32, जो भी_ब्लैब्ला, ...., जो भी_मेटेलस्ट।

मैं इस काम को कुछ बार करूँगा इसलिए मैं सोच रहा था कि ऐसा करने का सबसे अच्छा तरीका क्या होगा?

संपादित करें: मैं भाषा के किसी भी प्रकार का उपयोग करें या mysql के लिए में प्लग ... इसलिए हम कुछ मायनों में यह कर सकते हैं कर सकते हैं। अभी, मैंने उस लड़के से पूछा है जो मुझे प्रत्येक पंक्ति के साथ एक .txt देने के लिए डेटाबेस उत्पन्न कर रहा है ... इसलिए मैं एक त्वरित php कोडिंग कर रहा हूं जो फ़ाइल लेगा और इसमें सभी डेटाबेस हटा देगा, बाद में मैं कोशिश करूंगा % उत्तर (यदि यह काम करता है, तो यह सुनिश्चित करने के लिए सही जवाब लेता है कि यह आसान तरीका है)। वैसे भी मैं इस आसान तरीका coz मैं इस कोड को समर्थन करने के लिए सकेंगे करना चाहते हैं (अन्य लोग और आपको पता चलेगा ...)

संपादित 2: एक वाइल्डकार्ड फ्लॉप काम के उपयोग: # 1008 - डेटाबेस 'जो भी_%' नहीं छोड़ सकता; डेटाबेस मौजूद नहीं है

उत्तर

78

मूलभूत विचार आपके डेटाबेस में "शो टेबल" चलाने के लिए है, और टेबलों को चुनने के लिए इसके परिणामों का उपयोग करें। मुझे नहीं लगता कि MySQL आपको "शो टेबल", से परिणामसेट के साथ कुछ भी करने देता है लेकिन मैं शायद गलत हूं।

mysql -u your_user -D your_database_name -e "show tables" -s | 
    egrep "^Whatever_" | 
    xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

सब खोल बाहर प्रिंट होगा कि टेबल "Whatever_" के साथ शुरुआत ड्रॉप करने आदेश:

यहां एक त्वरित और गंदे समाधान खोल का उपयोग कर रहा है। यदि आप वास्तव में उन आदेशों को निष्पादित करना चाहते हैं, तो "echo" शब्द को हटा दें।

संपादित करें: मैं उपर्युक्त व्याख्या करना भूल गया! ,

mysql -u your_user -D your_database_name -e "show tables" -s 

अपने सभी तालिकाओं की एक सूची प्रिंट हेडर "Tables_in_your_database_name" के साथ: मैं कैसे परिचित आप शेल पटकथा लेखन के साथ कर रहे हैं पता नहीं है, लेकिन यहाँ जाता है।कि से उत्पादन पहुंचाया जाता है (| प्रतीक का अर्थ है "पाइप" पारित कर दिया-ऑन के रूप में,) अगले आदेश के माध्यम से: किसी भी लाइनों है कि शुरू के लिए

egrep "^Whatever_" 

खोज (कि^प्रतीकों का अर्थ है "वाले प्राणियों") शब्द "जो भी_" और केवल उनको प्रिंट करता है। अंत में, हम पाइप कि आदेश के माध्यम से "Whatever_ *" तालिकाओं की सूची:

xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

जो तालिका नामों की सूची में प्रत्येक पंक्ति लेता है, और आदेश में के बजाय "@@" यह सम्मिलित करता

echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

तो अगर आप "Whatever_1", "Whatever_2", "Whatever_3" नाम तालिकाओं का एक समूह था, उत्पन्न आदेशों होगा:

echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1" 
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2" 
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3" 

कौन सा होगा उत्पादन निम्नलिखित:

+०१२३५१६४१०
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1" 
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2" 
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3" 

मुझे उम्मीद है कि यह पर्याप्त जानकारी थी, और मैं बहुत ज्यादा जानकारी के साथ सिर पर किसी को भी मार नहीं रहा हूं। शुभकामनाएं, और "ड्रॉप टेबल" कमांड का उपयोग करते समय सावधान रहें!

+0

में काम करता है मेरे साथ यह '-e' के बाद उद्धरण चिह्न (' "') आउटपुट नहीं करता है। यह इस तरह की रेखाएं आउटपुट करता है: 'mysql -u root -D joomla_test -e ड्रॉप टेबल bak_xlr1q_weblinks' अपनी सटीक बैश स्क्रिप्ट का उपयोग कर रहा हूं। मैं बैश 4.1.5 (1) -release का उपयोग कर रहा हूं। – Hubro

+0

@Codemonkey उद्धरण प्रकट करने के लिए, आप उन्हें से बच सकते हैं। '" ड्रोप टेबल @@ "' ' "ड्रोप टेबल @@ \" ' – scraimer

-4

आप mysql 5 general purpose routine library (here से डाउनलोड करने योग्य) का प्रयास कर सकते हैं। इसका उपयोग करके, आप एक नियमित अभिव्यक्ति से मेल खाने वाली कई तालिकाओं को छोड़ सकते हैं। मैं आपको आवश्यक सारणी छोड़ने से रोकने के लिए सावधानीपूर्वक नियमित अभिव्यक्ति की जांच करने का सुझाव देता हूं।

+0

मुझे लगता है कि आपने पूरा प्रश्न नहीं पढ़ा है। वह कई "डेटाबेस" को मल्टीबल "टेबल" नहीं छोड़ना चाहता है। – Xn0vv3r

-1

क्षमा करें हम एक समय एसक्यूएल का उपयोग करके अनेक डेटाबेस ड्रॉप नहीं कर सकते आदेशों

+1

हम एसक्यूएल कमांड – Adnan

+0

डीआरओपी टेबल टेबल 1, टेबल 2 का उपयोग कर एक समय में कई टेबल ड्रॉप कर सकते हैं ... – Adnan

-7

उपयोग described here रूप

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name 

बयान।

मैं अगर आप की तरह

DROP DATABASE Whatever_% 

कुछ करने के लिए wildcars उपयोग कर सकते हैं पता नहीं है, लेकिन मुझे लगता है कि आप इसे कोशिश करनी चाहिए।

+0

# 1008 - डेटाबेस 'जो भी_%' नहीं छोड़ सकता; डेटाबेस स्पष्ट रूप से मौजूद नहीं है, यह केवल SELECT – DFectuoso

1

अच्छी तरह से मुझे लगता है कि आप MySQL में एकाधिक डेटाबेस को हटा नहीं सकते हैं।

लेकिन मेरे पास एक बहुत ही geeky समाधान है। आप एक नोट पैड या किसी भी टेक्स्ट एडिटर में कई बार "DROP DATABASE WHATEVER_<name>;" प्रिंट करने के लिए सी/सी ++/सी #/जावा में प्रोग्राम कर सकते हैं। इसके बाद आप MySQL के क्लाइंट कमांड प्रॉम्प्ट में पेस्ट कॉपी कर सकते हैं और वहां आप जा सकते हैं। प्रत्येक DROP कमांड के बाद ";" को न भूलें।

मेरा मानना ​​है कि यह संभव है। इसे लिखने की कोशिश करो।

25

scraimer द्वारा जवाब के सिद्धांत सही है, लेकिन जब से सवाल एक डेटाबेस में एक डेटाबेस एक मेज नहीं छोड़ने के बारे में था, सही कमांड होना चाहिए:

mysql -u your_username -p'your password' -e 'show databases' 
| grep Whatever_* 
| xargs -I "@@" mysql -u your_username -p'your password' -e "DROP database \`@@\`" 

आदेश के स्पष्टीकरण के लिए , स्क्रैमर की व्याख्या देखें।

पिछले सा ... \ `@@ \` हम अपने जिसके परिणामस्वरूप डेटाबेस नाम bacticks (`) मामले में में उद्धृत किया है हमारे डाटाबेस नाम` तरह -` विशेष वर्ण है

चीयर्स

+0

मेरे लिए grep भाग में नियमित अभिव्यक्ति का उपयोग करना बेहतर था:' grep -e "। * _ बैकअप" '_backup" – Yeti

-1
DROP DATABASE `any-database_name`; 

मैं अपने डेटाबेस के नाम से पहले और बाद में इस चरित्र ` (बैकटिक) का उपयोग करता हूं।

11

हम इसे संग्रहीत प्रक्रियाओं के साथ कर सकते हैं। यहां नीचे दिया गया है:

drop procedure if exists droplike; 
delimiter // 
create procedure droplike(pattern varchar(20)) 
begin 
    set group_concat_max_len = 65535; 
    select @drop:= concat('drop table ', group_concat(table_name) , ';') from information_schema.tables where table_schema = "database_name" and table_name like pattern; 
    prepare statement from @drop; 
    execute statement; 
end // 
delimiter ; 

डेटाबेस के नाम से डेटाबेस_नाम बदलें (लिखने की अनुमति आवश्यक है)।

call droplike("XYZ%"); 
+0

के साथ समाप्त होने वाले सभी डेटाबेस का चयन करता है कुछ SQL बोलीयां अल्पविराम- इस तरह की सीमित सूचियां: 'ड्रोप टेबल" तालिका 1_बिट्स ", " table2_links ", " table3_stuff ";' – MarkHu

0

मामले किसी में एक सरल जवाब है कि दर्पण scraimer और एक्सप्लोरर की तलाश में है: के रूप में नीचे दिए गए पैटर्न XYZ कॉल वाइल्ड कार्ड के द्वारा पीछा किया XYZ के रूप में इनपुट के साथ प्रक्रिया के साथ टेबल ड्रॉप करने के लिए लेकिन जावा में लिखा है JDBC का उपयोग कर (मैं जानता हूँ कि मैं था), यहाँ एक त्वरित और गंदे एक है कि काम मेरे लिए किया मिल गया है:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 

public class DatabaseDeleter { 
    // Pass your database wildcard as the only argument to program ("%MY_CRAZY_PATTERN%") 
    public void main(String[] args) throws SQLException, ClassNotFoundException{ 

     Class.forName("com.mysql.jdbc.Driver"); 
     Connection connection = DriverManager.getConnection("jdbc:mysql://databaseURL"); 
     PreparedStatement pst = connection.prepareStatement("show databases like ?"); 
     pst.setString(1, args[0]); 
     ResultSet rs = pst.executeQuery(); 

     ArrayList<String> databases = new ArrayList<String>(); 
     while (rs.next()) databases.add(rs.getString(1)); 

     for (String s : databases){ 
      Statement st = connection.createStatement(); 
      st.execute("drop database " + s); 
     } 
     connection.close(); 
    } 
} 

चेतावनी: ग्राहकों या यहाँ तक कि अन्य डेवलपर्स को यह सतह मत करो अगर तुम तुम्हारा नहीं चाहते एसक्यूएल सर्वर ransacked।

1

इस (जेथन) के बारे में क्या?

rs = stmt.executeQuery("SHOW DATABASES LIKE 'Whatever_%'") 
databases_for_dropping = [] 
while rs.next(): 
    databases_for_dropping.append(rs.getString(1)) 
for database_for_dropping in databases_for_dropping: 
    stmt.execute("DROP DATABASE %s" % database_for_dropping) 
संबंधित मुद्दे