सारांश / 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
पर क्लिक करें और आप पूरी तरह तैयार हैं :आपका बैकअप डेटा स्थानीय रूप से उपलब्ध है! अच्छा काम!
मैं निम्नलिखित करना चाहता था:
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
और आप जाने के लिए अच्छे हैं !
इसमें कई संभावित सुधार हैं। यहां कुछ ऐसे हैं जो मैं पहले से देख रहा हूं:
- स्क्रिप्ट को
db_link
की डिफ़ॉल्ट विशेषता के रूप में देखते हुए समारोह - यदि डेटाबेस संरचनाएं बैकअप और उत्पादन में भिन्न हैं, तो अधिक त्रुटि-सबूत होना
- डेटाबेस परिणामों और बैकअप परिणामों के बीच तुलना उपकरण बनाना (केवल अलग-अलग पंक्तियों को वापस करने के लिए)
- साधारण जुड़ाव संभालें
- और इससे भी आगे एक एप्लिकेशन स्तर एडाप्टर (जैसे रेल में ActiveRecord) होगा जो कच्चे एसक्यूएल के बजाय बैकएंड ऑब्जेक्ट्स में हेरफेर करने की अनुमति दे सकता है
आशा है कि मैं स्पष्ट था! कृपया अधिक विवरण के लिए पूछें अन्यथा