वह बैकअप स्क्रिप्ट हास्यास्पद है और किसी को भी इसका दूसरा संस्करण नहीं बनाना चाहिए। मैंने उस स्क्रिप्ट को पहले भी देखा है, साथ ही इसी तरह के प्रयास, और उनमें बहुत सारी समस्याएं हैं:
- तालिका नामों को बैक-टिक में सीमित नहीं करता
- NULLs को हैंडल नहीं करता
- कैरेक्टर सेट को हैंडल नहीं करता
- बाइनरी डेटा को हैंडल नहीं करता
- दृश्यों का बैक अप नहीं लेता
- ट्रिगर या संग्रहीत प्रक्रियाओं या संग्रहीत कार्यों या घटनाओं का बैक अप नहीं लेता
- अप्रचलित mysql एक्सटेंशन का उपयोग करता है (लेकिन यही कारण है कि आप PDO संस्करण चाहते हैं, है ना?)
- एक उचित MySQL एस्केपिंग फ़ंक्शन के बजाय addlashes() का उपयोग करता है।
- सभी को जोड़ता है सभी . के लिए डेटा पूरी सामग्री को आउटपुट करने से पहले, एक बहुत लंबी स्ट्रिंग में टेबल। इसका मतलब है कि आपको अपने पूरे डेटाबेस को एक स्ट्रिंग में स्टोर करने में सक्षम होना चाहिए, जो निश्चित रूप से आपकी PHP अधिकतम मेमोरी सीमा को समाप्त कर देगा।
दुर्भाग्यपूर्ण डेविड वॉल्श बैकअप स्क्रिप्ट के बारे में मेरा पिछला उत्तर भी देखें:
अपनी टिप्पणी दें:
आपके द्वारा लिंक किए गए पृष्ठ पर टिप्पणियां पढ़ें। बहुत से लोगों ने समस्याओं की पहचान की है, और कुछ के पास समाधान या कम से कम सुझाव हैं।
तथ्य यह है कि यह स्क्रिप्ट सब कुछ एक स्ट्रिंग में जोड़ती है, एक डील-ब्रेकर है, मुझे लगता है, लेकिन आउटपुट फ़ाइल को खोलने के लिए स्क्रिप्ट को बदलना मुश्किल नहीं होना चाहिए पहले , फिर लूप के दौरान प्रत्येक पंक्ति के डेटा को आउटपुट करें, फिर लूप के बाद फ़ाइल को बंद करें। यह एक तरह का नो-ब्रेनर है, मुझे यकीन नहीं है कि स्क्रिप्ट ऐसा क्यों नहीं करती है। लेकिन यह बिल्कुल स्पष्ट है कि स्क्रिप्ट का परीक्षण बहुत अच्छी तरह से नहीं किया गया था।
लेकिन वैसे भी, मैं इस पहिये को फिर से बनाने की कोशिश नहीं करूंगा। Mysqldump या mydumper यह काम ठीक करता है। एफडब्ल्यूआईडब्ल्यू, आपको उसी सर्वर पर mysqldump चलाने की ज़रूरत नहीं है जहां डेटाबेस रहता है। Mysqldump --host
. के लिए एक विकल्प का समर्थन करता है इसलिए जब तक फ़ायरवॉल आपके क्लाइंट को कनेक्ट होने से नहीं रोकता है, तब तक आप दूरस्थ डेटाबेस का बैकअप लेने के लिए mysqldump कहीं भी चला सकते हैं। मूल रूप से, यदि आप किसी क्लाइंट होस्ट से किसी PHP ऐप को डेटाबेस से कनेक्ट कर सकते हैं, तो आप mysqldump को कनेक्ट कर सकते हैं।
यदि यह वास्तव में कोई विकल्प नहीं है, तो मैं phpmyadmin की डेटाबेस डंप सुविधा का उपयोग करूंगा। ये परिपक्व और अच्छी तरह से परीक्षित हैं और ये सब कुछ सही ढंग से डंप करते हैं। यहां एक लेख है जो बताता है कि डंप सुविधा का उपयोग कैसे करें:
http://www.techrepublic. com/blog/smb-technologist/import-and-export-databases-use-phpmyadmin/
[मेरी टिप्पणियों को आपके उत्तर से कॉपी करना:]
यह कोड समीक्षा में शामिल हो रहा है, जो स्टैक ओवरफ्लो का उद्देश्य नहीं है। लेकिन संक्षेप में:
- NULL के लिए कोई उचित समर्थन नहीं है (आप उन्हें '' में परिवर्तित करते हैं);
- तालिका नामों का लगातार परिसीमन नहीं करना;
- गैर-एएनएसआई डबल-कोट्स को स्ट्रिंग डिलीमीटर के रूप में उपयोग करना;
- विशाल तालिकाओं पर बफ़र किए गए प्रश्नों का उपयोग करने से PHP की अधिकतम मेमोरी सीमा टूट जाएगी;
- एक विशाल तालिका के लिए सभी पंक्तियों को जोड़ने से PHP की अधिकतम मेमोरी सीमा टूट जाएगी;
- PDO::quote() के बजाय addlashes() का उपयोग करना;
- केवल फ़ंक्शन के अंत में क्वेरी त्रुटियों की जांच करना;
- असफल फ़ाइल निर्माण की जाँच नहीं करना;
- gzip एक्सटेंशन लोड नहीं हो सकता
- साथ ही, संभवत:अभी भी UTF8 डेटा का समर्थन नहीं करता है।
हां, यह मूल डेविड वॉल्श लिपि से बेहतर है। :-)
NULL SQL में '' जैसा नहीं है (Oracle को छोड़कर, लेकिन वे इस मामले में SQL मानक का अनुपालन नहीं कर रहे हैं)। देखें MySQL, NULL या खाली डालने के लिए बेहतर स्ट्रिंग?
मैंने स्मृति सीमा मुद्दे पर कोड को गलत तरीके से पढ़ा। आप प्रत्येक पंक्ति के लिए आउटपुट लिख रहे हैं, तो यह ठीक है (जब तक कि पंक्ति में 1GB ब्लॉब या कुछ और न हो)।
लेकिन आपको पंक्तियों के अल्पविराम से अलग किए गए सेट के साथ केवल एक INSERT कथन का उत्पादन नहीं करना चाहिए। यहां तक कि mysqldump --extended-insert
डेटा की एक सीमित लंबाई को आउटपुट करता है, फिर एक नया INSERT स्टेटमेंट शुरू करता है। मानदंड यह है कि INSERT कथन की लंबाई --net-buffer-length
के विकल्प तर्क में फिट होती है या नहीं .
ANSI SQL में, सिंगल-कोट्स '' का उपयोग स्ट्रिंग लिटरल्स या डेट लिटरल्स को परिसीमित करने के लिए किया जाता है। डबल-कोट्स "" का उपयोग टेबल नाम या कॉलम नामों जैसे पहचानकर्ताओं को सीमित करने के लिए किया जाता है। डिफ़ॉल्ट रूप से, MySQL उनके साथ समान व्यवहार करता है, लेकिन यह गैर-मानक है। देखें क्या अलग-अलग डेटाबेस अलग-अलग नाम उद्धरण का उपयोग करते हैं?ए> . यदि आप अपने बैकअप डेटा को एक MySQL सर्वर पर आयात करने का प्रयास करते हैं जहाँ आपके पास SET SQL_MODE=ANSI_QUOTES
है , आयात विफल हो जाएगा।
उदाहरण:query('SELECT * FROM '.$table);
और वास्तव में प्रत्येक अन्य मामले जहां आप किसी क्वेरी में $table का उपयोग करते हैं। आपने केवल एक बार तालिका को सीमांकित किया है, INSERT कथन में आपकी स्क्रिप्ट आउटपुट।
MySQL हमेशा बैक-टिक को पहचानकर्ता सीमांकक के रूप में और स्ट्रिंग्स/तिथियों के लिए सिंगल-कोट्स को पहचानता है। लेकिन दोहरे उद्धरण मेरे द्वारा उल्लिखित SQL_MODE के आधार पर अर्थ बदलते हैं। आप यह नहीं मान सकते कि आपके द्वारा पुनर्स्थापित किए गए MySQL इंस्टेंस पर कौन सा SQL_MODE प्रभाव में है, इसलिए यदि आप पहचानकर्ताओं के लिए बैक-टिक और स्ट्रिंग्स के लिए सिंगल-कोट्स का उपयोग करते हैं तो यह सबसे अच्छा है। जब आप अपनी तालिका को क्वेरी करते हैं तो आप उन्हें परिसीमित करने का कारण यह है कि आपके पास तालिका नाम हो सकते हैं जो SQL आरक्षित शब्द हैं, या जिनमें विशेष वर्ण हैं, आदि।
आप बिना सीमांकक के सभी संख्यात्मक प्रकार सम्मिलित कर सकते हैं। केवल तार और तिथियों को सीमांकक की आवश्यकता होती है। देखें dev.mysql.com/doc/refman/5.6/hi/literals.html