উত্তর:
একটি নতুন ডাটাবেস তৈরি করার সময় পোস্টগ্রিসটি টেমপ্লেট হিসাবে সার্ভারে বিদ্যমান যে কোনও ডাটাবেস ব্যবহারের অনুমতি দেয়। আমি নিশ্চিত নই যে পিজএডমিন আপনাকে তৈরি ডেটাবেস ডায়ালগটিতে বিকল্প দেয় কিনা তবে আপনার যদি একটি কোয়েরি উইন্ডোতে নিম্নলিখিতটি সম্পাদন করতে সক্ষম না হয়:
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
, ডান ক্লিক করে ডেটাবেসগুলি নির্বাচন করতে এবং "নতুন ডাটাবেস" নির্বাচন করতে পারি। বিকল্পগুলির মধ্যে একটি হ'ল টেমপ্লেট, এবং ডাটাবেস তৈরি করতে ব্যবহৃত এসকিউএল সমতুল্য। এটা তাই অনেক দ্রুত একটি ডাম্প চেয়ে / একই সার্ভারে ফিরিয়ে আনুন।
বেলের উত্তরের একটি কমান্ড-লাইন সংস্করণ :
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;
আইটি ত্রুটি এড়ানোর মাধ্যমে উত্সের সমস্ত সংযোগকে হত্যা করবে
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
পিজিএডমিন সম্পর্কে জানেন না, তবে pgdump
আপনাকে এসকিউএল-তে ডাটাবেসের একটি ডাম্প দেয়। আপনার কেবল একই নামে একটি ডাটাবেস তৈরি করতে হবে এবং করতে হবে
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+
। আকারের পার্থক্য কেন?
আমি উপরের উদাহরণগুলির সাথে একত্রিত হয়ে এই পদ্ধতির উপর নজর রেখেছি। আমি একটি "আন্ডার লোড" সার্ভারে কাজ করছি এবং আমি @ জাইবাইজেকের কাছ থেকে পন্থা চেষ্টা করার সময় ত্রুটি পেয়েছি। আমি একটি "কমান্ড লাইন কেবল" সমাধানের পরেও ছিলাম।
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
পিজিএডমিনে আপনি আপনার মূল ডাটাবেস থেকে একটি ব্যাকআপ নিতে পারেন এবং তারপরে একটি নতুন ডাটাবেস তৈরি করতে এবং সদ্য তৈরি ব্যাকআপ থেকে পুনরুদ্ধার করতে পারেন:
পুরো ডেটাবেস (এর কাঠামো এবং ডেটা) কে পিজএডমিনে কোনও একটিতে অনুলিপি করার সঠিক উপায় কী?
উত্তর:
CREATE DATABASE newdb WITH TEMPLATE originaldb;
চেষ্টা এবং পরীক্ষিত.
ডকুমেন্টেশন থেকে , টেমপ্লেটগুলি ব্যবহার করে createdb
বা CREATE DATABASE
সহ উত্সাহিত করা হয় না:
যদিও এটি টেমপ্লেট হিসাবে তার নাম নির্দিষ্ট করে টেমপ্লেট 1 ব্যতীত অন্য কোনও ডাটাবেস অনুলিপি করা সম্ভব, এটি সাধারণ-উদ্দেশ্যে "কপি ডেটাবেস" সুবিধা হিসাবে চিহ্নিত (এখনও) নয়। মূল সীমাবদ্ধতা হ'ল টেমপ্লেট ডাটাবেসের অনুলিপি করার সময় অন্য কোনও সেশনগুলি সংযুক্ত হতে পারে না। ক্রিয়েট ডেটাবেস ব্যর্থ হবে যদি অন্য কোনও সংযোগটি এটি শুরু হওয়ার সাথে সাথে উপস্থিত থাকে; অন্যথায়, টেমপ্লেট ডাটাবেসে নতুন সংযোগগুলি ক্রিয়েট ডেটাবেস সম্পূর্ণ না হওয়া পর্যন্ত লক আউট হয়ে যায়।
pg_dump
বা pg_dumpall
ডাটাবেস এবং সমস্ত ডেটা অনুলিপি করার এক ভাল উপায়। আপনি যদি পিজএডমিনের মতো জিইউআই ব্যবহার করে থাকেন, আপনি ব্যাকআপ কমান্ড কার্যকর করার সময় এই কমান্ডগুলি পর্দার আড়ালে ডাকা হয়। নতুন ডাটাবেসে অনুলিপিটি দুটি পর্যায়ে করা হয়: ব্যাকআপ এবং পুনরুদ্ধার
pg_dumpall
PostgreSQL ক্লাস্টারে সমস্ত ডাটাবেস সংরক্ষণ করে। এই পদ্ধতির অসুবিধাটি হ'ল আপনি ডাটাবেস তৈরি করতে এবং ডেটা পপুলেট করার জন্য প্রয়োজনীয় এসকিউএল পূর্ণ একটি খুব বড় টেক্সট ফাইলটি দিয়ে শেষ করুন। এই পদ্ধতির সুবিধা হ'ল আপনি ক্লাস্টারের জন্য সমস্ত ভূমিকা (অনুমতি) বিনামূল্যে পান। সমস্ত ডেটাবেস ডাম্প করতে সুপারসার অ্যাকাউন্ট থেকে এটি করুন
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 আপনি যে ডাটাবেসটি ব্যবহার করতে চান তার নাম।
পোস্টগ্রিএসকিউএল অনুমতি পরিচালনার জন্য রোলগুলি ব্যবহার করে। এগুলি অনুলিপি করা হয় না pg_dump
। এছাড়াও, আমরা postgresql.conf এবং pg_hba.conf- এ সেটিংস নিয়ে কাজ করি নি (আপনি যদি অন্য সার্ভারে ডাটাবেস সরিয়ে নিচ্ছেন )। আপনাকে নিজের মত করে কনফিডের সেটিংস বের করতে হবে। তবে ভূমিকাটি ব্যাক আপ করার জন্য আমি একটি কৌশল খুঁজে পেয়েছি for ভূমিকাগুলি ক্লাস্টার স্তরে পরিচালিত হয় এবং আপনি কমান্ড লাইন স্যুইচ pg_dumpall
দিয়ে কেবল ভূমিকাগুলি ব্যাকআপ করতে বলতে --roles-only
পারেন।
পোস্টগ্রিএসকিউএল 9.1.2:
$ CREATEDB new_db_name -T orig_db_name -O db_user;
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
এবং ফলস্বরূপ প্রয়োজনীয় মূল ডাটাবেসটি নিষ্ক্রিয় থাকতে হবে (লিখিত অ্যাক্সেসের সাথে কোনও সংযোগ নেই) এবং অনুলিপি প্রক্রিয়া চলাকালীন মূল ডাটাবেসে কোনও নতুন সংযোগ প্রতিরোধ করা উচিত। আপনি যদি এতে খুশি হন তবে এটি কাজ করে।
এখনও আগ্রহী ব্যক্তিদের জন্য, আমি একটি বাশ স্ক্রিপ্ট নিয়ে এসেছি যা লেখক যা চেয়েছিল (কমবেশি) করে। আমাকে একটি প্রোডাকশন সিস্টেমে দৈনিক ব্যবসায়ের ডাটাবেস অনুলিপি তৈরি করতে হয়েছিল, এই স্ক্রিপ্টটি কৌশলটি মনে হচ্ছে। ডাটাবেসের নাম / ব্যবহারকারী / pw মান পরিবর্তন করতে ভুলবেন না Remember
#!/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 (ব্যাকআপ এবং পুনরুদ্ধার মাধ্যমে) ব্যবহার করে একটি ডাটাবেস অনুলিপি তৈরির সম্পূর্ণ প্রক্রিয়াটি এখানে রয়েছে
পোস্টগ্রিস প্যাগাদমিন 4 নিয়ে আসে। আপনি যদি ম্যাকোস ব্যবহার করেন তবে আপনি CMD
+ টিপুন SPACE
এবং pgadmin4
এটিকে চালাতে টাইপ করতে পারেন। এটি ক্রোমে একটি ব্রাউজার ট্যাব খুলবে।
ডাটাবেস -> "ব্যাকআপ" রাইট ক্লিক করে এটি করুন
লাইক test12345
। ব্যাকআপ ক্লিক করুন। এটি একটি বাইনারি ফাইল ডাম্প তৈরি করে, এটি কোনও .sql
ফর্ম্যাটে নয়
আপনার পর্দার নীচে ডানদিকে একটি পপআপ থাকা উচিত। আপনার ব্যাকআপ কোথায় ডাউনলোড হয়েছে তা দেখতে "আরও বিশদ" পৃষ্ঠাতে ক্লিক করুন
এই ক্ষেত্রে, এটি /users/vincenttang
ধরুন আপনি 1 থেকে 4 টি পদক্ষেপটি সঠিকভাবে করেছেন, আপনার কাছে পুনরুদ্ধার করা বাইনারি ফাইল থাকবে। এমন এক সময় আসতে পারে যে আপনার সহকর্মী তাদের স্থানীয় মেশিনে আপনার পুনরুদ্ধার ফাইলটি ব্যবহার করতে চায়। বলেছে ব্যক্তি প্যাগাডমিনে গিয়ে পুনরুদ্ধার করুন
ডাটাবেসটিতে ডান ক্লিক করে এটি করুন -> "পুনরুদ্ধার করুন"
ম্যানুয়ালি ফাইলের অবস্থানটি নির্বাচন করার বিষয়টি নিশ্চিত করুন, প্যাগডমিনে আপলোডার ক্ষেত্রগুলিতে কোনও ফাইল টেনে টেনে আনবেন না। কারণ আপনি ত্রুটির অনুমতিতে চলে যাবেন। পরিবর্তে, সবেমাত্র তৈরি করা ফাইলটি সন্ধান করুন:
আপনাকে নীচের অংশে ফিল্টারটি "সমস্ত ফাইল" এ পরিবর্তন করতে হতে পারে। এরপরে ফাইলটি সন্ধান করুন step ধাপ থেকে Now এখন নিশ্চিত করতে নীচে "নির্বাচন করুন" বোতামটি চাপুন
আপনি নির্বাচিত ফাইলের অবস্থান সহ এই পৃষ্ঠাটি আবার দেখতে পাবেন। এগিয়ে যান এবং এটি পুনরুদ্ধার
সব কিছু ঠিক থাকলে নীচের ডানদিকে একটি সফল পুনরুদ্ধার দেখানো একটি সূচক পপআপ করা উচিত। প্রতিটি টেবিলে ডেটা যথাযথভাবে পুনরুদ্ধার করা হয়েছে কিনা তা দেখতে আপনি আপনার টেবিলগুলিতে নেভিগেট করতে পারেন।
পদক্ষেপ 9 ব্যর্থ হওয়া উচিত, আপনার ডাটাবেসে আপনার পুরানো পাবলিক স্কিমা মুছতে চেষ্টা করুন। "ক্যোয়ারী সরঞ্জাম" এ যান
এই কোড ব্লক কার্যকর করুন:
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
এখন আবার 5 থেকে 9 ধাপ চেষ্টা করুন, এটি কার্যকর হওয়া উচিত
সম্পাদনা - কিছু অতিরিক্ত নোট পুনরুদ্ধারকালে "আর্কিভার শিরোনাম 1.14 অসমর্থিত সংস্করণ" এর লাইনে কিছু দিয়ে আপলোড করার সময় আপনি যদি ত্রুটি পেয়ে থাকেন তবে PGADMIN4 আপডেট করুন
যদি ডাটাবেসে খোলা সংযোগ থাকে তবে এই স্ক্রিপ্টটি সাহায্য করতে পারে। আমি প্রতি রাতে লাইভ-প্রোডাকশন ডাটাবেসের ব্যাকআপ থেকে একটি পরীক্ষামূলক ডাটাবেস তৈরি করতে এটি ব্যবহার করি। এটি ধরে নিয়েছে যে আপনার কাছে প্রোডাকশন ডিবি থেকে একটি। এসকিউএল ব্যাকআপ ফাইল রয়েছে (আমি এটি ওয়েবমিনে করি)।
#!/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 -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-CNNSTRING
বা তারপরে এটি কেবল একটি লাইনে যুক্ত করুন:
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;
জিএল এক্সডি