मैं एक बड़े डेटाबेस के mysqldump को कैसे अनुकूलित कर सकता हूं?


173

मेरे पास एक InnoDB डेटाबेस के साथ एक सिम्फनी एप्लिकेशन है जो कि 57 तालिकाओं के साथ ~ 2GB है। डेटाबेस के आकार का अधिकांश हिस्सा एक ही तालिका (~ 1.2GB) में रहता है। मैं वर्तमान में डेटाबेस का बैकअप लेने के लिए mysqldump का उपयोग कर रहा हूं।

मेरे comcast कनेक्शन के कारण, अगर मैं डंप मैन्युअल रूप से चला रहा हूं तो सर्वर से मेरा कनेक्शन डंप पूरा होने से पहले टाइमआउट हो जाएगा, जिससे मुझे डंप फिर से चलाना होगा। [मैं वर्तमान में एक क्रोन चलाता हूं जो रात को डंप करता है, यह सिर्फ डंप के लिए है जिसे मैं मैन्युअल रूप से चलाता हूं।]

क्या कनेक्शन टाइमआउट समस्या के लिए डंप को गति देने का एक तरीका है, लेकिन इस प्रक्रिया के साथ सर्वर द्वारा कब्जा किए गए समय को भी सीमित करना है?

BTW, मैं वर्तमान में इस समस्या को हल करने के लिए समग्र डेटाबेस के आकार को कम करने पर काम कर रहा हूं।


2
क्या पैरामीटर (यदि कोई हो) आप mysqldump कमांड से गुजर रहे हैं?
तोबी

Add --compact आपके लिए एक विकल्प हो सकता है।
तोबी

वास्तव में कुछ भी नहीं -mysqldump [database] -u[user] -p'[password]' > db_backup.sql
पैट्रिक

4
screenआपकी स्थिति के लिए एक सरल विकल्प उपयोग nohupकरना होगा, यह आपके कमांड को सर्वर पर चालू रखने की अनुमति देगा, भले ही आपका कनेक्शन गिरा हो। जैसे nohup mysqldump [options] > backup.sql 2> backup.err &। यदि आप इसके लिए आउटपुट फ़ाइल नहीं देते हैं nohup, तो यह nohup.outडिफ़ॉल्ट रूप से बन जाएगा।
dabest1

1
एक नज़र डालें atऔर screen(बाद में यदि स्थापित है, लेकिन atसभी यूनिक्स पर मानक है) या ServerAliveIntervalबहुत लंबे निष्क्रिय कनेक्शन के बाद फायरवॉल से निपटने के तरीकों के लिए एसएसएच के लिए विकल्प।
मैटबायनको

जवाबों:


134

इस तरह से डंप में मुख्य अड़चन ड्राइव I / O है। आप डेटा का लोड पढ़ रहे हैं और इसे फिर से लिख रहे हैं। आप इसे कई तरीकों से गति दे सकते हैं:

  • सुनिश्चित करें कि आपका आउटपुट एक से अधिक ड्राइव (ओं) पर जा रहा है जो डेटाबेस फ़ाइलों पर संग्रहीत हैं - यह कताई डिस्क के साथ एक बड़ा अंतर बना देगा क्योंकि ड्राइव हेड्स लगातार उस स्थान के बीच से नहीं टकराए जा रहे होंगे जहां से पढ़ा जा रहा है और जिस स्थान पर लिखा जा रहा है।
  • Mysqldump का आउटपुट बहुत संकुचित होगा, इसलिए यदि आप इनपुट से आउटपुट को अलग नहीं कर सकते हैं जैसा कि ऊपर दिए गए पाइप के माध्यम से gzipया इसी तरह आउटपुट से होता है। यह कुछ सीपीयू समय की लागत पर (जो आप समग्र आईओ लोड को कम करते हैं, और हेड मूवमेंट की मात्रा को घटाते हैं) कुछ सीपीयू समय (जो कि आपके पास इन दिनों बहुत अधिक हो सकता है) को कम कर देगा।
  • इसके अलावा, (या अच्छी तरह से या संपीड़न के बजाय) एक पाइप उपयोगिता (जैसे पीवी ) के माध्यम से आउटपुट पास करते हैं जो बड़े राइट बफ़र्स को ड्राइव ब्लॉक्स को लिखे गए समूह ब्लॉक को बड़े पैमाने पर समर्थन करते हैं, फिर से सिर-आंदोलन विलंबता के प्रभाव को कम करने के लिए - यह बना देगा काफी अंतर अगर --quickविकल्प का उपयोग करके बड़ी तालिकाओं के बैकअप प्रभाव को कम करने के लिए)।
  • IO लोड अन्यथा कम होने पर केवल अपनी बैकअप प्रक्रिया चलाएँ।

यद्यपि आप गलत समस्या को ठीक कर रहे हैं: इसके बजाय कनेक्शन ड्रॉप्स को संबोधित करना आसान हो सकता है (हालांकि आपके बैकअप द्वारा लगाए गए I / O लोड को कम करने से आपको अन्य उपयोगकर्ताओं पर पड़ने वाले प्रभाव को कम करने में मदद मिलेगी, वैसे भी कोशिश करने लायक है)। क्या आप स्क्रीन के माध्यम से अपने मैनुअल बैकअप (या tmux जैसे समान उपकरण ) चला सकते हैं? इस तरह अगर सर्वर से आपका कनेक्शन टूट जाता है तो आप screenबिना किसी प्रक्रिया के सत्र को पुन: कनेक्ट और रीटैक कर सकते हैं ।

यदि आप सीधे कनेक्शन पर डेटा भेज रहे हैं (यानी आप दूरस्थ डेटाबेस के खिलाफ अपने स्थानीय मशीन पर mysqldump चला रहे हैं, तो स्थानीय रूप से डंप दिखाई देता है) तो आप पहले सर्वर पर डंप को चलाने से बेहतर हो सकते हैं, जरूरत के अनुसार संपीड़ित कर सकते हैं, फिर स्थानांतरित कर सकते हैं एक उपकरण का उपयोग कर नेटवर्क पर डेटा (जैसे rsync) जो आंशिक हस्तांतरण का समर्थन करता है ताकि आप कनेक्शन को फिर से शुरू कर सकें (पुनरारंभ करने के बजाय) यदि कोई कनेक्शन ड्रॉप इसे बाधित करता है।

आपके "इस मुद्दे को हल करने के लिए समग्र डेटाबेस के आकार को कम करने" के हिस्से के रूप में, मुझे लगता है कि आपके डेटा का एक बड़ा हिस्सा नहीं बदलता है। आप उस मुख्य टेबल से 1.2Gb के एक बड़े हिस्से को दूसरे में स्थानांतरित करने में सक्षम हो सकते हैं और mysqldumpकॉल से कॉपी किए गए उन लोगों को हटा सकते हैं । यदि आप कभी नहीं बदलते हैं तो आपको हर बार इस डेटा का बैकअप लेने की आवश्यकता नहीं है। इस तरह से तालिकाओं और डेटाबेस के बीच डेटा को विभाजित करना आमतौर पर डेटा विभाजन के रूप में संदर्भित किया जाता है और आपको कई ड्राइव पर डेटा और I / O लोड को फैलाने की अनुमति भी दे सकता है। हाई-एंड डेटाबेस ने स्वचालित विभाजन के समर्थन में बनाया है, हालांकि mysql में आपको संभवतः इसे मैन्युअल रूप से करना होगा और इसके लिए अपने डेटा एक्सेस लेयर को बदलना होगा।

इस साइट के लिए ऑफ-टॉपिक (ताकि आपको संभवतः अधिक विवरण की आवश्यकता हो, यह पूछने के लिए सर्वरफॉल्ट या सुपरयूजर पर चुटकी लेनी चाहिए): यदि आप निष्क्रियता के कारण कनेक्शन खो रहे हैं, तो अपने एसएसएच सर्वर और एसएसएच क्लाइंट में विकल्पों की जांच करें। सुनिश्चित करें कि जिंदा पैकेट सक्षम हैं और अक्सर पर्याप्त भेजे जाते हैं। यदि कनेक्शन सक्रिय होने पर भी बूँदें दिखाई दे रही हैं, तो आप कनेक्शन को लपेटने के लिए OpenVPN या समान का उपयोग करने का भी प्रयास कर सकते हैं - यह एक छोटी बूंद को संभालना चाहिए, यहां तक ​​कि एक पूर्ण ड्रॉप अगर आपका पूरा कनेक्शन कुछ सेकंड के लिए नीचे है, जैसे कि SSH क्लाइंट और सर्वर ध्यान नहीं देता।


काश, मैं अपने सर्वरों पर गिरा ssh कनेक्शनों की संख्या को कम कर सकता। यदि मैं टर्मिनल को ~ 60 सेकंड से अधिक समय तक उपयोग नहीं करने की उम्मीद करता हूं तो मैं topयह सुनिश्चित करने के लिए दौड़ता हूं कि कनेक्शन ड्रॉप नहीं होता है। (और मुझे पूरा यकीन है कि यह कॉमकास्ट कनेक्शन है क्योंकि हम केवल काम में एक मानक WRT राउटर और फ़ायरवॉल का उपयोग कर रहे हैं और मेरे घर का कॉमाकास्ट कनेक्शन कभी नहीं गिरता)
पैट्रिक

मैंने SSH कनेक्शन के लिए एक लघु नोट जोड़ा है।
डेविड स्पिललेट

2
इस उत्तर में गहराई और अंतर्दृष्टि। आपको इसके लिए +3 प्राप्त करना चाहिए। क्षमा करें, मैं आपको केवल +1 दे सकता हूं।
रोलैंडम्यूसीडीडीबीए

116

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: अपने उपयोग का उपयोग करें

स्वच्छ स्नैपशॉट के लिए उपर्युक्त विकल्प प्लस तकनीकों की विविधताएं आज़माएं

उदाहरण

  1. आरोही या उतरते हुए प्रत्येक तालिकाओं के आकार द्वारा तालिकाओं की सूची का आदेश दें।
  2. अलग प्रक्रिया का उपयोग करके, mysqldumps को लॉन्च करने से पहले "FLUSH TABLES with READ LOCK; SELECT SLEEP (86400)" चलाएं। Mysqldumps पूरा होने के बाद इस प्रक्रिया को मारें। यदि डेटाबेस में InnoDB और MyISAM दोनों हों तो यह मददगार है
  3. दिनांकित फ़ोल्डरों में mysqldumps को सहेजें और पुराने बैकअप फ़ोल्डरों को घुमाएं।
  4. पूरे उदाहरण 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 से दूर भागते हैं और वे उपकरण वास्तव में अच्छे हैं।

ऐसे उपकरणों में शामिल हैं

  1. MAATKIT (समानांतर डंप / पुनर्स्थापना स्क्रिप्ट, पेरकोना से [पदावनत लेकिन महान])
  2. XtraBackup (Percona से TopNotch स्नैपशॉट बैकअप)
  3. CDP R1Soft ( MySQL मॉड्यूल विकल्प जो पॉइंट-इन-टाइम स्नैपशॉट लेता है)
  4. MySQL एंटरप्राइज बैकअप (पूर्व में InnoDB हॉट बैकअप [वाणिज्यिक])

यदि आपके पास एक सच्चे MySQL DBA की भावना है, तो आप mysqldump को गले लगा सकते हैं और इस पर पूरी महारत हासिल कर सकते हैं। आपके सभी बैकअप एक MySQL DBA के रूप में आपके कौशल का प्रतिबिंब हो सकते हैं


2
Mysqldump के अच्छे उपयोग के लिए +1: साथ ही यदि आपके पास एक सच्चे MySQL DBA की भावना है, तो आप mysqldump को गले लगा सकते हैं और इस पर पूरी महारत हासिल कर सकते हैं। अपने सभी बैकअप एक MySQL DBA के रूप में अपने कौशल का प्रतिबिंब हो सकता है .... महान लाइनों !!!
अब्दुल मनफ

4
InnoDB में, व्यक्तिगत रूप से डंपिंग टेबल आपको एक असंगत बैकअप देगा।
एलेन कॉलिन्स

5
@AlainCollins यही कारण है कि मैं एक प्रतिकृति गुलाम पर mysqldumps चलाते हैं जो केवल पढ़ा जाता है। एक बार Seconds_Behind_Master 0 होने पर, आप STOP SLAVE चलाते हैं। अब आपके पास किसी भी उपरोक्त शैली में mysqldumps करने के लिए एक सुसंगत बिंदु है। मैंने पिछले 5 वर्षों में ऑनलाइन ट्रेडिंग कंपनियों के लिए ऐसा किया है, क्योंकि मुझे या मेरे कंपनी मालिकों को एक भी शिकायत नहीं हुई है। इस पल के रूप में, मैं इस ग्राहक के लिए हर 10 मिनट में समानांतर mysqldumps करता हूं। मैं अन्य ग्राहकों के लिए भी तेजी से बैकअप अवधि प्रदान करने के लिए ऐसा करता हूं।
RolandoMySQLDBA

मेरे पास एक 32GB db है इसलिए विकल्प 3 वही है जो मेरे मन में था! धन्यवाद!
रेमंड

मुझे बहुत बड़े को सिकोड़ने के लिए 1TB डेटा का बैकअप और पुनः आयात करना पड़ता है ibdata1। हार्डवेयर RAID द्वारा समर्थित SSDs के समय में विकल्प 3 मेरे लिए एकमात्र समाधान है।
रबडडे

18

गुलाम के लिए MySQL प्रतिकृति मास्टर पर एक नज़र है। यह आपको मास्टर के डेटाबेस को उसी डेटाबेस के साथ किसी अन्य डेटाबेस सर्वर पर क्लोन करने की अनुमति देता है। जिसमें गुरु और दास की पहचान शामिल है। दास खुद को मास्टर डेटाबेस सर्वर और उसके डेटाबेस की सटीक प्रतिलिपि बनाता है। एक-एक, एक-कई, कई-एक संबंध मास्टर (s) और दास (s) के बीच हो सकते हैं।

दास लगातार मास्टर पर बाइनरी लॉग पढ़ता है (बिन लॉग मास्टर डेटाबेस सर्वर पर लिखे गए प्रश्नों को संग्रहीत करता है) और अपने दास डेटाबेस सर्वर पर इनपुट प्राप्त करता है। (इसका मतलब है कि आपका मास्टर डेटाबेस बिल्कुल प्रभावित नहीं होगा)

अच्छी खबर यह है कि यह आपके MySQL सर्वर को बहुत अधिक प्रभावित नहीं करेगा क्योंकि आप किसी भी डाउनटाइम या धीमी क्वेरी प्रतिक्रियाओं को नोटिस नहीं करेंगे। हम इसे 10 जीबी डेटाबेस के लिए उपयोग करते हैं और यह बिना किसी डाउनटाइम के एक आकर्षण की तरह काम करता है।

वही मशीन पर MySQL प्रतिकृति


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

4
+1 मुख्य डीबी से बैकअप के आईओ लोड को हटाने के लिए एक प्रतिकृति का समर्थन करने के लिए, और एक महत्वपूर्ण कैविएट के साथ संभावित लॉकिंग से संबंधित मुद्दों को कम करने के लिए: दास पर अपने संचालन के रूप में "उसी मशीन पर प्रतिकृति" विकल्प के साथ सावधान रहें। IO बैंडविड्थ के लिए मास्टर के साथ प्रतिस्पर्धा कर सकते हैं - सुनिश्चित करें कि इस मुद्दे को कम करने के लिए दास की डेटा फाइलें मास्टर की तुलना में एक अलग ड्राइव / सरणी हैं।
डेविड स्पिललेट

1
डेविड स्प्ललेट की टिप्पणी पर डीटो। मैं अपने वेब होस्टिंग एम्प्लॉयर के लिए दासों पर mysqldump बैकअप के साथ दर्जनों मास्टर / दासों को सेटअप और रखरखाव करता हूं। मेरे से भी +1।
रोलैंडमाइसीडीडीबीए

16

प्लान ए: पर्कोना से भी Xtrabackup देखें। यह किसी भी महत्वपूर्ण लॉकिंग के बिना, InnoDB के ऑनलाइन बैकअप की अनुमति देता है।

प्लान बी: ​​एक दास को रोका जा सकता है, और आप किसी भी तरह से किसी भी माध्यम से एक सुसंगत बैकअप ले सकते हैं (कॉपी फाइलें, mysqldump, xtrabackup, आदि)

प्लान C: LVM स्नैपशॉट। कुछ क्रिप्टिक सेटअप के बाद, डेटाबेस के आकार की परवाह किए बिना बैकअप के लिए डाउनटाइम एक मिनट से भी कम है। आप mysqld को रोकते हैं, स्नैपशॉट करते हैं, mysqld को पुनरारंभ करते हैं, फिर स्नैपशॉट की प्रतिलिपि बनाते हैं। अंतिम चरण में लंबा समय लग सकता है, लेकिन MySQL नीचे नहीं है।

प्लान डी: एक गुलाम का स्नैपशॉट - शून्य डाउनटाइम।


2
चारों योजनाओं के लिए हूर। मैं केवल प्रति उत्तर +0.25 दे सकता हूँ !!! +1 (4 x 0.25)
रोलैंडम्यूसीडीडीबीए

15

कुछ व्यवस्थापक पहले बताते हैं: क्या आप एक ftp करने के लिए कनेक्ट कर रहे हैं या आप ssh'ed में हैं और यह मर रहा है? यदि ssh है, तो स्क्रीन का उपयोग करना सुनिश्चित करें ताकि आप comcast दुर्घटना के बाद फिर से शुरू कर सकें। यदि ftp है, तो सुनिश्चित करें कि आप भेजने से पहले इसे / tar कंप्रेस कर रहे हैं।

इसके अलावा --opt पैरामीटर या --quick आज़माएं

- इस विकल्प को चुनें डंप और पुनः लोड संचालन को अधिक कुशल बनाने के लिए अतिरिक्त विकल्पों के एक सेट को चालू करता है। विशेष रूप से, यह --add-drop-table, --add-locks, --all, --quick, --extended-insert, -lock-tables और --disable- कीज़ के विकल्पों को एक साथ इस्तेमाल करने के बराबर है। ध्यान दें कि यह विकल्प आउटपुट को कम पोर्टेबल बनाता है और अन्य डेटाबेस सिस्टम द्वारा समझने की कम संभावना है।

--quick यह विकल्प mysqldump को डंप आउटपुट लिखने के लिए कहता है क्योंकि यह सर्वर से प्रत्येक पंक्ति को पढ़ता है, जो बड़े तालिकाओं के लिए उपयोगी हो सकता है। डिफ़ॉल्ट रूप से, mysqldump आउटपुट लिखने से पहले एक तालिका से सभी पंक्तियों को मेमोरी में पढ़ता है; बड़ी तालिकाओं के लिए, इसमें बड़ी मात्रा में मेमोरी की आवश्यकता होती है, जिससे संभवतः डंप विफल हो जाता है।


1
विल - फाइल का आकार नहीं बढ़ाएगा जो अंततः आउटपुट प्राप्त करेगा?
तोबी

यह कुछ जोड़ देगा - मैं जोड़ने का मतलब था - जो उसकी समस्या के जवाब में अधिक है .... अब संपादन। धन्यवाद!
डेविड हॉल

स्क्रीन के लिए +1, जो इस समस्या से पूरी तरह से बचा जाता है
गयुस

Mysqldump के --opt और --quick स्पष्टीकरण के लिए एक बहुत अच्छा और संक्षिप्त जवाब के लिए +1।
RolandoMySQLDBA

1
- डिफ़ॉल्ट रूप से अपनाने पर है।
जॉर्डन

5

मैं बड़े डेटाबेस के डंप के दौरान भी टाइमआउट की समस्या रखता था। मैं अंत में हल किया अगर db में हर टेबल के लिए अलग-अलग कमांड भेजकर और इस तरह से एक फ़ाइल में कुछ भी जोड़ दिया जाए:

TABLES=`mysql -u $USER -p$PWD -Bse 'show tables' $DB`
for TABLE in $TABLES
do
    mysqldump -u $USER -p$PWD $DB $TABLE >> dump.sql
done

4
इसे एक "असंगत" बैकअप माना जाता है, इसमें पुनर्स्थापना पर आपके पास एक तालिका में डेटा हो सकता है जो किसी अन्य के लिए मैप करता है, लेकिन मौजूद नहीं है।
मॉर्गन टोकर

3

मुझे लगता है कि सवाल यह है कि कैसे mysqldump की निर्मित डंप फ़ाइलों से तेजी से पुनर्स्थापित किया जाए, एक अलग बैकअप समाधान नहीं।

इन तरीकों में से एक, आप अपने स्कीमा में तालिकाओं के समूह बनाकर कर सकते हैं, और प्रत्येक समूह के लिए एक अलग DB उपयोगकर्ता बना सकते हैं, फिर अंत में MySQL अनुमतियों का उपयोग करके सारणियों को सभी लेकिन एक DB उपयोगकर्ता का उपयोग करने की अनुमति नहीं दे सकते।

यह एक सिद्ध, तेज, लगभग समानांतर तकनीक है लेकिन 100% निश्चित नहीं है, 500G या तो जैसे बड़े डंप से बहाल करने में कितना समय लगेगा। लेकिन मेरी विनम्र राय में, आपको समानांतर कुछ चाहिए। एक उदाहरण के लिए नीचे दिए गए लिंक को चेकआउट करें।

[तेज, MySQL के लिए SQL डंप (mysqldump) से समानांतर पुनर्स्थापना] [1]

http://geeksww.com/tutorials/database_management_systems/mysql/tips_and_tricks/fast_parallel_restore_from_sql_dumps_mysqldump_for_mysql.php

"MySQL के लिए SQL डंप (mysqldump) से तेज, समानांतर पुनर्स्थापना"


2
यह दूसरे प्रश्न के आपके उत्तर की एक सटीक प्रति है । आप इस विशिष्ट प्रश्न के लिए इसे और अधिक अनुकूलित करना चाह सकते हैं।
पॉल व्हाइट

प्रश्न विशेष रूप से तेजी से बहाल करने के तरीके के बारे में नहीं है।
andrew lorien
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.