2011-03-19 10 views
6

मेरे पास 85+ टेबल के साथ एक पोस्टग्रेस्क्ल डीबी है। मैं कॉपी मोड में pg_dump (php-pgadmin के माध्यम से) का नियमित रूप से बैकअप बना देता हूं और बैकअप फ़ाइल का आकार लगभग 10-12 एमबी है। अब जिस समस्या का सामना कर रहा हूं वह यह है कि जब भी मैं डेटाबेस को पुनर्स्थापित करने का प्रयास करता हूं, तो विदेशी कुंजी बाधा समस्या होती है। परिदृश्य इस प्रकार है:विदेशी कुंजी बाधा मुद्दे के बिना बैकअप से PostgreSQL डीबी को पुनर्स्थापित करें

दो टेबल हैं: 1) users और 2) zones। मैंने उपयोगकर्ता के क्षेत्र की पहचान करने के लिए users तालिका में ज़ोन की आईडी संग्रहीत की है और इसे विदेशी कुंजी के रूप में सेट किया है।

जब मैं डीबी डंप लेता हूं, तालिका zones तालिका के लिए प्रविष्टियां केवल users तालिका के बाद आती हैं। मुझे लगता है कि यह तालिका नाम के पहले अक्षर के कारण है: uz से पहले आता है, और इसलिए जब मैं डेटाबेस को पुनर्स्थापित करता हूं, तो एक विदेशी कुंजी बाधा समस्या होती है और निष्पादन बंद हो जाता है। एक ही समस्या तब होती है जब मैं डीबी संरचना को पुनर्स्थापित करने का प्रयास करता हूं, यह कहता है कि तालिका zones डेटाबेस में मौजूद नहीं है क्योंकि zones की संरचना डंप फ़ाइल में users के बाद आता है।

क्या इसके लिए कोई समाधान है? क्या कोई अन्य बैकअप विधि व्यवहार्य है?

+0

असल में मैं phppgadmin से phpgadmin इंटरफ़ेस के माध्यम से एसक्यूएल के रूप में डंप भेजता हूं ..... –

उत्तर

6

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

PhpPgAdmin seems to want to work with plain SQL dumpspg_restore के बजाय। मुझे विश्वास करना मुश्किल लगता है लेकिन मुझे pg_restore का आह्वान करने के बारे में प्रलेखन में कुछ भी नहीं मिला। यदि यह सत्य है तो आपको शायद SQL डंप को हाथ से संपादित करना होगा और सभी एफके को अंत में ले जाना होगा।

आप अपने SQL डंप के शीर्ष पर SET CONSTRAINTS ALL DEFERRED; जोड़ने का भी प्रयास कर सकते हैं, जो लेनदेन के अंत तक बाधा जांच में देरी करनी चाहिए, आप यह भी सुनिश्चित करना चाहते हैं कि INSERT का पूरा ब्लॉक लेनदेन के भीतर निहित है।

phpPgAdmin वास्तव में pg_restore आह्वान नहीं कर सकते हैं तो आप pg_dump और pg_restore का उपयोग कर हाथ से इतना है कि आप अपने बैकअप प्रक्रियाओं से अधिक आवश्यक नियंत्रण है का उपयोग कर बेहतर कर रहे हैं। क्षमा करें, लेकिन किसी भी डेटाबेस व्यवस्थापक उपकरण जो FKs के साथ डेटाबेस का बैक अप नहीं ले सकता है बेकार से भी बदतर है। उम्मीद है कि कोई भी जो PhpPgAdmin के आसपास अपना रास्ता जानता है, दिखाएगा और हमें बताएगा कि pg_restore का उपयोग PhpPgAdmin के साथ कैसे करें।

+0

हाँ pg_restore जो मैं चाहता था .. अब डेटा माइग्रेशन अच्छी तरह से काम कर रहा है लेकिन अब एक नई समस्या है .... जब मैं डीबी संरचना आयात करता हूं, और उपयोगकर्ता इसे एक नए डेटाबेस में पुनर्स्थापित करने के लिए pg_restore, "अनुक्रम एक्स पहले से मौजूद है "आता है .. मैंने पाया कि समस्या यह है कि ऑटो-वृद्धि फ़ील्ड का डेटा प्रकार डीबी डंप में बड़ा होता है, इसलिए पोस्टग्रेस स्वचालित रूप से कॉलम नाम के आधार पर एक अनुक्रम बनाता है .. लेकिन तालिका तालिका बनाते हुए डंप के पास एक निर्माण होता है अनुक्रम कथन जो पोस्टग्रेस द्वारा उत्पन्न एक ऑटो के समान नाम के साथ एक अनुक्रम बनाता है और यह एक त्रुटि फेंकता है .. कोई समाधान? –

+1

@ मिधुन: आपको एक खाली डेटाबेस में बहाल किया जाना चाहिए, फिर 'pg_restore' सब कुछ सेट अप करेगा। या, यदि आपके पास पहले से ही स्कीमा है लेकिन कोई डेटा नहीं है, तो आप डेटा को पुनर्स्थापित करने के लिए 'pg_restore' बता सकते हैं। स्कीमा की तरह लगता है कि पहले से ही है और आपकी बहाली स्कीमा को पुनर्स्थापित करने की कोशिश कर रही है। –

1

pgdump (php-pgAdmin के माध्यम से)

क्या आप वाकई phpPgAdmin बैकअप बनाने के लिए pg_dump उपयोग कर रहा है कर रहे हैं का उपयोग कर? मैंने pg_dump द्वारा किए गए किसी भी डंप को कभी नहीं देखा है, डंप को बहाल करते समय विदेशी कुंजी के साथ समस्याएं हैं।

PhpPgAdmin सिर्फ एक PHP स्क्रिप्ट है और ज्यादातर मामलों में इसे pg_dump जैसे प्रोग्राम को शुरू करने की अनुमति नहीं होगी।

+0

मेरा मानना ​​था कि PhpPgAdmin बैकअप बनाने के लिए pgdump का उपयोग करता है ... क्या मैं गलत हूं ??? [लिंक] http://en.wikipedia.org/wiki/PhpPgAdmin [लिंक] का कहना है कि यह pg_dump का उपयोग कर सकता है .. लेकिन मुझे यकीन नहीं है कि इंटरफ़ेस pg_dump का उपयोग करता है जब डंपिंग किया जाता है ... क्या कोई इसे पुष्टि कर सकता है? –

0

मैं एफके निर्माण को आगे बढ़ा दूंगा और इसे स्क्रिप्ट के अंत में जोड़ दूंगा।

3

यदि यह मदद करता है किसी को भी: पिछले समाधान में से कोई भी मेरे लिए काम किया सुझाव (वहाँ था कुछ संदर्भित डेटा है कि बाद में फेंक दिया गया था, स्वतंत्र अगर यह द्विपदीय प्रारूप में था, या सादे एसक्यूएल प्रश्नों बना डालता है)।

मैं क्या किया: मैं schemaspy इस्तेमाल किया, एक स्क्रिप्ट है कि इस तरह अंतर्निहित ईआर मॉडल का एक वास्तव में उपयोगी एचटीएमएल चित्र के रूप में अन्य सुविधाओं, -among - यह दो बहुत ही उपयोगी सूचियों उत्पन्न करता है: एक "प्रविष्टि आदेश में" (की जहां सभी अपने तालिकाओं को मौजूदा प्रतिबंधों और निर्भरताओं पर विचार करने, प्रविष्टियों को निष्पादित करने के लिए इष्टतम क्रम के रूप में सूचीबद्ध किया गया है), और "हटाना आदेश" (ड्रॉप टेबल के लिए बहुत उपयोगी)।

यदि आप नमूना चाहते हैं, तो यह http://schemaspy.sourceforge.net/sample/ देखें। विशेष रूप से, ऊपर बताए गए दो नमूना सूचियां हैं (सीधे लिंक पोस्ट करने का प्रयास किया गया है लेकिन स्पैम रोकथाम तंत्र मुझे केवल 2 लिंक पोस्ट करने की अनुमति देता है)।

+0

ये नमूना सूचियां हैं !!! http://schemaspy.sourceforge.net/sample/insertionOrder.txt http://schemaspy.sourceforge.net/sample/deletionOrder.txt – jquinter

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