Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

गलत MySQL अद्यतन क्वेरी के बाद पुनर्प्राप्ति?

यहां सीखने के लिए दो सबक हैं:

  1. बैकअप डेटा
  2. किसी लेन-देन में अद्यतन/हटाएं विवरण निष्पादित करें, ताकि आप ROLLBACK का उपयोग कर सकें अगर चीजें योजना के अनुसार नहीं होती हैं

अपने डेटाबेस के लिए लेन-देन (ऑटोकॉमिट, स्पष्ट और निहित) हैंडलिंग के बारे में जागरूक होना आपको बैकअप से डेटा को पुनर्स्थापित करने से बचा सकता है।

लेनदेन यह सुनिश्चित करने के लिए डेटा हेरफेर स्टेटमेंट को नियंत्रित करते हैं कि वे परमाणु हैं। "परमाणु" होने का अर्थ है कि लेन-देन या तो होता है, या नहीं होता है। डेटाबेस में लेन-देन के पूरा होने का संकेत देने का एकमात्र तरीका COMMIT . का उपयोग करना है या ROLLBACK बयान (प्रति एएनएसआई-92, जिसमें दुख की बात है कि लेनदेन बनाने/शुरू करने के लिए वाक्यविन्यास शामिल नहीं था, इसलिए यह विक्रेता विशिष्ट है)। COMMIT लेन-देन के भीतर किए गए परिवर्तनों (यदि कोई हो) को लागू करता है। ROLLBACK लेन-देन के भीतर हुई किसी भी कार्रवाई की अवहेलना करता है - जब कोई UPDATE/DELETE कथन अनपेक्षित कुछ करता है तो अत्यधिक वांछनीय होता है

आम तौर पर अलग-अलग डीएमएल (इन्सर्ट, अपडेट, डिलीट) स्टेटमेंट ऑटोकॉमिट ट्रांजेक्शन में किए जाते हैं - जैसे ही स्टेटमेंट सफलतापूर्वक पूरा होता है, वे प्रतिबद्ध होते हैं। इसका मतलब है कि आपके जैसे मामलों में चलने वाले बयान से पहले डेटाबेस को राज्य में वापस रोल करने का कोई अवसर नहीं है। जब कुछ गलत हो जाता है, तो बैकअप से डेटा का पुनर्निर्माण करने के लिए उपलब्ध एकमात्र बहाली विकल्प है (बशर्ते कोई मौजूद हो)। MySQL में, ऑटोकॉमिट है पर InnoDB के लिए डिफ़ॉल्ट रूप से - MyISAM लेनदेन का समर्थन नहीं करता है। इसका उपयोग करके इसे अक्षम किया जा सकता है:

SET autocommit = 0

एक स्पष्ट लेन-देन तब होता है जब स्टेटमेंट को स्पष्ट रूप से परिभाषित लेनदेन कोड ब्लॉक के भीतर लपेटा जाता है - MySQL के लिए, यह START TRANSACTION है . इसके लिए स्पष्ट रूप से बनाए गए COMMIT . की भी आवश्यकता होती है या ROLLBACK लेनदेन के अंत में बयान। नेस्टेड लेनदेन इस विषय के दायरे से बाहर हैं।

निहित लेन-देन स्पष्ट लेन-देन से थोड़े अलग होते हैं। निहित लेनदेन को लेनदेन को परिभाषित करने के लिए स्पष्टीकरण की आवश्यकता नहीं होती है। हालांकि, स्पष्ट लेनदेन की तरह उन्हें COMMIT . की आवश्यकता होती है या ROLLBACK विवरण दिया जाना है।

निष्कर्ष

स्पष्ट लेनदेन सबसे आदर्श समाधान हैं - उन्हें एक बयान की आवश्यकता होती है, COMMIT या ROLLBACK , लेन-देन को अंतिम रूप देने के लिए, और जो हो रहा है वह स्पष्ट रूप से कहा गया है कि दूसरों को पढ़ने की आवश्यकता होनी चाहिए। अंतःक्रियात्मक रूप से डेटाबेस के साथ काम करने पर निहित लेनदेन ठीक है, लेकिन COMMIT बयानों को केवल तभी निर्दिष्ट किया जाना चाहिए जब परिणामों का परीक्षण किया गया हो और पूरी तरह से मान्य होने के लिए निर्धारित किया गया हो।

इसका मतलब है कि आपको इसका इस्तेमाल करना चाहिए:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

...और केवल COMMIT; . का उपयोग करें जब परिणाम सही हों।

उस ने कहा, अद्यतन और हटाएं बयान आम तौर पर केवल प्रभावित पंक्तियों की संख्या लौटाते हैं, विशिष्ट विवरण नहीं। ऐसे बयानों को सेलेक्ट स्टेटमेंट में बदलें और शुद्धता सुनिश्चित करने के लिए परिणामों की समीक्षा करें पहले UPDATE/DELETE कथन का प्रयास करने के लिए।

परिशिष्ट

DDL (डेटा डेफिनिशन लैंग्वेज) स्टेटमेंट स्वचालित रूप से प्रतिबद्ध होते हैं - उन्हें COMMIT स्टेटमेंट की आवश्यकता नहीं होती है। IE:तालिका, अनुक्रमणिका, संग्रहीत कार्यविधि, डेटाबेस, और निर्माण या परिवर्तन विवरण देखें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं Laravel 5 में कच्चे पीडीओ इंस्टेंस तक नहीं पहुंच सकता

  2. बिल्ड टाइम पर पॉपुलेटेड MySQL डॉकर इमेज कैसे बनाएं?

  3. GTID के साथ MySQL 5.6 गैर-GTID से MySQL 5.7 में ऑनलाइन स्थानांतरण

  4. स्क्रिप्ट का उपयोग करके PHP MySQL डेटाबेस कनेक्शन का परीक्षण कैसे करें

  5. हम MySQL और रेगुलर एक्सप्रेशन का उपयोग करके डोमेन नाम कैसे खोज सकते हैं