অন্য সার্ভারে PostgreSQL ডাটাবেস অনুলিপি করা হচ্ছে


492

আমি একটি প্রোডাকশন পোস্টগ্রিএসকিউএল ডাটাবেস একটি ডেভলপমেন্ট সার্ভারে অনুলিপি করছি। এটি করার বিষয়ে দ্রুত ও সহজতম উপায় কী?

উত্তর:


666

আপনার মধ্যবর্তী ফাইল তৈরি করার দরকার নেই। আপনি করতে পারেন

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


28
মধ্যবর্তী ফাইলগুলির প্রয়োজন নেই - আপনি সংকুচিত এসএসএইচ টানেল বা কেবল পাইপ ব্যবহার করতে পারেন: pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
কর্নেল

4
আপনি যদি bzip2 ব্যবহার করেন, স্থানান্তর দ্রুত করতে ssh সংক্ষেপণ বন্ধ করুন!
lzap

8
আমি কীভাবে সংকুচিত হয়ে কাজ করতে পারি যদি আমি উত্পাদন থেকে ডেটা নীচে বিকাশে টানছি ? আমি উন্নয়ন থেকে উত্পাদনে এসএসএইচ সংযোগ স্থাপন করেছি। তাহলে কি তাই হবে ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname?
জেরোমি ফ্রেঞ্চ

2
আমি আশা করব যে আপনি y নামের সাথে একটি স্থানীয় ডাটাবেসে এক্স নামের সাথে একটি দূরবর্তী ডাটাবেস অনুলিপি করতে সক্ষম হবেন, তবে @ ফেরান এর সমাধান এটির জন্য কার্যকর হয় না ... এটি আমার কাছে মনে হচ্ছে পর্নেলের সমাধানটি কেবল bzip2 ফাইলগুলিকে ছেড়ে দেয় সার্ভার, যাতে এটি এক পদক্ষেপ প্রক্রিয়া নয়। এটি হ'ল, আমি অনুমান করি যে আমি ডাটাবেস y ফেলে দেব, ফেরান এর সমাধানের "বা" অংশটি ব্যবহার করব যা এক্স পুনরুদ্ধার করে, তারপরে ডাটাবেসটির নামকরণ করে y করবে।
ডারিন পিটারসন

3
আমি এটিই করেছি: (1) পিজি_ডাম্প-সি -h রিমোটহস্ট -উ রিমুয়েউজার এক্স | পিএসকিএল -এ লোকালহোস্ট-ইউ লোকালুসার (2) ড্রপডবাই ওয়াই (3) পিএসকিএল -U পোস্টগ্রিস -c 'অলটার ডাটাবেস "এক্স" পুনরায় নাম "ইয়" "
দারিন পিটারসন

131
pg_dump the_db_name > the_backup.sql

তারপরে আপনার বিকাশ সার্ভারে ব্যাকআপটি অনুলিপি করুন, এর সাথে পুনরুদ্ধার করুন:

psql the_new_dev_db < the_backup.sql

3
কেউ আমাকে বলেছিলেন এটি সমস্যাযুক্ত হতে পারে - অনুমতিগুলি সমস্যা হ'ল ডাম্পের কারণ হয় বা ট্রিগারে আঘাত করলে মারা যায়?
রবিন বার্নস

17
@ আরম্বার্নেস: সমস্যা থাকলে - সেগুলি ঠিক করতে হবে। এই "কেউ একজন" কী করেছে তা বিশদ জ্ঞান ছাড়াই - কেউ এই দাবিটিকে নিশ্চিত বা খারিজ করতে পারবেন না।

4
Pg_dump সহ - কোনও-মালিকের পতাকা ব্যবহার করুন। এটি সমস্যাটি এড়িয়ে যায় এবং এই পোস্টের প্রথম সম্পাদনাটি এটি ব্যবহার করেছে - তবে আমি ভেবেছিলাম আপনার মূল ডেটাবেসটির আরও সুনির্দিষ্ট বিশ্বস্ততার প্রয়োজন।
আনমাউন্ট করা

4
আমার জন্য, উপরোক্ত পদ্ধতির নিম্নলিখিত পদ্ধতিতে কাজ করা হয়েছিল: pg_dump -C -h- হোস্ট -U ব্যবহারকারীর নাম db_name> / any_directory / dump_schema_and_data_file .আর ফাইলটি থেকে পুনরুদ্ধার করার জন্য: পিএসএলএল-হোস্ট-ইউ ব্যবহারকারীর ডিবি_নাম <ডাম্প_স্কেমা_ এবং_ডাটা_ফাইল
আলী রাজা

এটি আমাকে প্রচুর উত্তেজনা থেকে বাঁচিয়েছে। আমি মেশিনের মধ্যে ফাইল সরাতে গুগল ড্রাইভ ব্যবহার করেছি। যেহেতু আমার কাছে ইতিমধ্যে নতুন মেশিনে ডাটাবেস ছিল (তবে ফাঁকা) আমি প্রচুর সদৃশ কী ত্রুটি পেয়েছি। যাইহোক, এটি একটি দেব পরিবেশ এবং তারা কোনও ক্ষতি করেনি।
ক্রিস মেন্ডলা

37

ব্যবহারের 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

22

আপনি যদি সংস্করণগুলির মধ্যে স্থানান্তর করতে চান তবে (যেমন আপনি পোস্টগ্রাগগুলি আপডেট করেছেন এবং লোকালহোস্টে 9.1 চলছে: 5432 এবং 9.3 লোকালহোস্টে চলছে: 5434) আপনি চালাতে পারেন:

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434

মাইগ্রেশন ডক্স পরীক্ষা করে দেখুন ।


আমাকে (myuser91 / postgres) - পাসওয়ার্ড একাধিকবার জিজ্ঞাসা করা হয়েছে, এমন কোনও উপায় আছে যাতে আমাকে একবারে পাসওয়ার্ডটি প্রবেশ করতে হবে?
মার্টিন ওয়েবার

@MartinWeber একটি pgpass ফাইল এই দস্তাবেজটি অনুযায়ী তৈরি করুন postgresql.org/docs/9.4/static/libpq-pgpass.html
স্কট ওয়ারেন

যদি তাদের উভয় একই বন্দর থাকে?
জিগনোরডো

যদি তারা বিভিন্ন সার্ভারে থাকে তবে আপনি হোস্টগুলি নির্দিষ্ট করতে h ব্যবহার করতে পারেন।
হ্যারল্ডো_ওকে

16

pg_basebackup এখন এটি করার আরও ভাল উপায় বলে মনে হচ্ছে, বিশেষত বড় ডাটাবেসের জন্য।

আপনি একই বা পুরানো বড় সংস্করণ সহ কোনও সার্ভার থেকে একটি ডাটাবেস অনুলিপি করতে পারেন। বা আরও স্পষ্টভাবে :

pg_basebackupএকই বা পুরানো একটি বড় সংস্করণের সার্ভারের সাথে কাজ করে 9.1। তবে ওয়াল স্ট্রিমিং মোড ( -X stream) কেবলমাত্র সার্ভার সংস্করণ 9.3 এবং তারপরেই কাজ করে এবং --format=tarবর্তমান সংস্করণটির ট্যার ফর্ম্যাট মোড ( ) কেবলমাত্র সার্ভার সংস্করণ 9.5 বা তার পরে কাজ করে।

তার জন্য আপনার উত্স সার্ভারে প্রয়োজন:

  1. listen_addresses = '*'লক্ষ্য সার্ভার থেকে সংযোগ করতে সক্ষম হতে। নিশ্চিত হয়ে নিন যে 5432 পোর্ট খোলা আছে।
  2. অন্তত 1 প্রাপ্তিসাধ্য রেপ্লিকেশন সংযোগ: max_wal_senders = 1( -X fetch), 2জন্য -X stream(পোস্টগ্রি 12 ক্ষেত্রে ডিফল্ট), অথবা আরও অনেক কিছু।
  3. wal_level = replicaবা উচ্চতর সেট করতে সক্ষম max_wal_senders > 0
  4. 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

11
আপনি কি উদাহরণস্বরূপ আপনার উত্তরে আরও বিশদ সরবরাহ করতে পারেন?
ম্যাগনাইলেক্স

7
এটি কেবল তখনই কার্যকর হয় যখন উভয় মেশিনের একই পিজি সংস্করণ থাকে।
sm

সম্ভাবনাগুলি ছোট যে আপনি বিকাশ এবং উত্পাদনের জন্য বিভিন্ন ডাটাবেস সংস্করণ ব্যবহার করবেন। গতবার আমার সতীর্থের একজনের সাথে আমার কিছু অপ্রীতিকর কথোপকথন হয়েছিল কারণ তিনি একটি সমস্যা জমা দেওয়ার চেষ্টা করছিলেন যে কিছু কোড পিজি 9.6 এর সাথে কাজ করছে না যখন আমরা তখন প্রযোজনায় 9.5 ব্যবহার করেছি। বেস ব্যাকআপ অনেক দ্রুত। তারপরে প্রয়োজনে পিজি_আপগ্রেড হবার উপায়।
জোরর্গ

2
সম্ভাবনাগুলি হ'ল আপনি একটি নতুন সংস্করণে মাইগ্রেট করতে চান এবং পোস্টগ্রেএসকিউএল থামাতে চান না।
এক্স-ইউরি

1
সম্ভাবনাগুলি হ'ল যখনই আপনি আপনার ডাটাবেস আপগ্রেড করবেন আপনি উত্পাদন করার আগে এটি ডেভ এবং মঞ্চে আপগ্রেড করবেন।
অ্যান্ড্রু লরিয়েন

8

ডাটাবেসের নাম দিয়ে এই কমান্ডটি চালান, আপনি ব্যাকআপ নিতে চান, ডিবি ডাম্প নিতে।

 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

7

আমি বেশ লড়াই করেছি এবং অবশেষে যে পদ্ধতিটি আমাকে রেল 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

সার্ভারের মধ্যে ডাম্প.এসকিএল ফাইলটি স্থানান্তর করার জন্য আমি কেবল "বিড়াল" ব্যবহার করে বিষয়বস্তুটি মুদ্রণ করতে এবং "ন্যানো" এর চেয়ে এটি পুনরায় তৈরি করতে সামগ্রীটি কপিপাস্ট করে রেখেছি।

এছাড়াও, দুটি ডাটাবেসে আমি যে রোলটি ব্যবহার করছিলাম তা অন্যরকম ছিল তাই আমাকে ডাম্পের সমস্ত মালিকের নাম সন্ধান-প্রতিস্থাপন করতে হয়েছিল।


5

আপনার টেবিলের ডেটাটি একটি সার্ভার থেকে অন্য পোস্টগ্রিজ এসকিউএল সার্ভারে অনুলিপি করতে আমি একটি লিনাক্স শেল স্ক্রিপ্ট ভাগ করতে পারি।

রেফারেন্স এই ব্লগ থেকে নেওয়া:

পোস্টগ্রেএসকিউএল সার্ভারের মধ্যে ডেটা মাইগ্রেশনের জন্য লিনাক্স ব্যাশ শেল স্ক্রিপ্ট:

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

আমি কেবল ডেটা স্থানান্তর করছি; দয়া করে আপনার গন্তব্য / দ্বিতীয় ডাটাবেস সার্ভারে একটি ফাঁকা টেবিল তৈরি করুন।

এটি একটি ইউটিলিটি স্ক্রিপ্ট। এছাড়াও, আপনি সাধারণ ব্যবহারের জন্য স্ক্রিপ্টটি পরিবর্তন করতে পারেন যেমন হোস্ট_নাম, ডাটাবেস_নাম, টেবিলের নাম এবং অন্যদের জন্য প্যারামিটার যুক্ত করে


5

আপনার ডাটাবেস ডাম্প: pg_dump database_name_name > backup.sql


আপনার ডাটাবেসটি আবার আমদানি করুন: psql db_name < backup.sql


5

গৃহীত উত্তরটি সঠিক, তবে আপনি যদি ইন্টারেক্টিভভাবে পাসওয়ার্ডটি প্রবেশ করা এড়াতে চান, আপনি এটি ব্যবহার করতে পারেন:

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}}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.