পোস্টগ্রিসে অন্য একটি ডাটাবেস থেকে একটি টেবিল অনুলিপি করুন


273

পোস্টগ্রিসে আমি একটি পুরো ডাটাবেস থেকে অন্য ডাটাবেসে অনুলিপি করার চেষ্টা করছি। কোনও পরামর্শ?


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

উত্তর:


311

টেবিলটি বের করুন এবং এটি সরাসরি টার্গেটের ডেটাবেসে পাইপ করুন:

pg_dump -t table_to_copy source_db | psql target_db

দ্রষ্টব্য: যদি অন্য ডাটাবেসে ইতিমধ্যে টেবিলটি সেট আপ করা থাকে তবে -aকেবলমাত্র ডেটা আমদানি করার জন্য আপনার পতাকাটি ব্যবহার করা উচিত , অন্যথায় আপনি "মেমরির বাইরে" এর মতো অদ্ভুত ত্রুটি দেখতে পাবেন:

pg_dump -a -t my_table my_db | psql target_db

5
দূরবর্তী-ডিবি লিঙ্কগুলির জন্য এটি কীভাবে কাজ করবে? উদাহরণস্বরূপ, আমার আলাদা জায়গা থেকে ডাম্প করা উচিত।
কার্লিগ্রেগি

17
@ কুরিলিগি এটি চেষ্টা করেননি, তবে এটি কাজ না করার কোনও কারণ আমি দেখতে পাচ্ছি না। কমান্ডটিতে ব্যবহারকারী এবং সার্ভারের নির্দিষ্টকরণ যুক্ত করার চেষ্টা করুন, যেমনpg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
থোম্যাক্স

2
আপনি এটি চেষ্টা করতে পারেন: "পিজি_ডাম্প-ইউ রিমোট_উজার -h রিমোট_সার্ভার-টেবিল_ টো_কপি উত্স_ডিবি | পিএসকিএল টার্গেট_ডিবি -উ রিমোট_ইউজার -h রিমোট_সার্ভার"
হুয়া ঝাং

18
মনে রাখবেন যে অন্য ডাটাবেসে যদি ইতিমধ্যে টেবিল সেট আপ করা থাকে তবে আপনার কেবলমাত্র ডেটার-a জন্য পতাকা ব্যবহার করা উচিত । অর্থাত । আমি এখানে থাকাকালীন, যদি আপনার ডাটাবেসটি কোনও সার্ভারে থাকে তবে আমি কেবল একটি ফাইলটিতে ডাটাবেস ডাম্প করা এবং তারপরে সেই ফাইলটিকে ডাটাবেসে স্কিপ করা সহজ মনে করি, তারপরে ফাইলটির সামগ্রীগুলি পিএসএকএল-তে প্রেরণ করুন। যেমন এবং আপনার সার্ভারে যে নির্বাণ পর ->pg_dump -a -t my_table my_db | psql target_dbpg_dump -a -t my_table my_db > my_file.sqlpsql my_other_db < my_file.sql
নিক ব্র্যাডি

3
@EamonnKenny একটি কেস সংবেদনশীল টেবিল ডাম্প করা, একটি করুন: pg_dump -t '"tableToCopy"' source_db | psql target_db। নোট করুন যে একক এবং ডাবল উদ্ধৃতিগুলি টেবিলের নামটিকে ঘিরে রয়েছে
গিলাদ মায়ানী

105

আপনি পিজএডমিন II-তে ব্যাকআপ কার্যকারিতাও ব্যবহার করতে পারেন। কেবল এই পদক্ষেপগুলি অনুসরণ করুন:

  • পিজিএডমিনে, আপনি যে টেবিলটি সরাতে চান তার ডানদিকে ক্লিক করুন, "ব্যাকআপ" নির্বাচন করুন
  • আউটপুট ফাইলের জন্য ডিরেক্টরি চয়ন করুন এবং "প্লেইন" এ ফর্ম্যাট সেট করুন
  • "ডাম্প বিকল্প # 1" ট্যাবে ক্লিক করুন, "কেবলমাত্র ডেটা" বা "কেবলমাত্র স্কিমা" (আপনি কী করছেন তার উপর নির্ভর করে) পরীক্ষা করুন
  • প্রশ্ন বিভাগের অধীনে, "কলাম সন্নিবেশ ব্যবহার করুন" এবং "ব্যবহারকারী সন্নিবেশ আদেশগুলি" ক্লিক করুন।
  • "ব্যাকআপ" বোতামটি ক্লিক করুন। এটি একটি .ব্যাকআপ ফাইলে আউটপুট দেয়
  • নোটপ্যাড ব্যবহার করে এই নতুন ফাইলটি খুলুন। আপনি সারণী / ডেটার জন্য প্রয়োজনীয় সন্নিবেশ স্ক্রিপ্টগুলি দেখতে পাবেন। এগুলিকে পিজিএডমিনে নতুন ডাটাবেস স্কেল পৃষ্ঠাতে কপি এবং পেস্ট করুন। পিজস্ক্রিপ্ট হিসাবে চালান - প্রশ্ন-> পিজস্ক্রিপ্ট এফ 6 হিসাবে কার্যকর করুন

ভাল কাজ করে এবং একসাথে একাধিক টেবিল করতে পারে।


1
এটি ডাটাবেসের মধ্যে ডেটা সরিয়ে নেওয়ার জন্য একটি ভাল গুই-ভিত্তিক সমাধান। ধন্যবাদ!
কেজিএক্স

3
আপনি Objectsবিভাগের অধীনে একাধিক সারণী নির্বাচন করতে পারেন । ওএসএক্স-এ, এসকিউএল বোতামটি ক্লিক করুন বা ব্যাকআপ ফাইল থেকে অনুলিপি করা এসকিউএল-এ পেস্ট করার SQL Editorজন্য Toolsমেনুটির মাধ্যমে পান।
Aleck Landgraf

ধন্যবাদ, ধন্যবাদ বড় টেবিলে থাকলেও খুব ধীর .. এটির গতি বাড়ানোর আরও ভাল উপায় কি আছে? (বিদেশী কী বা কিছু উপেক্ষা করার মতো?)
টিমোসোলো

3
@ টিমোথি এখানে ব্যাক আপ এবং পুনরুদ্ধার দ্রুত করার বিষয়ে ডকুমেন্টেশন পৃষ্ঠাটি পোস্ট করেছেন
লরি

পুরানো উত্তর কিন্তু এখনও প্রাসঙ্গিক, দুর্দান্ত কাজ করে, সব ডাটাবেস রফতানি করার সময় কেবল ট্রিগারগুলি অক্ষম করতে ভুলবেন না
নরবার্টাস.গোলিয়া

75

ডিবিলিঙ্ক ব্যবহার করা আরও সুবিধাজনক হবে!

truncate table tableA;

insert into tableA
select *
from dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
            'select a,b from tableA')
       as t1(a text,b text);

12
দু'বারে দুটি ডিবিনেম কেন ..? কোনটি উত্স এবং লক্ষ্য?
arulraj.net

1
আমরা যে টেবিলএতে সন্নিবেশ করছি সেটি হ'ল গন্তব্য এবং ডিবিলিঙ্কের টেবিলএই উত্স।
aggietech

আমি যদি ডিবিলিঙ্ক বান ব্যবহার করতে চাই তবে আমি উত্স উত্স সারণীর কাঠামোটি জানি না?
অসারোটি

31

উভয় সার্ভারের সাথে সংযোগ রয়েছে এমন লিনাক্স হোস্টে, পিএসকিএল ব্যবহার করে

( export PGPASSWORD=password1 
  psql -U user1 -h host1 database1 \
  -c "copy (select field1,field2 from table1) to stdout with csv" ) \
| 
( export PGPASSWORD=password2 
  psql -U user2 -h host2 database2 \ 
   -c "copy table2 (field1, field2) from stdin csv" )

রফতানির দরকার নেই, PGPASSWORD=password1 psql -U ...তারপরে আপনার স্পষ্টত সাবসেলও লাগবে না! সাধারণত, আপনি প্রথমে সেট আপ করার জন্য কয়েকটি জিনিস করতে চাইবেন, তবে সাব-শেলগুলি যাইহোক প্রয়োজনীয় হতে পারে। এছাড়াও, পাসওয়ার্ডগুলি পরবর্তী প্রক্রিয়াগুলিতে রফতানি করা হবে না। ধন্যবাদ!
সীমিত প্রায়শ্চিত্ত

1
@ লিমিটেডটোনমেন্ট আসলে আপনার পক্ষে ঠিক আছে, রফতানি করা এবং সাব-হেলগুলি প্রয়োজনীয় নয়। এটি আরও জটিল স্ক্রিপ্টের একটি অংশ মাত্র, এবং এমনকি আমি রফতানি ও সাবহেলগুলি ছাড়া চেষ্টাও করি নি, তাই আমি কেবল এটি সৎ হতে চেষ্টা করি এবং কাজের সমাধান সরবরাহ করি
আলেক্সি শিরিদভ

গন্তব্য ডিবিতে সারণীটি উপস্থিত থাকতে হবে। এটি তৈরি করতে, চেষ্টা করুনpg_dump -t '<table_name>' --schema-only
এফজেএসজে

24

প্রথমে ডিবিলিঙ্ক ইনস্টল করুন

তারপরে, আপনি এমন কিছু করবেন:

INSERT INTO t2 select * from 
dblink('host=1.2.3.4
 user=*****
 password=******
 dbname=D1', 'select * t1') tt(
       id int,
  col_1 character varying,
  col_2 character varying,
  col_3 int,
  col_4 varchar 
);

1
এই উত্তরটি দুর্দান্ত কারণ এটি কাউকে অনুলিপি করা সারিগুলিকে ফিল্টার করতে দেয় (ডিবিলিংকের ২ য় আর্গুমেন্টে যেখানে শৃঙ্খলা যুক্ত করুন)। তবে কলামের নামগুলি (পোস্টগ্রেস 9.4) সম্পর্কে কিছু স্পষ্ট করা দরকার যেমন: INSERT INTO l_tbl (l_col1, l_col2, l_col3) SELECT * FROM dblink('dbname=r_db hostaddr=r_ip password=r_pass user=r_usr', 'select r_col1, r_col2, r_col3 from r_tbl where r_col1 between ''2015-10-29'' AND ''2015-10-30'' ') AS t1(col1 MACADDR, col2 TIMESTAMP, col3 NUMERIC(7,1));(আমি স্থানীয়, আর রিমোট, একক উদ্ধৃতি
এড়ান

14

সারণী ডেটা ডাম্প করতে pg_dump ব্যবহার করুন এবং তারপরে এটি পিএসএকএল দিয়ে পুনরুদ্ধার করুন।


2
তারপরে সংযোগের জন্য অন্য একটি ডাটাবেসবোল ব্যবহার করুন, এমন একটি ভূমিকা যাতে পর্যাপ্ত অনুমতি রয়েছে। postgresql.org/docs/8.4/static/app-pgdump.html
ফ্রাঙ্ক হিকেন্স

আমি কি ভুল করছি? pg_dump -t "টেবিলের নাম" dbName --rol "postgres"> db.sql "postgres" এমন ব্যবহারকারী হবেন যার জন্য আমি ভূমিকাটি সেট করার চেষ্টা করছি। এটি এখনও আমাকে "অ্যাক্সেস প্রত্যাখ্যান করা" দেয়।
নিক্স

আপনার কাছে db.sql ফাইলটি লেখার অনুমতি আছে?
অদ্ভুত

আমার কী অনুমতি আছে তা আমি কীভাবে চেক করব?
নিক্স

এই থ্রেডটি পুরানো, তবে অন্য কারও সমস্যা হওয়ার জন্য, PgAdminIII- এর 'সরঞ্জাম -> ব্যাকআপ' মেনুটি ব্যবহার করে দেখুন, যা অনুমতি সংক্রান্ত সমস্যাটি পেয়েছে বলে মনে হচ্ছে।
জন

13

আপনার যদি উভয় দূরবর্তী সার্ভার থাকে তবে আপনি এটি অনুসরণ করতে পারেন:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

যদি আপনার ইতিমধ্যে বিদ্যমান স্কিমা থাকে তবে এটি উত্স ডাটাবেসের উল্লিখিত টেবিলটিকে একই ডাটাবেসের টার্গেটের ডাটাবেজে অনুলিপি করবে।


9

আপনি নিম্নলিখিত করতে পারেন:

pg_dump -h <host ip address> -U <host db user name> -t <host table> > <host database> | psql -h localhost -d <local database> -U <local db user>


2
আপনি কি এটি সম্পর্কে কিছু বলতে চান
মুহাম্মদ ওমর আসলাম

এটি বৈধ। আপনি আমার নিজের
মুহাম্মদ ওমর আসলাম

8

আমার জন্য যা কাজ করেছে তা এখানে। একটি ফাইলে প্রথমে ফেলা:

pg_dump -h localhost -U myuser -C -t my_table -d first_db>/tmp/table_dump

তারপরে ডাম্পড ফাইলটি লোড করুন:

psql -U myuser -d second_db</tmp/table_dump

ডাম্প লোডের জন্যও "-h লোকালহোস্ট" দরকার
টিটিউকানস

6

আপনার স্থানীয় সেটআপে একটি টেবিলটি ডাটাবেস এ থেকে ডাটাবেস বিতে সরাতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

pg_dump -h localhost -U owner-name -p 5432 -C -t table-name database1 | psql -U owner-name -h localhost -p 5432 database2

আমি এটা চেষ্টা করেছি. এটি কাজ করে না কারণ আপনি কেবল এটি প্রথম পাসওয়ার্ড দিতে পারেন।
সর্বোচ্চ

1
@ ম্যাক্স আপনি export PGPASSWORD=<passw>কমান্ডটি চালানোর আগে করতে পারেন
লুকাশজেনকো

4

আমি এখানে কয়েকটি সমাধান চেষ্টা করেছি এবং সেগুলি সত্যই সহায়ক ছিল। আমার অভিজ্ঞতায় সেরা সমাধান হল পিএসএকিএল কমান্ড লাইন ব্যবহার করা , তবে কখনও কখনও আমি পিএসএকিএল কমান্ড লাইন ব্যবহার করার মতো অনুভব করি না। সুতরাং এখানে pgAdminIII এর জন্য আরও একটি সমাধান

create table table1 as(
 select t1.* 
 from dblink(
   'dbname=dbSource user=user1 password=passwordUser1',
   'select * from table1'  
  ) as t1(
    fieldName1 as bigserial,
    fieldName2 as text,
    fieldName3 as double precision 
  )
 )

এই পদ্ধতির সমস্যাটি হ'ল ক্ষেত্রগুলির নাম এবং তাদের কপির সারণির ধরণগুলি অবশ্যই লিখতে হবে।


4

pg_dump সবসময় কাজ করে না।

উভয় ডিবিএসে আপনার একই টেবিলের ডিডিএল রয়েছে তা আপনি স্টডআউট এবং স্টিডিন থেকে নীচে হ্যাক করতে পারেন:

 # grab the list of cols straight from bash

 psql -d "$src_db" -t -c \
 "SELECT column_name 
 FROM information_schema.columns 
 WHERE 1=1 
 AND table_name='"$table_to_copy"'"
 # ^^^ filter autogenerated cols if needed     

 psql -d "$src_db" -c  \
 "copy ( SELECT col_1 , col2 FROM table_to_copy) TO STDOUT" |\
 psql -d "$tgt_db" -c "\copy table_to_copy (col_1 , col2) FROM STDIN"

3

ব্যবহারকারী 5542464 এবং পীযূষ এস ওয়ানারে উত্তর হিসাবে একই তবে দুটি পদক্ষেপে বিভক্ত:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

অন্যথায় পাইপ একই সময়ে দুটি পাসওয়ার্ড জিজ্ঞাসা করে।


আমি লক্ষ্য ডাটাবেসের টেবিলের নাম উল্লেখ করতে পারে যে সম্ভাবনা আছে?
পীযূষ এস ওয়ানারে

2

বিভিন্ন ডাটাবেসে একটি টেবিলের ডেটা অন্য টেবিলের অনুলিপি করতে আপনাকে DbLink ব্যবহার করতে হবে। ক্রস ডাটাবেস কোয়েরি সম্পাদন করতে আপনাকে DbLink এক্সটেনশনটি ইনস্টল এবং কনফিগার করতে হবে।

আমি ইতিমধ্যে এই বিষয়ে বিস্তারিত পোস্ট তৈরি করেছি। দয়া করে এই লিঙ্কটি দেখুন


2

এই অজগর স্ক্রিপ্টটি পরীক্ষা করুন

python db_copy_table.py "host=192.168.1.1 port=5432 user=admin password=admin dbname=mydb" "host=localhost port=5432 user=admin password=admin dbname=mydb" alarmrules -w "WHERE id=19" -v
Source number of rows = 2
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister1',true,false);
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister2',true,false);

1

যদি উভয় ডিবি (এবং থেকে) পাসওয়ার্ড সুরক্ষিত থাকে তবে সেই দৃশ্যে টার্মিনাল উভয় ডিবি-র জন্য পাসওয়ার্ড জিজ্ঞাসা করবে না, পাসওয়ার্ড প্রম্পটটি কেবল একবার উপস্থিত হবে। সুতরাং, এটি ঠিক করতে, কমান্ডের সাথে পাসওয়ার্ডটি পাস করুন।

PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>

1

আমি ডেটাগ্রিপ (ইন্টেলিজ আইডিয়া দ্বারা) ব্যবহার করছিলাম । এবং এটি খুব সহজেই একটি টেবিল থেকে ডেটা অনুলিপি করা হয়েছিল (অন্য একটি ডাটাবেসে অন্যটিতে)।

প্রথমে নিশ্চিত হয়ে নিন যে আপনি উভয় ডেটা গ্রিপে ডেটাসোর্সের সাথে সংযুক্ত আছেন।

উত্স সারণী নির্বাচন করুন এবং F5 টিপুন বা (ডান ক্লিক করুন -> অনুলিপি সারণী নির্বাচন করুন।)

এটি আপনাকে সমস্ত সারণীর একটি তালিকা প্রদর্শন করবে (আপনি পপআপ উইন্ডোতে একটি টেবিলের নাম ব্যবহার করেও অনুসন্ধান করতে পারেন)। শুধু আপনার লক্ষ্য নির্বাচন করুন এবং ঠিক আছে টিপুন।

ডেটাগ্রিপ আপনার জন্য সমস্ত কিছু পরিচালনা করবে।


2
দয়া করে নোট করুন, ডেটাগ্রিপ একটি নিখরচায় !
রহমত আলী

0

আপনি যদি উইন্ডোজ থেকে পিজএডমিন (ব্যাকআপ:, pg_dumpরিস্টোর :) চালনা করেন তবে pg_restoreএটি ফাইলটিকে ডিফল্টরূপে আউটপুট দেওয়ার চেষ্টা করবে c:\Windows\System32এবং এজন্যই আপনি অনুমতি / অ্যাক্সেস অস্বীকৃত ত্রুটি পাবেন এবং ব্যবহারকারীর পোস্টগ্রাগেস যথেষ্ট পরিমাণে উন্নত হয়নি বলে নয়। প্রশাসক হিসাবে পিজিএডমিন চালান বা উইন্ডোজের সিস্টেম ফোল্ডারগুলি ছাড়া অন্য আউটপুটটির জন্য কোনও অবস্থান চয়ন করুন a


0

বিকল্প হিসাবে, আপনি বিদেশী ডেটা র‌্যাপার এক্সটেনশন ব্যবহার করে আপনার দূরবর্তী টেবিলগুলি স্থানীয় টেবিল হিসাবেও প্রকাশ করতে পারেন। তারপরে আপনি দূরবর্তী ডাটাবেসে টেবিলগুলি থেকে নির্বাচন করে আপনার টেবিলগুলিতে সন্নিবেশ করতে পারেন। একমাত্র খারাপ দিকটি এটি খুব দ্রুত নয়।

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