আমি একটি প্রোডাকশন পোস্টগ্রিএসকিউএল ডাটাবেস একটি ডেভলপমেন্ট সার্ভারে অনুলিপি করছি। এটি করার বিষয়ে দ্রুত ও সহজতম উপায় কী?
আমি একটি প্রোডাকশন পোস্টগ্রিএসকিউএল ডাটাবেস একটি ডেভলপমেন্ট সার্ভারে অনুলিপি করছি। এটি করার বিষয়ে দ্রুত ও সহজতম উপায় কী?
উত্তর:
আপনার মধ্যবর্তী ফাইল তৈরি করার দরকার নেই। আপনি করতে পারেন
pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname
অথবা
pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname
ব্যবহার psql
বা pg_dump
একটি দূরবর্তী হোস্টে সংযোগ করতে।
একটি বড় ডাটাবেস বা একটি ধীর সংযোগের সাথে, একটি ফাইল ডাম্পিং এবং সংকুচিত ফাইলটি স্থানান্তরকরণ দ্রুততর হতে পারে।
কার্নেল যেমন বলেছিলেন যে মধ্যবর্তী ফাইলটিতে ডাম্প করার দরকার নেই, আপনি সংকুচিত হয়ে কাজ করতে চাইলে আপনি একটি সংকুচিত টানেল ব্যবহার করতে পারেন
pg_dump -C dbname | bzip2 | ssh remoteuser@remotehost "bunzip2 | psql dbname"
অথবা
pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"
তবে এই সমাধানটির উভয় প্রান্তে একটি অধিবেশন হওয়াও দরকার।
দ্রষ্টব্য: pg_dump
ব্যাক আপ করার psql
জন্য এবং পুনরুদ্ধারের জন্য। সুতরাং, এই উত্তর প্রথম কমান্ডের সাহায্যে দূরবর্তী স্থানীয় থেকে কপি করতে হয় এবং দ্বিতীয় স্থানীয় দূরবর্তী থেকে । আরও -> https://www.postgresql.org/docs/9.6/app-pgdump.html
ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname
?
pg_dump the_db_name > the_backup.sql
তারপরে আপনার বিকাশ সার্ভারে ব্যাকআপটি অনুলিপি করুন, এর সাথে পুনরুদ্ধার করুন:
psql the_new_dev_db < the_backup.sql
ব্যবহারের pg_dump , এবং পরে psql বা pg_restore - নির্ভর করে কিনা pg_dump করার -Fp বা -Fc অপশন চয়ন।
ব্যবহারের উদাহরণ:
ssh production
pg_dump -C -Fp -f dump.sql -U postgres some_database_name
scp dump.sql development:
rm dump.sql
ssh development
psql -U postgres -f dump.sql
আপনি যদি সংস্করণগুলির মধ্যে স্থানান্তর করতে চান তবে (যেমন আপনি পোস্টগ্রাগগুলি আপডেট করেছেন এবং লোকালহোস্টে 9.1 চলছে: 5432 এবং 9.3 লোকালহোস্টে চলছে: 5434) আপনি চালাতে পারেন:
pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434
মাইগ্রেশন ডক্স পরীক্ষা করে দেখুন ।
pg_basebackup
এখন এটি করার আরও ভাল উপায় বলে মনে হচ্ছে, বিশেষত বড় ডাটাবেসের জন্য।
আপনি একই বা পুরানো বড় সংস্করণ সহ কোনও সার্ভার থেকে একটি ডাটাবেস অনুলিপি করতে পারেন। বা আরও স্পষ্টভাবে :
pg_basebackup
একই বা পুরানো একটি বড় সংস্করণের সার্ভারের সাথে কাজ করে 9.1। তবে ওয়াল স্ট্রিমিং মোড (-X stream
) কেবলমাত্র সার্ভার সংস্করণ 9.3 এবং তারপরেই কাজ করে এবং--format=tar
বর্তমান সংস্করণটির ট্যার ফর্ম্যাট মোড ( ) কেবলমাত্র সার্ভার সংস্করণ 9.5 বা তার পরে কাজ করে।
তার জন্য আপনার উত্স সার্ভারে প্রয়োজন:
listen_addresses = '*'
লক্ষ্য সার্ভার থেকে সংযোগ করতে সক্ষম হতে। নিশ্চিত হয়ে নিন যে 5432 পোর্ট খোলা আছে।max_wal_senders = 1
( -X fetch
), 2
জন্য -X stream
(পোস্টগ্রি 12 ক্ষেত্রে ডিফল্ট), অথবা আরও অনেক কিছু।wal_level = replica
বা উচ্চতর সেট করতে সক্ষম max_wal_senders > 0
।host replication postgres DST_IP/32 trust
মধ্যে pg_hba.conf
। এটি মেশিন pg
থেকে যে কাউকে ক্লাস্টারে অ্যাক্সেস দেয় DST_IP
। আপনি আরও সুরক্ষিত বিকল্পটি অবলম্বন করতে চাইতে পারেন।1, 2, 3 পরিবর্তনগুলির জন্য সার্ভার পুনঃসূচনা প্রয়োজন, 4 পরিবর্তনটি পুনরায় লোড প্রয়োজন।
লক্ষ্য সার্ভারে:
# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME
ডাটাবেসের নাম দিয়ে এই কমান্ডটি চালান, আপনি ব্যাকআপ নিতে চান, ডিবি ডাম্প নিতে।
pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}
eg. pg_dump -U postgres mydbname -f mydbnamedump.sql
এখন এই ডাম্প ফাইলটি রিমোট মেশিনে স্ক্যাপ করুন যেখানে আপনি ডিবি অনুলিপি করতে চান।
eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/
রিমোট মেশিনে ডিবি পুনরুদ্ধার করতে ~ / কিছু / ফোল্ডারে নিম্নলিখিত কমান্ডটি চালান।
psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql}
eg. psql -U postgres -d mynewdb -f mydbnamedump.sql
আমি বেশ লড়াই করেছি এবং অবশেষে যে পদ্ধতিটি আমাকে রেল 4 দিয়ে কাজ করতে দেয় তা হ'ল:
আপনার পুরানো সার্ভারে
sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql
আমাকে ডাম্প তৈরি করতে পোস্টগ্র্রেস লিনাক্স ব্যবহারকারী ব্যবহার করতে হয়েছিল। এছাড়াও নতুন সার্ভারে ডাটাবেস তৈরি করতে আমাকে বাধ্য করতে -c ব্যবহার করতে হয়েছিল। --inserts এটিকে INSERT () সিনট্যাক্সটি ব্যবহার করতে বলে যা অন্যথায় আমার পক্ষে কাজ করে না :(
তারপরে, নতুন সার্ভারে, সরলী:
sudo su - postgres
psql new_database_name < dump.sql
সার্ভারের মধ্যে ডাম্প.এসকিএল ফাইলটি স্থানান্তর করার জন্য আমি কেবল "বিড়াল" ব্যবহার করে বিষয়বস্তুটি মুদ্রণ করতে এবং "ন্যানো" এর চেয়ে এটি পুনরায় তৈরি করতে সামগ্রীটি কপিপাস্ট করে রেখেছি।
এছাড়াও, দুটি ডাটাবেসে আমি যে রোলটি ব্যবহার করছিলাম তা অন্যরকম ছিল তাই আমাকে ডাম্পের সমস্ত মালিকের নাম সন্ধান-প্রতিস্থাপন করতে হয়েছিল।
আপনার টেবিলের ডেটাটি একটি সার্ভার থেকে অন্য পোস্টগ্রিজ এসকিউএল সার্ভারে অনুলিপি করতে আমি একটি লিনাক্স শেল স্ক্রিপ্ট ভাগ করতে পারি।
রেফারেন্স এই ব্লগ থেকে নেওয়া:
পোস্টগ্রেএসকিউএল সার্ভারের মধ্যে ডেটা মাইগ্রেশনের জন্য লিনাক্স ব্যাশ শেল স্ক্রিপ্ট:
#!/bin/bash
psql \
-X \
-U user_name \
-h host_name1 \
-d database_name \
-c "\\copy tbl_Students to stdout" \
| \
psql \
-X \
-U user_name \
-h host_name2 \
-d database_name \
-c "\\copy tbl_Students from stdin"
আমি কেবল ডেটা স্থানান্তর করছি; দয়া করে আপনার গন্তব্য / দ্বিতীয় ডাটাবেস সার্ভারে একটি ফাঁকা টেবিল তৈরি করুন।
এটি একটি ইউটিলিটি স্ক্রিপ্ট। এছাড়াও, আপনি সাধারণ ব্যবহারের জন্য স্ক্রিপ্টটি পরিবর্তন করতে পারেন যেমন হোস্ট_নাম, ডাটাবেস_নাম, টেবিলের নাম এবং অন্যদের জন্য প্যারামিটার যুক্ত করে
আপনার ডাটাবেস ডাম্প: pg_dump database_name_name > backup.sql
আপনার ডাটাবেসটি আবার আমদানি করুন: psql db_name < backup.sql
গৃহীত উত্তরটি সঠিক, তবে আপনি যদি ইন্টারেক্টিভভাবে পাসওয়ার্ডটি প্রবেশ করা এড়াতে চান, আপনি এটি ব্যবহার করতে পারেন:
PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}}