2012-12-07 7 views
17

में फ़ंक्शंस का बैकअप लेने के लिए मैं अपने पोस्टग्रेज़ डेटाबेस में सभी कार्यों का बैकअप लेना चाहता हूं। केवल पोस्टग्रेस में फ़ंक्शंस का बैकअप लेने के लिए कैसे?केवल पोस्टग्रेस

उत्तर

36

pg_getfunctiondef का उपयोग करें; system information functions देखें। pg_getfunctiondef PostgreSQL 8.4 में जोड़ा गया था।

SELECT pg_get_functiondef('proc_name'::regproc); 

एक स्कीमा आप pg_catalog में सिस्टम टेबल क्वेरी कर सकता है में सभी कार्यों डंप करने के लिए; कहते हैं कि अगर आप public से सब कुछ करना चाहता था:

SELECT pg_get_functiondef(f.oid) 
FROM pg_catalog.pg_proc f 
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid) 
WHERE n.nspname = 'public'; 

यह बजाय अगर तुम क्या चाहते हो कि "pg_ के साथ शुरुआत को छोड़कर अन्य सभी स्कीमा से" कहने के लिए ऊपर बदलने के लिए तुच्छ है।

psql में आप के साथ एक फ़ाइल को यह डंप कर सकते हैं:

psql -At dbname > /path/to/output/file.sql <<"__END__" 
... the above SQL ... 
__END__ 

एक और डीबी में उत्पादन चलाने के लिए, की तरह कुछ का उपयोग करें:

psql -1 -v ON_ERROR_STOP -f /path/to/output/file.sql target_db_name 

आप की तरह डीबीएस के बीच कार्यों नकल कर रहे हैं हालांकि, एसवीएन या गिट जैसे संशोधन नियंत्रण प्रणाली में एसक्यूएल स्क्रिप्ट के रूप में फ़ंक्शन परिभाषाओं की आधिकारिक प्रति को संग्रहीत करने पर विचार करें, अधिमानतः पोस्टग्रेएसक्यूएल एक्सटेंशन के रूप में पैक किया गया है। packaging extensions देखें।

+0

इसके अलावा मैं इन कार्यों को किसी अन्य डीबी में पुनर्स्थापित करना चाहता हूं। मैं यह कैसे कर सकता हूं? कार्यों को केवल – vmb

+0

@vmb को पुनर्स्थापित करने की आवश्यकता है आउटपुट SQL फ़ंक्शन परिभाषाएं है, इसलिए उन्हें psql में पाइप करें। अद्यतन उत्तर देखें। इससे भी बेहतर, एक एक्सटेंशन बनाएं और इसमें पैकेज करें। –

+1

यह ध्यान दिया जाना चाहिए कि 'pg_get_functiondef (' proc_name ':: regproc) '** कार्य नहीं करता है ** फ़ंक्शन के विशेषाधिकारों को डंप करें (' GRANT' और' REVOKE' कथन) जिन्हें कभी-कभी फ़ंक्शन परिभाषा का हिस्सा माना जा सकता है। – NumberFour

17

आप केवल फ़ंक्शन डंप करने के लिए pg_dump नहीं बता सकते हैं। हालांकि, आप डेटा के बिना डंप कर सकते हैं (-s) और इसे पुनर्स्थापित करने पर फ़िल्टर करें। -Fc भाग पर ध्यान दें: यह pg_restore के लिए उपयुक्त फ़ाइल तैयार करेगा।

पहले डंप ले:

pg_dump -U username -Fc -s -f dump_test your_database 

फिर एक कार्यों की सूची बनाएं:

pg_restore -U username -d your_other_database -L function_list dump_test 
:

pg_restore -l dump_test | grep FUNCTION > function_list 

और अंत में उन्हें बहाल (-L ऊपर बनाई गई सूची फ़ाइल निर्दिष्ट करता है)

+0

शायद पहले दो आदेशों को 'pg_dump -U उपयोगकर्ता नाम-डेटाबेस में घटाया जा सकता है। grep फ़ंक्शन> function_list' – Minutis

+0

@Minutis यह काम नहीं करेगा, जब तक कि फ़ंक्शन परिभाषाएं _all_ एक-लाइनर न हों। – dezso

+1

बस इसे स्वयं करने की कोशिश की और पुष्टि कर सकते हैं कि मेरी पहली टिप्पणी में समाधान सही नहीं है। – Minutis

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