जवाबों:
नया डेटाबेस बनाते समय पोस्टग्रेज सर्वर पर किसी भी मौजूदा डेटाबेस के उपयोग की अनुमति देता है। मुझे यकीन नहीं है कि क्या pgAdmin आपको डेटाबेस बनाने के विकल्प पर विकल्प देता है, लेकिन आपको क्वेरी विंडो में निम्नलिखित को निष्पादित करने में सक्षम होना चाहिए, यदि यह नहीं है:
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
फिर भी, आप प्राप्त कर सकते हैं:
ERROR: source database "originaldb" is being accessed by other users
डेटाबेस से अन्य सभी उपयोगकर्ताओं को डिस्कनेक्ट करने के लिए, आप इस क्वेरी का उपयोग कर सकते हैं:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();
Servers
-> ((मेरा सर्वर) -> Databases
, डेटाबेस पर राइट-क्लिक करें, और "नया डेटाबेस" चुनें। विकल्पों में से एक टेम्पलेट है, और डेटाबेस बनाने के लिए उपयोग किया जाने वाला SQL समकक्ष है। यह है तो बहुत तेजी से एक डंप से / एक ही सर्वर पर बहाल।
बेल के उत्तर का एक कमांड-लाइन संस्करण :
createdb -O ownername -T originaldb newdb
यह डेटाबेस मास्टर के विशेषाधिकारों के तहत चलाया जाना चाहिए, आमतौर पर पोस्टग्रेज होता है।
createdb: database creation failed: ERROR: source database "conf" is being accessed by other users
यदि आप इसे एक उत्पादन डेटाबेस पर करने की कोशिश करते हैं और जैसा कि आप चाहते हैं कि आप इसे कॉपी बनाने के लिए बंद नहीं करना चाहते हैं।
मौजूदा डेटाबेस को क्लोन करने के लिए पोस्टग्रेज के साथ आप ऐसा कर सकते हैं
/* KILL ALL EXISTING CONNECTION FROM ORIGINAL DB (sourcedb)*/
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'SOURCE_DB' AND pid <> pg_backend_pid();
/* CLONE DATABASE TO NEW ONE(TARGET_DB) */
CREATE DATABASE TARGET_DB WITH TEMPLATE SOURCE_DB OWNER USER_DB;
IT त्रुटि से बचने वाले स्रोत db के सभी कनेक्शन को मार देगा
ERROR: source database "SOURCE_DB" is being accessed by other users
procpid
के साथ pid
करने के लिए काम इस के लिए
उत्पादन वातावरण में, जहाँ मूल डेटाबेस ट्रैफ़िक में है, मैं बस उपयोग कर रहा हूँ:
pg_dump production-db | psql test-db
pg_dump -s
? postgresql.org/docs/current/static/app-pgdump.html
$ createdb newdb
PgAdmin के बारे में नहीं जानते, लेकिन pgdump
आपको SQL में डेटाबेस का एक डंप देता है। आपको केवल एक ही नाम से एक डेटाबेस बनाना है और करना है
psql mydatabase < my dump
सभी तालिकाओं और उनके डेटा और सभी एक्सेस विशेषाधिकारों को पुनर्स्थापित करने के लिए।
pg_dump -U postgres sourcedb | psql -U postgres newdb
हालांकि इस तकनीक की दक्षता संदिग्ध हो सकती है (क्योंकि आप शायद पढ़ते और लिखते समय संदर्भ समाप्त कर देते हैं)
ssh dbserver pg_dump DBNAME | psql NEWDB
... या pg_dump DBNAME | ssh otherserver pgsql NEWDB
... के माध्यम से भी प्राप्त कर सकते हैं।
सबसे पहले, sudo
डेटाबेस उपयोगकर्ता के रूप में:
sudo su postgres
PostgreSQL कमांड लाइन पर जाएं:
psql
नया डेटाबेस बनाएँ, अधिकार दें और बाहर निकलें:
CREATE DATABASE new_database_name;
GRANT ALL PRIVILEGES ON DATABASE new_database_name TO my_user;
\d
पुराने डेटाबेस से संरचना संरचना और डेटा को नए में कॉपी करें:
pg_dump old_database_name | psql new_database_name
\l+
। आकार में अंतर क्यों?
मैंने ऊपर से उदाहरणों के साथ इस दृष्टिकोण को एक साथ जोड़ दिया। मैं एक "अंडर लोड" सर्वर पर काम कर रहा हूं और त्रुटि तब मिली जब मैंने @zbyszek से दृष्टिकोण का प्रयास किया। मैं भी एक "कमांड लाइन केवल" समाधान के बाद था।
createdb: database creation failed: ERROR: source database "exampledb" is being accessed by other users
।
यहां मेरे लिए काम किया गया है ( कमांड nohup
एक फ़ाइल में आउटपुट को स्थानांतरित करने और सर्वर डिस्कनेक्ट से बचाने के लिए पूर्व निर्धारित है ):
nohup pg_dump exampledb > example-01.sql
createdb -O postgres exampledbclone_01
मेरा उपयोगकर्ता "पोस्टग्रेज" है
nohup psql exampledbclone_01 < example-01.sql
PgAdmin में आप अपने मूल डेटाबेस से एक बैकअप बना सकते हैं, और फिर बस एक नया डेटाबेस बना सकते हैं और अभी बनाए गए बैकअप से पुनर्स्थापित कर सकते हैं:
PgAdmin में एक नए से पूरे डेटाबेस (इसकी संरचना और डेटा) की प्रतिलिपि बनाने का सही तरीका क्या है?
उत्तर:
CREATE DATABASE newdb WITH TEMPLATE originaldb;
आजमाया और परखा गया।
से प्रलेखन , का उपयोग कर createdb
या CREATE DATABASE
टेम्पलेट के साथ प्रोत्साहित नहीं किया जाता है:
हालाँकि यह टेम्प्लेट 1 के अलावा किसी अन्य डेटाबेस को अपने नाम को टेम्प्लेट के रूप में निर्दिष्ट करके कॉपी करना संभव है, यह सामान्य उद्देश्य "COP DATABASE" सुविधा के रूप में नहीं है। प्रमुख सीमा यह है कि कोई अन्य सत्र टेम्पलेट डेटाबेस से नहीं जोड़ा जा सकता है जबकि इसे कॉपी किया जा रहा है। अगर कोई अन्य कनेक्शन चालू होता है, तो DATEABASE क्रिएट होगा; अन्यथा, जब तक DATABASE पूरा नहीं हो जाता है, तब तक टेम्पलेट डेटाबेस के नए कनेक्शन लॉक हो जाते हैं।
pg_dump
या pg_dumpall
डेटाबेस और सभी डेटा की प्रतिलिपि बनाने के लिए एक अच्छा तरीका है। यदि आप pgAdmin जैसे GUI का उपयोग कर रहे हैं, तो जब आप बैकअप कमांड निष्पादित करते हैं, तो इन कमांड को पर्दे के पीछे बुलाया जाता है। एक नए डेटाबेस की नकल दो चरणों में की जाती है: बैकअप और पुनर्स्थापना
pg_dumpall
PostgreSQL क्लस्टर पर सभी डेटाबेस को बचाता है। इस दृष्टिकोण का नुकसान यह है कि आप डेटाबेस बनाने और डेटा को पॉप्युलेट करने के लिए SQL से भरी संभावित बहुत बड़ी टेक्स्ट फ़ाइल के साथ समाप्त होते हैं। इस दृष्टिकोण का लाभ यह है कि आपको क्लस्टर के लिए सभी भूमिकाएं (अनुमतियां) मुफ्त में मिलती हैं। सभी डेटाबेस को डंप करने के लिए सुपरयूज़र खाते से ऐसा करें
pg_dumpall > db.out
और बहाल करने के लिए
psql -f db.out postgres
pg_dump
कुछ संपीड़न विकल्प हैं जो आपको बहुत छोटी फाइलें देते हैं। मेरे पास एक प्रोडक्शन डेटाबेस है जो मैं दिन में दो बार बैकअप करता हूं ताकि क्रोन जॉब का उपयोग किया जा सके
pg_dump --create --format=custom --compress=5 --file=db.dump mydatabase
जहां compress
संपीड़न स्तर (0 से 9) है और डेटाबेस बनाने के लिए कमांड जोड़ने के लिए create
कहता pg_dump
है। का उपयोग करके पुनर्स्थापित करें (या नए क्लस्टर में जाएँ)
pg_restore -d newdb db.dump
जहाँ newdb उस डेटाबेस का नाम है जिसे आप उपयोग करना चाहते हैं।
अनुमतियाँ प्रबंधित करने के लिए PostgreSQL ROLES का उपयोग करता है। इनसे नकल नहीं होती pg_dump
। इसके अलावा, हमने postgresql.conf और pg_hba.conf (यदि आप डेटाबेस को किसी अन्य सर्वर पर ले जा रहे हैं) में सेटिंग्स से निपटा नहीं है । आपको अपने आप ही गोपनीय सेटिंग्स का पता लगाना होगा। लेकिन एक चाल है जो मैंने अभी भूमिकाओं का समर्थन करने के लिए खोजी है। रोल्स को क्लस्टर स्तर पर प्रबंधित किया जाता है और आप कमांड लाइन स्विच के pg_dumpall
साथ भूमिकाओं का बैकअप लेने के लिए कह सकते हैं --roles-only
।
PostgreSQL 9.1.2:
$ CREATEDB new_db_name -T orig_db_name -O db_user;
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
और इसके परिणामस्वरूप मूल डेटाबेस को निष्क्रिय होना चाहिए (राइट एक्सेस के साथ कोई कनेक्शन नहीं) और मूल डेटाबेस के किसी भी नए कनेक्शन को रोका जाता है जबकि प्रतिलिपि प्रक्रिया में है। यदि आप इससे खुश हैं, तो यह काम करता है।
अभी भी दिलचस्पी रखने वालों के लिए, मैं एक बैश स्क्रिप्ट के साथ आया हूं जो लेखक को चाहता था (कम या ज्यादा)। मुझे एक उत्पादन प्रणाली पर एक दैनिक व्यापार डेटाबेस की प्रतिलिपि बनानी पड़ी, यह स्क्रिप्ट चालबाजी करती है। डेटाबेस का नाम / उपयोगकर्ता / pw मान बदलने के लिए याद रखें।
#!/bin/bash
if [ 1 -ne $# ]
then
echo "Usage `basename $0` {tar.gz database file}"
exit 65;
fi
if [ -f "$1" ]
then
EXTRACTED=`tar -xzvf $1`
echo "using database archive: $EXTRACTED";
else
echo "file $1 does not exist"
exit 1
fi
PGUSER=dbuser
PGPASSWORD=dbpw
export PGUSER PGPASSWORD
datestr=`date +%Y%m%d`
dbname="dbcpy_$datestr"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;"
dropdbcmp="DROP DATABASE $dbname"
echo "creating database $dbname"
psql -c "$createdbcmd"
rc=$?
if [[ $rc != 0 ]] ; then
rm -rf "$EXTRACTED"
echo "error occured while creating database $dbname ($rc)"
exit $rc
fi
echo "loading data into database"
psql $dbname < $EXTRACTED > /dev/null
rc=$?
rm -rf "$EXTRACTED"
if [[ $rc != 0 ]] ; then
psql -c "$dropdbcmd"
echo "error occured while loading data to database $dbname ($rc)"
exit $rc
fi
echo "finished OK"
डेटाबेस डंप बनाने के लिए
cd /var/lib/pgsql/
pg_dump database_name> database_name.out
डेटाबेस डंप को रीसेट करने के लिए
psql -d template1
CREATE DATABASE database_name WITH ENCODING 'UTF8' LC_CTYPE 'en_US.UTF-8' LC_COLLATE 'en_US.UTF-8' TEMPLATE template0;
CREATE USER role_name WITH PASSWORD 'password';
ALTER DATABASE database_name OWNER TO role_name;
ALTER USER role_name CREATEDB;
GRANT ALL PRIVILEGES ON DATABASE database_name to role_name;
CTR+D(logout from pgsql console)
cd /var/lib/pgsql/
psql -d database_name -f database_name.out
यहां केवल pgadmin4 GUI (बैकअप और पुनर्स्थापना के माध्यम से) डेटाबेस का उपयोग करके प्रतिलिपि बनाने की पूरी प्रक्रिया है
Postges Pgadmin4 के साथ आता है। यदि आप macOS का उपयोग करते हैं तो आप CMD
+ को दबा सकते हैं SPACE
और pgadmin4
इसे चलाने के लिए टाइप कर सकते हैं । यह क्रोम में एक ब्राउज़र टैब खोलेगा।
डेटाबेस पर राइट-क्लिक करके ऐसा करें -> "बैकअप"
की तरह test12345
। बैकअप पर क्लिक करें। यह एक बाइनरी फ़ाइल डंप बनाता है, यह एक .sql
प्रारूप में नहीं है
आपकी स्क्रीन के निचले भाग में एक पॉपअप होना चाहिए। यह देखने के लिए कि आपका बैकअप कहां से डाउनलोड हुआ है, "अधिक विवरण" पृष्ठ पर क्लिक करें
इस मामले में, यह है /users/vincenttang
मान लिया कि आपने चरण 1 से 4 को सही ढंग से किया है, तो आपके पास एक पुनर्स्थापित बाइनरी फ़ाइल होगी। ऐसा समय आ सकता है जब आपका सहकर्मी आपकी पुनर्स्थापना फ़ाइल का उपयोग उनकी स्थानीय मशीन पर करना चाहता है। कहा है कि व्यक्ति पगडंडियों पर जाएँ और पुनर्स्थापित करें
डेटाबेस को राइटक्लॉक करके ऐसा करें -> "रिस्टोर" करें
मैन्युअल रूप से फ़ाइल स्थान का चयन करना सुनिश्चित करें, pgadmin में अपलोडर फ़ील्ड पर फ़ाइल को ड्रैग और ड्रॉप न करें। क्योंकि आप त्रुटि अनुमतियों में चलेंगे। इसके बजाय, आपके द्वारा बनाई गई फ़ाइल खोजें:
आपको फ़िल्टर को बिल्कुल "सभी फ़ाइलों" में बदलना पड़ सकता है। उसके बाद फ़ाइल को चरण 4 से ढूंढें। अब पुष्टि करने के लिए सबसे नीचे "सिलेक्ट" बटन दबाएं
आप इस पृष्ठ को फिर से देखेंगे, चयनित फ़ाइल के स्थान के साथ। आगे बढ़ो और इसे पुनर्स्थापित करें
यदि सभी अच्छे हैं, तो नीचे दाईं ओर एक संकेतक को पॉपअप करना चाहिए जो एक सफल पुनर्स्थापना दिखा रहा है। आप यह देखने के लिए अपनी टेबल पर नेविगेट कर सकते हैं कि क्या डेटा को प्रत्येक टेबल पर उचित रूप से बहाल किया गया है।
चरण 9 विफल होना चाहिए, अपने डेटाबेस पर अपने पुराने सार्वजनिक स्कीमा को हटाने का प्रयास करें। "क्वेरी टूल" पर जाएं
इस कोड ब्लॉक को निष्पादित करें:
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
अब फिर से 5 से 9 तक कोशिश करें, यह काम करना चाहिए
EDIT - कुछ अतिरिक्त नोट्स। PGADMIN4 को अपडेट करें यदि आपको पुनर्स्थापना के दौरान "अभिलेखीय शीर्ष लेख 1.14 असमर्थित" की तर्ज पर कुछ के साथ अपलोड करने के दौरान कोई त्रुटि मिल रही है
यदि डेटाबेस में खुले कनेक्शन हैं, तो यह स्क्रिप्ट मदद कर सकती है। मैं हर रात लाइव-प्रोडक्शन डेटाबेस के बैकअप से एक परीक्षण डेटाबेस बनाने के लिए इसका उपयोग करता हूं। यह मानता है कि आपके पास उत्पादन db से एक .SQL बैकअप फ़ाइल है (मैं वेबमिन के भीतर ऐसा करता हूं)।
#!/bin/sh
dbname="desired_db_name_of_test_enviroment"
username="user_name"
fname="/path to /ExistingBackupFileOfLive.sql"
dropdbcmp="DROP DATABASE $dbname"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = $username "
export PGPASSWORD=MyPassword
echo "**********"
echo "** Dropping $dbname"
psql -d postgres -h localhost -U "$username" -c "$dropdbcmp"
echo "**********"
echo "** Creating database $dbname"
psql -d postgres -h localhost -U "$username" -c "$createdbcmd"
echo "**********"
echo "** Loading data into database"
psql -d postgres -h localhost -U "$username" -d "$dbname" -a -f "$fname"
PgAdmin का उपयोग करके, उस डेटाबेस को डिस्कनेक्ट करें जिसे आप टेम्पलेट के रूप में उपयोग करना चाहते हैं। फिर आप इसे नए डेटाबेस बनाने के लिए टेम्पलेट के रूप में चुनते हैं, यह पहले से ही उपयोग में त्रुटि से बचा जाता है।
यदि आप संपूर्ण स्कीमा की प्रतिलिपि बनाना चाहते हैं, तो आप निम्नलिखित आदेश के साथ एक pg_dump बना सकते हैं:
pg_dump -h database.host.com -d database_name -n schema_name -U database_user --password
और जब आप उस डंप का आयात करना चाहते हैं, तो आप उपयोग कर सकते हैं:
psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name" -f sql_dump_to_import.sql
कनेक्शन स्ट्रिंग्स के बारे में अधिक जानकारी: https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING
या फिर सिर्फ एक लाइनर में इसे मिलाते हुए:
pg_dump -h database.host.com -d postgres -n schema_name -U database_user --password | psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name”
उस "टेम्पलेटेड" डेटाबेस को डिस्कनेक्ट करें जिसे आप टेम्पलेट के रूप में उपयोग करना चाहते हैं।
नीचे दिए गए 2 प्रश्नों को चलाएं
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TemplateDB' AND pid <> pg_backend_pid();
(उपरोक्त एसक्यूएल स्टेटमेंट टेम्प्लेट डीबी के साथ सभी सक्रिय सत्रों को समाप्त कर देगा और फिर आप इसे नए टारगेटडीबी डेटाबेस बनाने के लिए टेम्प्लेट के रूप में चुन सकते हैं, यह पहले से ही उपयोग में त्रुटि होने से बचा जाता है।)
CREATE DATABASE 'TargetDB'
WITH TEMPLATE='TemplateDB'
CONNECTION LIMIT=-1;
इसे इस्तेमाल करे:
CREATE DATABASE newdb WITH ENCODING='UTF8' OWNER=owner TEMPLATE=templatedb LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' CONNECTION LIMIT=-1;
gl XD