Mysqldump के साथ इनसाइट्स करना शुरू करें
IMHO डूइंग बैकअप एक कला रूप बन गया है अगर आपको पता है कि इसे कैसे करना है
आपके पास विकल्प हैं
विकल्प 1: mysqldump संपूर्ण mysql उदाहरण
यह सबसे आसान है, नो-ब्रेनर !!!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
एक फ़ाइल में लिखा गया सब कुछ: तालिका संरचनाएं, अनुक्रमित, ट्रिगर, संग्रहीत कार्यविधियाँ, उपयोगकर्ता, एन्क्रिप्टेड पासवर्ड। अन्य mysqldump विकल्प INSERT आदेशों की विभिन्न शैलियों, लॉग फ़ाइल और बाइनरी लॉग्स, डेटाबेस निर्माण विकल्पों, आंशिक डेटा (- जहाँ विकल्प), और इसके आगे से निर्देशांक भी निर्यात कर सकते हैं।
विकल्प 2: mysqldump अलग-अलग डेटा फ़ाइलों में अलग डेटाबेस
डेटाबेस की सूची बनाकर शुरू करें (ऐसा करने के लिए 2 तकनीकें)
तकनीक 1
mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
तकनीक 2
mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
तकनीक 1 सबसे तेज़ तरीका है। तकनीक 2 सबसे सुरक्षित और सुरक्षित है। तकनीक 2 बेहतर है क्योंकि, कभी-कभी, उपयोगकर्ता सामान्य उद्देश्यों के लिए / var / lib / mysql (datadir) में फ़ोल्डर बनाते हैं जो डेटाबेस से संबंधित नहीं हैं। Info_schema फ़ोल्डर को info_schema.schemata तालिका में डेटाबेस के रूप में पंजीकृत करेगा। तकनीक 2 उन फ़ोल्डरों को बायपास करेगी, जिनमें mysql डेटा नहीं है।
एक बार जब आप डेटाबेस की सूची संकलित कर लेते हैं, तो आप सूची के माध्यम से लूप को आगे बढ़ा सकते हैं और उन्हें mysqldump कर सकते हैं, यहां तक कि समानांतर में यदि वांछित हो।
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
यदि एक समय में बहुत सारे डेटाबेस लॉन्च होते हैं, तो समानांतर 10 उन्हें एक बार में डंप करते हैं:
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
विकल्प 3: mysqldump अलग-अलग डेटा फ़ाइलों में अलग-अलग तालिकाएँ
तालिकाओं की सूची बनाकर प्रारंभ करें
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt
फिर 10 के समूहों में सभी तालिकाओं को डंप करें
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
विकल्प 4: अपने उपयोग का उपयोग करें
स्वच्छ स्नैपशॉट के लिए उपर्युक्त विकल्प प्लस तकनीकों की विविधताएं आज़माएं
उदाहरण
- आरोही या उतरते हुए प्रत्येक तालिकाओं के आकार द्वारा तालिकाओं की सूची का आदेश दें।
- अलग प्रक्रिया का उपयोग करके, mysqldumps को लॉन्च करने से पहले "FLUSH TABLES with READ LOCK; SELECT SLEEP (86400)" चलाएं। Mysqldumps पूरा होने के बाद इस प्रक्रिया को मारें। यदि डेटाबेस में InnoDB और MyISAM दोनों हों तो यह मददगार है
- दिनांकित फ़ोल्डरों में mysqldumps को सहेजें और पुराने बैकअप फ़ोल्डरों को घुमाएं।
- पूरे उदाहरण mysqldumps को स्टैंडअलोन सर्वर में लोड करें।
चेतावनी
केवल विकल्प 1 सब कुछ लाता है। दोष यह है कि इस तरह से बनाए गए mysqldumps को केवल mysql के उसी बड़ी रिलीज़ संस्करण में पुनः लोड किया जा सकता है जिसे mysqldump उत्पन्न किया गया था। दूसरे शब्दों में, MySQL 5.0 डेटाबेस से एक mysqldump को 5.1 या 5.5 में लोड नहीं किया जा सकता है। कारण ? Mysql स्कीमा प्रमुख रिलीज के बीच कुल अलग है।
विकल्प 2 और 3 में उपयोगकर्ता नाम और पासवर्ड सहेजना शामिल नहीं है।
यहां उन उपयोगकर्ताओं के लिए SQL अनुदान डंप करने का सामान्य तरीका है जो पठनीय और अधिक पोर्टेबल है
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql
विकल्प 3 संग्रहीत प्रक्रियाओं को नहीं बचाता है, इसलिए आप निम्न कार्य कर सकते हैं
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
एक और बात जिस पर ध्यान दिया जाना चाहिए वह है InnoDB। यदि आपके पास एक बड़ा InnoDB बफ़र पूल है, तो यह किसी भी बैकअप को करने से पहले आपको सबसे अच्छा फ्लश करने के लिए समझ में आता है। अन्यथा, MySQL बफर पूल से बचे हुए गंदे पृष्ठ के साथ समय निस्तब्धता टेबल खर्च करता है। यहाँ मेरा सुझाव है:
बैकअप करने से लगभग 1 घंटे पहले इस SQL कमांड को चलाएं
SET GLOBAL innodb_max_dirty_pages_pct = 0;
MySQL में 5.5 डिफॉल्ट innodb_max_dirty_pages_pct 75 है। MySQL में 5.1 और बैक में, डिफॉल्ट innodb_max_dirty_pages_pct 90 है। innodb_max_dirty_pages_pct को 0 पर सेट करके, यह गंदे पेजों को डिस्क में डालने की जल्दबाजी करेगा। यह किसी भी InnoDB तालिकाओं के खिलाफ किसी भी mysqldump प्रदर्शन करने से पहले InnoDB डेटा के किसी भी अधूरे दो-चरण आवागमन की सफाई के प्रभाव को कम या कम करेगा।
अंतिम शब्द mysqldump पर
अधिकांश लोग अन्य साधनों के पक्ष में mysqldump से दूर भागते हैं और वे उपकरण वास्तव में अच्छे हैं।
ऐसे उपकरणों में शामिल हैं
- MAATKIT (समानांतर डंप / पुनर्स्थापना स्क्रिप्ट, पेरकोना से [पदावनत लेकिन महान])
- XtraBackup (Percona से TopNotch स्नैपशॉट बैकअप)
- CDP R1Soft ( MySQL मॉड्यूल विकल्प जो पॉइंट-इन-टाइम स्नैपशॉट लेता है)
- MySQL एंटरप्राइज बैकअप (पूर्व में InnoDB हॉट बैकअप [वाणिज्यिक])
यदि आपके पास एक सच्चे MySQL DBA की भावना है, तो आप mysqldump को गले लगा सकते हैं और इस पर पूरी महारत हासिल कर सकते हैं। आपके सभी बैकअप एक MySQL DBA के रूप में आपके कौशल का प्रतिबिंब हो सकते हैं ।