2010-02-11 16 views
5

से MYSQL द्रव्यमान हटाना मेरे पास 50GB mysql डेटाबेस (80 टेबल) है जो मुझे इससे कुछ सामग्री हटाने की आवश्यकता है। मेरे पास एक संदर्भ तालिका है जिसमें उत्पाद आईडी हैं जिन्हें अन्य तालिकाओं से हटाया जाना आवश्यक है।80 टेबल

अब, अन्य सारणी प्रत्येक 2 जीबी हो सकती हैं, जिसमें आइटम को हटाया जाना आवश्यक है।

  1. मेरे सवाल यह है: के बाद से यह एक छोटे से डेटाबेस नहीं है, ताकि समस्याओं से बचने के लिए एक शॉट में डेटा को हटाने के लिए सबसे सुरक्षित तरीका क्या है?

  2. संपूर्ण डेटा को सत्यापित करने के लिए सबसे अच्छी विधि क्या है?

उत्तर

0

मैं थिल्डर से सहमत हूं कि विदेशी कुंजी का उपयोग करना प्राथमिक है। यह पूरे डेटाबेस की संदर्भित अखंडता और consisitency की गारंटी देता है।
मुझे विश्वास है कि जीवन को कभी-कभी अधिक कठिन तर्क की आवश्यकता होती है। तो तुम जैसे

delete from a where id in (select id from keys) 

मैनुअल प्रश्नों का उपयोग कर सकता है आप एक बार में या कुंजी की सीमा या हटाएं सीमा का उपयोग करके सभी रिकॉर्डों को नष्ट कर सकता है। उचित सूचकांक एक जरूरी है। स्थिरता को सत्यापित करने के लिए आपको फ़ंक्शन या क्वेरी की आवश्यकता है। उदाहरण के लिए:

create function check_consistency() returns boolean 
begin 
    return not exists(select * from child where id not in (select id from parent)) 
     and not exists(select * from child2 where id not in (select id from parent)); 
    -- and so on 
end 
1

शायद यह अब और मदद नहीं करता है। लेकिन डेटाबेस बनाने के दौरान आपको इसे ध्यान में रखना चाहिए। MySQL में (तालिका भंडारण प्रकार के आधार पर, उदाहरण के लिए InnoDB में) आप संबंध निर्दिष्ट कर सकते हैं (उन्हें foreign key constraints कहा जाता है)। इन संबंधों का अर्थ है कि यदि आप एक पंक्ति (उदाहरण के लिए उत्पादों) से एक प्रविष्टि हटाते हैं तो आप अन्य पंक्तियों में प्रविष्टियों को स्वचालित रूप से अपडेट या हटा सकते हैं जिनके पास उस पंक्ति को विदेशी कुंजी (जैसे product_storage) है। ये संबंध सुरक्षित हैं कि आपके पास 100% सुसंगत राज्य है। हालांकि इन संबंधों को हिंडसाइट पर जोड़ना मुश्किल हो सकता है। यदि आप इसे अधिक बार करने की योजना बना रहे हैं, तो यह निश्चित रूप से शोध करने योग्य है कि आप इन्हें अपने डेटाबेस में जोड़ सकते हैं, वे आपको बहुत से काम बचाएंगे (सभी प्रकार के प्रश्न सरल हो जाएंगे)

इन संबंधों के बिना आप नहीं कर सकते 100% सुनिश्चित हो। तो आपको सभी टेबलों पर जाना होगा, न कि आप कौन से कॉलम पर जांच करना चाहते हैं और एसक्यूएल प्रश्नों का एक गुच्छा लिखना सुनिश्चित करने के लिए कोई प्रविष्टि नहीं है।

0

शायद कुछ भी देखने के लिए MySQL तालिकाओं में विभाजन हो रहा है। अधिक जानकारी के लिए रेफरी के मैनुअल की जाँच:

http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

नीचे आता है कि आप datetime मान या indexsets प्रति अलग विभाजन में (उदाहरण के लिए) टेबल विभाजित कर सकते हैं।

1

जैसा कि थिर्लर ने इंगित किया है, यदि आपके पास विदेशी कुंजी थी तो यह अच्छा होगा। उनके बिना बर्नल का समाधान लेनदेन के लिए इस्तेमाल किया जा सकता है यह सुनिश्चित करने के लिए कि कोई विसंगतियां रेंगें।

चाहे आप इसे कैसे करते हैं, इसमें काफी समय लग सकता है, यहां तक ​​कि घंटों तक भी कृपया इसके लिए तैयार रहें।

1

जैसा कि पहले बताया गया था कि इस जगह में विदेशी कुंजी अच्छी होगी। लेकिन प्रश्न 1 के संबंध में आप शायद MySQL प्रॉम्प्ट से लेनदेन के भीतर परिवर्तन चला सकते हैं। यह मानता है कि आप इनो डीडी जैसे लेनदेन सुरक्षित स्टोरेज इंजन का उपयोग कर रहे हैं। यदि आपको आवश्यकता हो तो आप Myisam से InnoDB में कनवर्ट कर सकते हैं।वैसे भी इस तरह कुछ:

START TRANSACTION; 

...Perform changes... 
...Control changes... 

COMMIT; 
...or... 
ROLLBACK; 

क्या यह कोई डाउनटाइम स्वीकार्य है?

डेटाबेस के साथ PostgreSQL के साथ काम करते समय> 250 जीबी हम डेटाबेस परिवर्तन करने के लिए उत्पादन सर्वर पर इस तकनीक का उपयोग करते हैं। यदि परिणाम अपेक्षित नहीं है तो हम लेनदेन को वापस ले लेंगे। निश्चित रूप से एक दंड है क्योंकि आई/ओ-सिस्टम को थोड़ा काम करना है।

// जॉन

संबंधित मुद्दे