2013-02-12 10 views
12

किसी तालिका की पंक्तियों को डेटाबेस से गलती से हटा दिया गया था।एक .sql postgresql बैकअप से एकल तालिका को पुनर्स्थापित कैसे करें?

psql -h localhost -d proddump -f /Users/U/Desktop/prod_db_backup/PostgreSQL/site_prod.sql 

यह एक पूर्ण स्थानीय रूप से बहाल कर समाप्त होता है: हम एक डाटाबेस बैकअप जो एक एसक्यूएल फ़ाइल कि इतने तरह बहाल कर सकते हैं में परिणाम होती हैं। लेकिन हमें एक टेबल की पंक्तियों को उत्पादन में बहाल करने की आवश्यकता है। PostgreSQL 9.1 के साथ इस काम को कैसे बनाया जाए इस पर कोई सुझाव? यदि आप, एकल तालिका पुनर्स्थापित करना आदि Use pg_dump's -Fc option

धन्यवाद

उत्तर

10

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

यदि आप किसी मौजूदा डंप के साथ फंस रहे हैं, अपने ही विकल्प हैं:

  • एक अलग फाइल करने के लिए लक्ष्य तालिका डेटा निकालने के और सिर्फ इतना है कि बहाल एक पाठ संपादक का उपयोग करें; या

  • डंप को एक फेंकने वाले डेटाबेस में पुनर्स्थापित करें, फिर उस तालिका सहित चुनिंदा डंप लेने के लिए pg_dump का उपयोग करें। चूंकि यह फेंक दिया गया है, इसलिए आप कुछ अनलोड किए गए फास्ट-लेकिन-असुरक्षित मशीन पर एक अलग पीजी इंस्टेंस का उपयोग कर सकते हैं, जहां आप fsync=off जैसे विकल्पों को "इसे तेज़ बनाते हैं, लेकिन यदि आप चाहें तो मेरा डेटा खाएं" चालू करते हैं। आपको उत्पादन में सेट करना चाहिए।

+0

क्या '-gc' प्रारूप में' pg_dumpall' बैकअप बनाना संभव है? – vyegorov

+0

@ vyegorov, pg_dumpall में नहीं है -एफ ध्वज - यह केवल SQL प्रारूप में डेटाबेस डंप कर सकता है। – mys

4

आप ग्रेप का उपयोग + roder में sed तालिका डेटा प्राप्त करने के लिए कर सकते हैं:

सबसे पहले, आप सीमाओं की पहचान करने की जरूरत है:

$ fgrep -Ehn '^(COPY |CREATE TABLE)' db.sql 
49:CREATE TABLE test (
60:CREATE TABLE test2 (
71:CREATE TABLE test3 (
82:COPY test (i) FROM stdin; 
100090:COPY test2 (i) FROM stdin; 
200098:COPY test3 (i) FROM stdin; 

आदेश तालिका test2 के लिए डेटा निकालने के लिए:

sed -n '100090,200097p' < db.sql | sed -e 's/^COPY test2/COPY new_table_name/' > new_table_name.sql 

नोट, आपको दूसरे नंबर से एक को घटा देना होगा (यानी अगली प्रतिलिपि stmt को छोड़ दें)

अब, आप new_table_name.sql लोड कर सकते हैं और जिस डेटा को आपको चाहिए उसे पुनर्स्थापित कर सकते हैं। अब, आप डेटा को नई तालिका

0

में लोड कर सकते हैं मेरे पास pg_dumpall डंप है। और मैं नामक डेटाबेस से users नाम की तालिका को पुनर्स्थापित करना चाहता हूं, क्योंकि आप पर विभिन्न डेटाबेस और यहां तक ​​कि स्कीमा में समान रूप से नामित टेबल हैं।

मेरे मामले के लिए, निम्न sed oneliner काम करता है:

sed -ne '/^\\connect edc/,/^\\connect/{/\susers\(\s\|$\)/,/;\|\\\./p}' pg92.dump 

यह क्या करता है:

  1. /^\\connect edc/,/^\\connect/ खोज को सीमित करता है मेरी डेटाबेस के दायरे हो,
  2. {…} सीमा के लिए सभी अंदरूनी आदेशों को निष्पादित करेगा;
  3. /\susers\(\s\|$\)/ लाइन के अंत में users के साथ सभी लाइनों से मेल खाता है;
  4. /;\|\\\./; या युक्त \.
  5. p के साथ मैच लाइनों (, टिप्पणी sed -n साथ शुरू हो जाती है कि) बलों मेल खाती पंक्तियाँ outputted किया जाना है।

आपके डेटा की जटिलता के आधार पर, आपको इसे ट्विक करने की आवश्यकता हो सकती है।

आपको केवल sed आउटपुट को सही स्विच के साथ psql कमांड पर पाइप करना है।

15

मैं इस के लिए किसी भी उपकरण के बारे में पता नहीं कर रहा हूँ, लेकिन यह एक लाइनर my_backup.sql फ़ाइल से precious_table निकालता है:

sed -n '/^COPY precious_table /,/^\\\.$/p' my_backup.sql 
+1

मेरी बहुमूल्य ... टेबल। –

2

एक आसान तरीका है।

'pg_restore' में '--table/-t' विकल्प है।

pg_restore -a -t your_table /path/to/dump.sql 

दूरस्थ होस्ट के लिए '-h' का उपयोग करें। अन्य विकल्प देखें here

+1

काम नहीं करता है अगर डंप सादा पाठ प्रारूप – emaillenin

+1

में है, क्षमा करें, फ़ाइल पहले 'pg_dump' द्वारा बनाई जानी चाहिए –

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