PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Postgres Heroku पर पिछले बैकअप से विशिष्ट डेटा को कैसे पुनर्स्थापित करें? (उदाहरण के लिए गलती से हटाई गई पंक्तियां)

सारांश / TL;DR

3 चरणों में आप बहुत ही सरलता से निष्पादित कर पाएंगे:

INSERT INTO production_db.table_name
SELECT * FROM backup_db.table_name -- backup_db being remote

पहले बैकअप को स्थानीय रूप से स्थापित करें, दूसरा SQL स्क्रिप्ट प्राप्त करें, तीसरा ngrok

चलो चलें?

<एच4>1. अपनी डंप फ़ाइल को Heroku पर डाउनलोड करें और इसे कहीं फेंक दें:
  • यदि आपके पास कुछ सर्वर उपलब्ध हैं, तो आप दूरस्थ डेटाबेस पर ऐसा कर सकते हैं। लेकिन अगर मेरी तरह आप हेरोकू या कहीं और किसी अन्य उत्पादन डेटाबेस का प्रावधान नहीं करना चाहते हैं, तो स्थानीय रूप से पूरी तरह से करेंगे।
  • मुझे PGAdmin का उपयोग करना पसंद है (लिनक्स, मैक और विंडोज पर उपलब्ध), लेकिन कमांड लाइन और psql . का उपयोग करके भी करेंगे (इसे पढ़कर पोस्ट उदाहरण के द्वारा)
  • PGAdmin में, आप Create a database . करेंगे . फिर उस पर राइट क्लिक करें और restore . का उपयोग करें समारोह। अपनी डंप फ़ाइल चुनें, Restore पर क्लिक करें और आप पूरी तरह तैयार हैं :आपका बैकअप डेटा स्थानीय रूप से उपलब्ध है! अच्छा काम!
<एच4>2. इसे अपने दूरस्थ डेटाबेस से एक्सेस करें

मैं निम्नलिखित करना चाहता था:

SELECT * FROM backup_db.table_name
-- So I could then do
INSERT INTO production_db.table_name
SELECT * FROM backup_db.table_name

और मैं पूरी तरह तैयार हो जाऊंगा। सुपर आसान, है ना? प्रत्यक्ष सुंदरता? यह पहले ही सैकड़ों बार किया जा चुका होगा। खैर, नहीं!

db_link . नामक एक उपयोगिता है पोस्टग्रेज 9.1+ में, लेकिन यह काफी विवश है क्योंकि निम्नलिखित सिंटैक्स लागू होता है:

SELECT fname, lname FROM db_link('host=localhost dbname=backup-28-08', 'SELECT fname, lname FROM users') AS remote (varchar255 fname varchar255 lname)

प्रत्येक कॉलम नाम को उसके प्रकार सहित दो बार दोहराया जाना चाहिए। बहुत भारी, हम आसान से बहुत दूर हैं SELECT * FROM backup_db.table_name

तो यहाँ विचार information_schema . का उपयोग करने का है तालिका सामग्री, जो प्रत्येक तालिका को उसके कॉलम नामों, उसके प्रकारों आदि के साथ वर्णित करती है। मुझे यह प्रश्न SO पर मिला:स्थानीय मौजूदा प्रकार से dblink स्तंभ परिभाषा सूची निर्दिष्ट करें जिससे मुझे काफी में मदद मिली (धन्यवाद bentrm )।

लेकिन इसका समाधान दो चरणों वाली प्रक्रिया थी, पहले एक फ़ंक्शन उत्पन्न करना, फिर उसे क्वेरी करना:

SELECT dblink_star_func('dbname=ben', 'public', 'test');
SELECT * FROM star_test() WHERE data = 'success';

और मैं अभी भी 1 लाइनर का लक्ष्य बना रहा था। थोड़े से दर्द के बाद (एसक्यूएल गुरु नहीं होने के कारण), यहाँ सार है:https://gist.github. कॉम/ऑगनुस्टिन/d30973ea8b5bf0067841

अब मैं यह कर सकता हूँ:

SELECT * FROM remote_db(NULL::users) -- (Still not 100% about why I need the NULL::)
-- And also
INSERT INTO users
SELECT * FROM remote_db(NULL::users)

बढ़िया, है ना?

<एच4>3. लोकलहोस्ट को दूरस्थ रूप से एक्सेस करें

यदि आपका दूरस्थ डेटाबेस पहले से ही इंटरनेट से उपलब्ध है (=एक आईपी पता है, एक डोमेन नाम जैसे हेरोकू के लिए यह ऐसा दिखेगा:ec2-54-217-229-169.eu-west-1.compute.amazonaws.com:5672/df68cfpbufjd9p ) आप इस चरण को छोड़ सकते हैं . लेकिन अगर आप अपने स्थानीय डेटाबेस का उपयोग करते हैं, तो आपको इसे बाहरी दुनिया से उपलब्ध कराना होगा (ताकि हेरोकू डेटाबेस इसे एक्सेस कर सके)।

इसके लिए, मैं अद्भुत ngrok का उपयोग करता हूं

एक बार स्थापित होने के बाद मुझे केवल निम्नलिखित कमांड दर्ज करने की आवश्यकता है:

ngrok -proto=tcp 5432 #5432 being the default port for Postgresql. (Adapt if necessary)
                                                                                                                                                                                                    
Tunnel Status                 online                                                                                                                                                                
Version                       1.7/1.6                                                                                                                                                               
Forwarding                    tcp://ngrok.com:51727 -> 127.0.0.1:5432                                                                                                                               
Web Interface                 127.0.0.1:4040                                                                                                                                                        
# Conn                        0                                                                                                                                                                     
Avg Conn Time                 0.00ms    

और आपको केवल db_link प्लग करना होगा (संक्षेप में) से host=ngrock.com port=51727 और आप जाने के लिए अच्छे हैं !

<एच4>4. आगे जा रहे हैं

इसमें कई संभावित सुधार हैं। यहां कुछ ऐसे हैं जो मैं पहले से देख रहा हूं:

  • स्क्रिप्ट को db_link की डिफ़ॉल्ट विशेषता के रूप में देखते हुए समारोह
  • यदि डेटाबेस संरचनाएं बैकअप और उत्पादन में भिन्न हैं, तो अधिक त्रुटि-सबूत होना
  • डेटाबेस परिणामों और बैकअप परिणामों के बीच तुलना उपकरण बनाना (केवल अलग-अलग पंक्तियों को वापस करने के लिए)
  • साधारण जुड़ाव संभालें
  • और इससे भी आगे एक एप्लिकेशन स्तर एडाप्टर (जैसे रेल में ActiveRecord) होगा जो कच्चे एसक्यूएल के बजाय बैकएंड ऑब्जेक्ट्स में हेरफेर करने की अनुमति दे सकता है

आशा है कि मैं स्पष्ट था! कृपया अधिक विवरण के लिए पूछें अन्यथा




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. AWS DMS का उपयोग करके माइग्रेशन के बाद PostgreSQL प्राथमिक कुंजी अनुक्रम खो गया

  2. सर्वलेट्स का उपयोग करके पोस्टग्रेस्क्ल डेटाबेस में एक पीडीएफ फाइल कैसे स्टोर करें?

  3. निम्नलिखित कथन पूर्ण होने तक CTE डिलीट प्रतिबद्ध नहीं है

  4. बाइट करने के लिए ज़िप फ़ाइल पायथन 3

  5. एक tsvector में प्रत्येक तत्व पर Levenshtein फ़ंक्शन का उपयोग करना?