2012-04-14 13 views
11

चेतावनी: पृष्ठभूमि जानकारी काफी लंबी है। यदि आपको लगता है कि आपको पृष्ठभूमि की जानकारी से पहले प्रश्न की आवश्यकता है तो नीचे जाएं। उस समय की सराहना करें जो यह करने वाला है!मैनेशिया डेटाबेस बैकअप/पुनर्स्थापित करने का सही तरीका क्या है?

मैं पूरे वेब पर हूं (Google पढ़ें) और मुझे कोई अच्छा जवाब नहीं मिला है। हां, erlang.org साइट पर मैनेशिया दस्तावेज के बहुत सारे लिंक और संदर्भ हैं लेकिन यहां तक ​​कि वे लिंक संस्करण-इटिस से पीड़ित हैं।

तो सबसे सरल मामले में जहां नोड() जो आप वर्तमान में कनेक्ट हैं, तालिका सेट के मालिक के समान ही है, तो बैकअप/पुनर्स्थापना काम करने जा रही है। उदाहरण के लिए:

$ erl -sname mydatabase 

> mnesia:start(). 
> mnesia:create_schema(...). 
> mnesia:create_table(...). 
> mnesia:backup("/tmp/backup.bup"). 
> mnesia:restore("/tmp/backup.bup", [{default_op, recreate_tables}]). 

अरे यह बहुत अच्छा काम करता है!

$ erl -sname mydbadmin 

> rpc:call([email protected], mnesia, backup, ["/tmp/backup.bup"]). 
> rpc:call([email protected], mnesia, restore, ["/tmp/backup.bup", [{default_op, recreate_tables}]]). 

बेशक यह आसान था:

हालांकि, अगर डेटाबेस वास्तव में एक दूरस्थ नोड() या एक दूरस्थ नोड() एक दूरस्थ संभोग पर पर चल रहा है तो आप बैकअप इस तरह से शुरू करने के लिए है भी। अब यहाँ मुश्किल चीजें हैं ....

  • मान लें कि आप दैनिक बैकअप ले रहे हैं। और आप मैनेशिया डेटाबेस सर्वर मर जाते हैं और आपको हार्डवेयर को प्रतिस्थापित करने के लिए मजबूर किया जाता है। यदि आप डीबी को पुनर्स्थापित करना चाहते हैं तो आपको उस नए नाम को उसी नाम से नामित करने की आवश्यकता है जिसे पहले किया गया था और आपको नोड्स को भी नाम देने की आवश्यकता है।
  • यदि आप हार्डवेयर और/या नोड() का नाम बदलना चाहते हैं ... या आप एक अलग मशीन पर पुनर्स्थापित करना चाहते हैं, तो आपको नोड_चेंज प्रक्रिया के माध्यम से जाना होगा। (here और मैनेशिया डॉक्स में वर्णित)

लेकिन यहां चीजें जटिल होती हैं। मेरे परिचितों के दौरान, जो एरलांग और मैनेशिया विशेषज्ञ हैं, सुझाव देते हैं कि मैनेशिया की प्रतिकृति गंभीर रूप से त्रुटिपूर्ण है और आपको इसका उपयोग नहीं करना चाहिए (वर्तमान में कोई विकल्प नहीं है जिसे मैं जानता हूं और आप बेहतर संस्करण को लागू करने के अवसर क्या हैं; संभावना)

तो आपके पास दो नोड्स() हैं जो रैम और डिस्क आधारित तालिकाओं की प्रतिलिपि बना रहे हैं। आप डिफ़ॉल्ट बैकअप मोड का उपयोग कर मानक बैकअप के साथ नियमित रूप से डेटाबेस का बैक अप लेने की नीति बनाए रख रहे हैं। और एक दिन एक प्रबंधक आपको बैकअप को सत्यापित करने के लिए कहता है। केवल जब आप डेटाबेस बहाल करने का प्रयास आपको मिलेगा:

{atomic,[]} 

और प्रलेखन के अनुसार इसका मतलब है कोई त्रुटि नहीं थे कि ... और अभी तक कोई टेबल बहाल किया गया।

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

{aborted,{'EXIT',{aborted,{bad_commit,{missing_lock,[email protected]}}}}} 

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

मैं यह कहना चाहूंगा कि यह सड़क का अंत था ... लेकिन मैंने अभी तक एक प्रश्न नहीं पूछा है और यह बात है .... तो यह यहाँ है?

प्रश्न: अगर मैं एक बैकअप जो दोहराया mnesia नोड्स के एक समूह से लिया गया है पुनर्स्थापित करना चाहते हैं, मैं कैसे फ़ाइल (change_node प्रक्रिया के समान) संपादित कर सकता है, ताकि अन्य नोड या तो नजरअंदाज कर दिया या से निकाल दिए जाते बैकअप?

थोड़ा अलग तरीके से पूछा गया: मैं एक नोड() पर एक प्रतिकृति-बहु-नोड() मैनेशिया डेटाबेस को पुनर्स्थापित कैसे करूं?

+0

http://stackoverflow.com/questions/463400/how-to-rename-the-node-running-a-mnesia-डेटाबेस को भी देखना चाहिए। –

उत्तर

7

मुझे लगता है कि इस समस्या को Mnesia सवालों की व्यापक श्रेणी है कि एक साधारण एक से जुड़े हुए हैं बढ़ती है:

How do I rename a Mnesia node?

पहली और सबसे सरल समाधान, यदि आपका डाटाबेस विशाल नहीं है, mnesia उपयोग करने के लिए है : traverse_backup फ़ंक्शन (Mnesia User guide देखें)। बाद Mnesia उपयोगकर्ता गाइड से एक उदाहरण है:

change_node_name(Mod, From, To, Source, Target) -> 
    Switch = 
     fun(Node) when Node == From -> To; 
      (Node) when Node == To -> throw({error, already_exists}); 
      (Node) -> Node 
     end, 
    Convert = 
     fun({schema, db_nodes, Nodes}, Acc) -> 
       {[{schema, db_nodes, lists:map(Switch,Nodes)}], Acc}; 
      ({schema, version, Version}, Acc) -> 
       {[{schema, version, Version}], Acc}; 
      ({schema, cookie, Cookie}, Acc) -> 
       {[{schema, cookie, Cookie}], Acc}; 
      ({schema, Tab, CreateList}, Acc) -> 
       Keys = [ram_copies, disc_copies, disc_only_copies], 
       OptSwitch = 
        fun({Key, Val}) -> 
          case lists:member(Key, Keys) of 
           true -> {Key, lists:map(Switch, Val)}; 
           false-> {Key, Val} 
          end 
        end, 
       {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc}; 
      (Other, Acc) -> 
       {[Other], Acc} 
     end, 
    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched). 

view(Source, Mod) -> 
    View = fun(Item, Acc) -> 
        io:format("~p.~n",[Item]), 
        {[Item], Acc + 1} 
      end, 
    mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0). 

यहाँ सबसे महत्वपूर्ण हिस्सा {schema, db_nodes, Nodes} टपल जो आप का नाम बदलें या db नोड्स की जगह जाने के हेरफेर है।

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

आशा है कि इससे मदद मिलती है!

+0

मेरे पास टेक्स्ट है और यह मैनेशिया सर्वर के क्लस्टर का बैकिंग या पुनर्स्थापित करने के बारे में कुछ भी नहीं कहता है। – Richard

+0

आपने अपने प्रश्न में संदर्भित किया है कि आप परिवर्तन नोड उदाहरण के बारे में जानते हैं, जिसे मैंने ध्यान में रखे दस्तावेज़ में भी शामिल किया है। यदि मैं आपके प्रश्न को सही ढंग से समझता हूं, तो उसी उदाहरण में आप देख सकते हैं कि tuple {schema, db_nodes, नोड्स} की जांच की गई है: इस tuple में मैनेशिया डेटाबेस के लिए पंजीकृत नोड्स शामिल हैं। –

+0

आह! मुझे याद आया कि change_node कोड में। (आपका उत्तर इसके बारे में कुछ भी नहीं कहता है, हालांकि, change_node() सही उत्तर होगा।) धन्यवाद। – Richard

संबंधित मुद्दे