PostgreSQL में डेटाबेस की एक प्रति बनाना




(10)

पूरे डेटाबेस (इसकी संरचना और डेटा) को pgAdmin में एक नए में कॉपी करने का सही तरीका क्या है?


PgAdmin का उपयोग करके, डेटाबेस को डिस्कनेक्ट करें जिसे आप टेम्पलेट के रूप में उपयोग करना चाहते हैं। फिर आप इसे नया डेटाबेस बनाने के लिए टेम्पलेट के रूप में चुनते हैं, यह पहले से ही उपयोग में त्रुटि प्राप्त करने से बचाता है।


PgAdmin में आप अपने मूल डेटाबेस से बैकअप बना सकते हैं, और फिर बस एक नया डेटाबेस बनाएं और बनाए गए बैकअप से पुनर्स्थापित करें:

  1. स्रोत डेटाबेस, बैकअप ... पर राइट क्लिक करें और फ़ाइल पर डंप करें।
  2. राइट क्लिक करें, नया ऑब्जेक्ट, नया डेटाबेस ... और गंतव्य का नाम दें।
  3. नए डेटाबेस पर राइट क्लिक करें, पुनर्स्थापित करें ... और अपनी फ़ाइल का चयन करें।

अभी भी दिलचस्पी रखने वालों के लिए, मैं एक बैश स्क्रिप्ट के साथ आया हूं जो लेखक चाहता था (अधिक या कम) करता है। मुझे उत्पादन प्रणाली पर दैनिक व्यापार डेटाबेस प्रतिलिपि बनाना पड़ा, यह स्क्रिप्ट चाल चल रही है। डेटाबेस नाम / उपयोगकर्ता / पीडब्ल्यू मानों को बदलने के लिए याद रखें।

#!/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"

इसे इस्तेमाल करे:

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;

ग्ल एक्सडी


डेटाबेस डंप बनाने के लिए

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

पूरे डेटाबेस (इसकी संरचना और डेटा) को pgAdmin में एक नए में कॉपी करने का सही तरीका क्या है?

उत्तर:

CREATE DATABASE newdb WITH TEMPLATE originaldb;

आजमाया और परखा गया।


मैंने ऊपर से उदाहरणों के साथ इस दृष्टिकोण को एकसाथ पा लिया। मैं "लोड के तहत" सर्वर पर काम कर रहा हूं और जब मैंने @zbyszek से दृष्टिकोण का प्रयास किया तो त्रुटि मिली। मैं "कमांड लाइन केवल" समाधान के बाद भी था।

createdb: database creation failed: ERROR: source database "exampledb" is being accessed by other users

यहां मेरे लिए क्या काम किया गया है ( आउटपुट को फ़ाइल में आउटपुट स्थानांतरित करने और सर्वर डिस्कनेक्ट से बचाने के लिए नोहप के साथ nohup किया गया है ):

  1. nohup pg_dump exampledb > example-01.sql
  2. createdb -O postgres exampledbclone_01

    मेरा उपयोगकर्ता "पोस्टग्रेस" है

  3. nohup psql exampledbclone_01 < example-01.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"

pgdump बारे में नहीं पता, लेकिन pgdump आपको SQL में डेटाबेस का डंप देता है। आपको केवल उसी नाम से डेटाबेस बनाना होगा और करना होगा

psql mydatabase < my dump

सभी तालिकाओं और उनके डेटा और सभी एक्सेस विशेषाधिकारों को पुनर्स्थापित करने के लिए।


पोस्टग्रेर्स एक नया डेटाबेस बनाते समय सर्वर पर किसी भी मौजूदा डेटाबेस के टेम्पलेट के रूप में उपयोग की अनुमति देता है। मुझे यकीन नहीं है कि क्या 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();




postgresql