ZFS स्नैपशॉट के माध्यम से एक MySQL डेटाबेस का बैकअप लेना


12

मैंने कई साइटों को ऐसा करने के बारे में बात करते हुए पाया है, लेकिन मुझे कुछ महत्वपूर्ण विवरण याद आ रहे हैं। सामान्य कदम हैं

  • Daud FLUSH TABLES WITH READ LOCK
  • ZFS स्नैपशॉट लें
  • Daud UNLOCK TABLES

विभिन्न स्रोत रिपोर्ट करते हैं कि InnoDB, जिसका मैं उपयोग कर रहा हूं, वास्तव में कोई सम्मान नहीं करता है FLUSH। MySQL उपयोगकर्ता मैनुअल नोट में FLUSH TABLES...FOR EXPORTInnoDB के साथ उपयोग के लिए एक प्रकार है, लेकिन इसके लिए पूरे डेटाबेस का समर्थन करने के बजाय प्रत्येक तालिका को अलग-अलग निर्दिष्ट करने की आवश्यकता होती है। मैं व्यक्तिगत रूप से प्रत्येक तालिका को निर्दिष्ट करने से बचना चाहता हूं क्योंकि एक अच्छा मौका है तालिकाओं की सूची वास्तव में मौजूद तालिकाओं के साथ सिंक से बाहर हो जाएगी।

मेरे पास जो दूसरी समस्या है, वह है कि मैं कुछ करने की योजना बना रहा हूं mysql -h"$HOST" -u"$USERNAME" -p"$PASSWORD" --execute="FLUSH TABLES WITH READ LOCK"। हालाँकि, सत्र से बाहर निकलने के तुरंत बाद यह लॉक को हटा देता है। यह समझ में आता है, लेकिन जब मैं अपना स्नैपशॉट लेता हूं तो मुझे पढ़ने के लिए लॉक रखने की आवश्यकता होती है, लेकिन यह भी बहुत कष्टप्रद है।

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


तालिकाओं की एक स्थिर सूची क्यों है? आप निश्चित रूप से रनटाइम के दौरान गतिशील रूप से एक सूची तैयार कर सकते हैं।
EEAA 1

1
एक वीएम या नंगे धातु पर डेटाबेस है? क्या स्टोरेज भी उसी मशीन पर है?
माइकल हैम्पटन

EEAA, काफी साफ है।
एंडी शुलमैन

माइकल, डेटाबेस और जेडएफएस बॉक्स अलग-अलग मशीनें हैं, लेकिन न तो वर्चुअलाइज्ड है।
एंडी शुलमैन

@AndyShulman मुझे लगता है कि आपको लेआउट को थोड़ा बेहतर बताना चाहिए। इसका कोई मतलब नहीं है।
ewwhite

जवाबों:


4

यदि आप केवल सभी तालिकाओं के लिए InnoDB का उपयोग करते हैं और इसके लिए सेट innodb_flush_log_at_trx_commitहैं:

  • 1 (InnoDB लॉग बफर की सामग्री प्रत्येक ट्रांजेक्शन कमिट में लॉग फाइल पर लिखी जाती है और लॉग फाइल डिस्क पर फ्लश हो जाती है) या,
  • 2 (प्रत्येक लेन-देन के बाद लॉग फ़ाइल में इनोबीडी लॉग बफर की सामग्री लिखी जाती है और लॉग फ़ाइल को डिस्क पर फ्लश किया जाता है लगभग एक बार प्रति सेकंड),

तब आपको स्नैपशॉट करने से पहले FLUSH TABLES की आवश्यकता नहीं है, बस सीधे ZFS स्नैपशॉट चलाएं। InnoDB डेटा हानि के बिना लेनदेन प्रतिबद्ध लॉग से डेटा को पुनर्प्राप्त कर सकता है।

Ref: https://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit


MySQL 8 में पेश किए गए डेटा डिक्शनरी के साथ , यहां तक ​​कि DDL (स्कीमा मॉडिफिकेशन) ऑपरेशन भी परमाणु हैं। इससे पहले, एक फाइलसिस्टम स्नैपशॉट के दौरान डीडीएल संचालन आंशिक रूप से प्रतिबद्ध (यानी दूषित) परिणाम दे सकता था।
बर्नई

13

आपको लगातार (सर्वाधिक) डेटाबेस (ओं) के बैकअप के लिए एक पूर्ण डेटाबेस लॉक की आवश्यकता होती है।

मैन्युअल https://dev.mysql.com/doc/refman/5.5/en/backup-methods.html कहता है कि FLUSH TABLES with READ LOCK विशेष रूप से ZFS स्नैपशॉट के लिए सही है।

फाइल सिस्टम स्नैपशॉट का उपयोग करके बैकअप बनाना

यदि आप वेरिटास फ़ाइल सिस्टम का उपयोग कर रहे हैं, तो आप इस तरह से एक बैकअप बना सकते हैं:

  1. क्लाइंट प्रोग्राम से, निष्पादित करें FLUSH TABLES WITH READ LOCK
  2. दूसरे शेल से, माउंट vxfsस्नैपशॉट निष्पादित करें ।
  3. पहले ग्राहक से, निष्पादित करें UNLOCK TABLES
  4. स्नैपशॉट से फ़ाइलों की प्रतिलिपि बनाएँ।
  5. स्नैपशॉट को अनमाउंट करें।

इसी तरह की स्नैपशॉट क्षमताएं अन्य फ़ाइल सिस्टम में उपलब्ध हो सकती हैं, जैसे LVM या ZFS।

यह हास्यास्पद की तरह है कि वे तथ्य यह है कि आप की जरूरत बाहर छोड़ दिया FLUSH TABLES table_a, table_b, table_c FOR EXPORTके लिए InnoDB इन निर्देशों से। प्रत्येक तालिका को उस तरह निर्दिष्ट करना भी बेवकूफी है। लेकिन जैसा कि ईईएए कहता है, आप तालिकाओं की एक सूची तैयार कर सकते हैं क्योंकि आप बैकअप को आसानी से शुरू करते हैं।

ताला पकड़ने के लिए, आपको स्नैपशॉट प्रदर्शन करते समय db कनेक्शन को सक्रिय रखना चाहिए

आम तौर पर मैं पर्ल या किसी अन्य प्रोग्रामिंग भाषा का उपयोग करता हूं जो कनेक्ट कर सकता है, db को लॉक कर सकता है और db कनेक्शन को बनाए रखते हुए स्नैपशॉट ले सकता है, फिर अनलॉक और डिस्कनेक्ट कर सकता है। यह जटिल नहीं है। मैं चाहता हूँ कि वहाँ उपकरण है कि यह पहले से ही है, लेकिन एक लेखन आसान है।

मैं कहता हूं आसान है, जटिल नहीं, आदि .. कुछ समय। मैं मान रहा हूं कि आपके पास कुछ बुनियादी प्रोग्रामिंग या अच्छी स्क्रिप्टिंग स्किल्स हैं।


मुझे इस तरह की वैचारिक सरल स्क्रिप्ट बैश में रखने की उम्मीद थी, लेकिन आप सही स्विचिंग भाषाएँ हैं जो इसे बहुत आसान बनाती हैं। मैं आपका जवाब गलत पढ़ने हो सकता है, लेकिन यह तुम कह रहे हो मैं दोनों पर अमल करने की जरूरत है लग रहा है FLUSH TABLES WITH READ LOCKऔर उसके बाद FLUSH TABLES...FOR EXPORT, जबकि MySQL मैनुअल के अपने पढ़ने का कहना है केवल एक आवश्यक होना चाहिए।
एंडी शुलमैन

क्षमा करें, मैं स्पष्ट नहीं था। मैं बस मैनुअल से जा रहा हूं और यह दो अलग-अलग चीजें कहती है। मुझे लगता है कि आप सही हैं और केवल बाद की आवश्यकता है। लेकिन सभी तालिकाओं को एक कमांड में बंद किया जाना चाहिए।
बजे रयान बाबशिन

1
यह देखते हुए कि दस्तावेज़ीकरण बहुत स्पष्ट नहीं है, पूरे डेटाबेस को लॉक करने की आवश्यकता है, और स्नैपशॉट लेते समय एक DB कनेक्शन को बनाए रखना पड़ता है, बस DB को बंद करना, इसे वापस करना, और पुनः आरंभ करना आसान लगता है यह।
एंड्रयू हेनले

2
@ और आह ... मैं समझता हूँ। लेकिन यह धीमा होगा, कनेक्शन को छोड़ने / विफल होने का कारण होगा और मैंने देखा है कि यह डेटाबेस को ठीक से वापस आने में विफल रहता है (स्वचालन के लिए खराब)। Mysql / Oracle से एक निश्चित उत्तर प्राप्त करना अच्छा होगा। उनके पास एक मेलिंग सूची होनी चाहिए।
रयान बाबशिन

7

मैं फट गया हूं और बैश में एक वैचारिक रूप से सरल स्क्रिप्ट को अनुकूलित किया है जो मुझे टोबिया द्वारा एक और सर्वर फॉल्ट पोस्ट में मिला है । यह आपको वहां के रास्ते का लगभग 90% हिस्सा मिलना चाहिए।

mysql_locked=/var/run/mysql_locked

# flush & lock MySQL, touch mysql_locked, and wait until it is removed
mysql -hhost -uuser -ppassword -NB <<-EOF &
    flush tables with read lock;
    delimiter ;;
    system touch $mysql_locked
    system while test -e $mysql_locked; do sleep 1; done
    exit
EOF

# wait for the preceding command to touch mysql_locked
while ! test -e $mysql_locked; do sleep 1; done

# take a snapshot of the filesystem, while MySQL is being held locked
zfs snapshot zpool/$dataset@$(date +"%Y-%m-%d_%H:%M")

# unlock MySQL
rm -f $mysql_locked

यहां, mysqlआपके द्वारा उपयोग की जाने वाली कमांड पृष्ठभूमि में चलती है और एक फ़ाइल को छूती है। यह फ़ाइल से बाहर निकलने से पहले गायब होने की पृष्ठभूमि में प्रतीक्षा करता है और इस प्रकार तालिकाओं को अनलॉक करता है। इस बीच मुख्य स्क्रिप्ट तब तक इंतजार करती है जब तक फ़ाइल मौजूद नहीं होती है, तब स्नैपशॉट बनाता है और फ़ाइल को हटा देता है।

फ़ाइल $mysql_lockedको दोनों मशीनों के लिए सुलभ होने की आवश्यकता है, जिसे आप आसानी से कर सकते हैं, क्योंकि वे दोनों एक आम डेटासेट का उपयोग कर सकते हैं (यद्यपि वे अलग-अलग रास्तों का उपयोग कर सकते हैं, और आपको इसके लिए खाता होना चाहिए)।


मैं MySQL स्क्रिप्टिंग नहीं जानता, इसलिए यह एक मूर्खतापूर्ण विचार हो सकता है, लेकिन क्या आप system zfs snapshot...मुख्य स्क्रिप्ट के अंदर नहीं कर सकते ? या स्नैप-शॉट को एक अलग प्रक्रिया में चलाना पड़ता है?
ट्रिपएपाउंड

@ ट्राइफाउंड में दोनों चीजों को किसी भी तरह समानांतर रूप से होने की जरूरत है
रयान बबचिशिन

@RyanBabchishin मुझे लगता है कि वह सही है, वास्तव में। SYSTEMआदेश बातें स्थानीय रूप से चलाता है। अगर मैं FreeBSD बॉक्स पर mysql क्लाइंट चलाता हूं और निष्पादित करता हूं LOCK; SYSTEM zfs snapshot; UNLOCK, तो ऐसा लगता है कि यह काम करेगा।
एंडी शुलमैन

@ और मैंने सिर्फ इतना कहा कि उन्हें समानांतर रूप में होना चाहिए। कोई फर्क नहीं पड़ता कि आप इसके बारे में कैसे जाते हैं।
रयान बाबशिन

2

आपको myisam के लिए READ LOCK के साथ FLUSH TABLES की आवश्यकता है क्योंकि यह जर्नलिंग नहीं है।

आपको वास्तव में, IMO में मासूमियत के लिए कुछ भी करने की आवश्यकता नहीं है, क्योंकि यह जर्नलिंग है। यह वैसे भी सुसंगत होगा, बस अगर स्वचालित रूप से आपके द्वारा स्नैपशॉट में कुछ भी हो रहा है तो पत्रिका को स्वचालित रूप से वापस करता है।

यदि आप आवेदन स्तर की निरंतरता चाहते हैं, तो आपके आवेदन को लेनदेन का उपयोग करना चाहिए। यदि आपका एप्लिकेशन लेन-देन और निर्दोष का उपयोग करता है, तो कोई भी स्नैपशॉट संगत होगा जो स्वचालित रूप से आवेदन स्तर तक का रास्ता पूछेगा।


2

यह मेरा समाधान है कि लॉक रखते हुए ZFS स्नैपशॉट कैसे बनाया जाए:

mysql << EOF
    FLUSH TABLES WITH READ LOCK;
    system zfs snapshot data/db@snapname
    UNLOCK TABLES;
EOF
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.