Postgres의 한 데이터베이스에서 다른 데이터베이스로 테이블 복사


273

Postgres의 한 데이터베이스에서 다른 데이터베이스로 전체 테이블을 복사하려고합니다. 어떤 제안?


1
DBeaver를 설치해도 괜찮다면 연결된 두 데이터베이스간에 전송하는 방법이 정말 간단합니다. 소스 테이블을 마우스 오른쪽 단추로 클릭하고 데이터 내보내기를 선택하고 데이터베이스 테이블을 대상으로 지정하고 대상을 대상 데이터베이스로 설정하십시오.
rovyko

답변:


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
원격 DB 링크에서 어떻게 작동합니까? 예를 들어, 다른 위치에서 덤프해야합니다.
curlyreggie

17
@ curlyreggie는 이것을 시도하지 않았지만 왜 작동하지 않을 이유가 없습니다. 과 같이, 명령에 사용자 및 서버 세부 사항을 추가하십시오pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
thomax

2
"pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db -U remote_user -h remote_server"
Hua Zhang

18
다른 데이터베이스에 이미 테이블이 설정된 -a경우 data 전용 플래그를 사용해야합니다 . 즉 pg_dump -a -t my_table my_db | psql target_db. 내가 여기있는 동안 데이터베이스가 서버에 있으면 데이터베이스를 파일로 덤프 한 다음 해당 파일을 데이터베이스로 scp 한 다음 파일의 내용을 psql로 보내는 것이 더 쉽다는 것을 알았습니다. 예를 들어 pg_dump -a -t my_table my_db > my_file.sql서버에 넣은 후->psql my_other_db < my_file.sql
Nick Brady

3
@EamonnKenny는 대소 문자 구분 테이블을 덤프하려면 다음을 수행하십시오 pg_dump -t '"tableToCopy"' source_db | psql target_db. 작은 AND 큰 따옴표는 테이블 이름을 둘러싼 다.
gilad mayani

105

pgAdmin II에서 백업 기능을 사용할 수도 있습니다. 다음 단계를 따르십시오.

  • pgAdmin에서 이동할 테이블을 마우스 오른쪽 버튼으로 클릭하고 "백업"을 선택하십시오.
  • 출력 파일의 디렉토리를 선택하고 형식을 "일반"으로 설정하십시오.
  • "덤프 옵션 # 1"탭을 클릭하고 "데이터 만"또는 "스키마 만"을 선택하십시오 (작업에 따라 다름)
  • 쿼리 섹션에서 "열 삽입 사용"및 "사용자 삽입 명령"을 클릭하십시오.
  • "백업"버튼을 클릭하십시오. .backup 파일로 출력
  • 메모장을 사용하여이 새 파일을 엽니 다. 테이블 / 데이터에 필요한 삽입 스크립트가 표시됩니다. 이를 pgAdmin의 새 데이터베이스 sql 페이지에 복사하여 붙여 넣습니다. pgScript로 실행-쿼리-> pgScript F6으로 실행

잘 작동하며 한 번에 여러 테이블을 수행 할 수 있습니다.


1
데이터베이스간에 데이터를 이동하는 데 유용한 GUI 기반 솔루션입니다. 감사!
kgx

3
Objects섹션 에서 여러 테이블을 선택할 수 있습니다 . OSX에서 SQL 버튼을 클릭하거나 메뉴를 SQL Editor통해 Tools백업 파일에서 복사 한 SQL에 붙여 넣습니다.
Aleck Landgraf

고마워요 큰 테이블에서는 매우 느립니다. 속도를 높이는 더 좋은 방법이 있습니까? (외래 키나 무언가를 무시하는 것과 같이?)
TimoSolo

3
@Timothy는 여기 포스트그레스 문서 페이지 백업 및 복원 속도를하는 방법에
로리

모든 데이터베이스를 내보낼 때 오래된 대답하지만 여전히 관련이 좋은 작품, 단지 안 트리거를 설정하는 것을 잊지 마세요
norbertas.gaulia

75

dblink를 사용하는 것이 더 편리합니다!

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
왜 두 개의 dbname이 두 번 ..? 어느 것이 소스와 대상입니까?
arulraj.net

1
삽입하려는 tableA는 대상이며 dbLink의 tableA는 소스입니다.
aggietech

dblink bun을 사용하려면 소스 소스 테이블의 구조를 모릅니다.
Ossarotte

31

두 서버 모두에 연결된 Linux 호스트에서 psql 사용

( 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
@LimitedAtonement 실제로 당신은 맞습니다, 내보내기와 서브 쉘은 필요하지 않습니다. 더 복잡한 스크립트의 일부일 뿐이며 내보내기 및 서브 쉘 없이도 시도하지 않았으므로 정직하고 작동하는 솔루션 만 제공합니다
Alexey Sviridov

테이블은 대상 DB에 존재해야합니다. 그것을 만들기 위해 시도pg_dump -t '<table_name>' --schema-only
fjsj

24

첫 번째 dblink 설치

그런 다음 다음과 같은 작업을 수행합니다.

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
이 답변은 복사 된 행을 필터링 할 수 있기 때문에 좋습니다 (dblink 두 번째 인수에 WHERE 절 추가). 그러나 열 이름 (Postgres 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));(l은 로컬을 의미하고 r은 원격입니다. 작은 따옴표를 이스케이프합니다. 열 유형을 제공하십시오.)
hamx0r

14

pg_dump를 사용하여 테이블 데이터를 덤프 한 다음 psql로 복원하십시오.


2
그런 다음 다른 데이터베이스 역할을 사용하여 충분한 권한이있는 역할을 연결하십시오. postgresql.org/docs/8.4/static/app-pgdump.html
Frank Heikens

내가 뭘 잘못하고 있죠? pg_dump -t "tablename"dbName --role "postgres"> db.sql "postgres"는 역할을 설정하려는 사용자입니다. 여전히 "액세스가 거부되었습니다"라는 메시지가 표시됩니다.
nix

db.sql 파일을 작성할 권한이 있습니까?
pcent

어떤 권한이 있는지 어떻게 확인합니까?
nix

이 스레드는 오래되었지만 문제가있는 다른 사람은 PgAdminIII의 '도구-> 백업'메뉴를 사용하십시오.이 문제는 권한 문제를 해결하는 것으로 보입니다.
John

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
그것에 대해 말씀 해주시겠습니까?
Muhammad Omer Aslam

thats legit 😂 당신은 저를 소유합니다
Muhammad Omer Aslam

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 localhost"가 필요합니다
DTukans

6

로컬 설정에서 데이터베이스 A에서 데이터베이스 B로 테이블을 이동하려면 다음 명령을 사용하십시오.

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>
@max

4

나는 여기에 몇 가지 해결책을 시도했으며 실제로 도움이되었습니다. 내 경험상 가장 좋은 해결책은 psql 명령 줄 을 사용하는 것이지만 때로는 psql 명령 줄 을 사용하고 싶지 않습니다. 여기 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 항상 작동하지는 않습니다.

두 DB에 동일한 테이블 ddl이 있다고 가정하면 다음과 같이 stdout 및 stdin에서 해킹 할 수 있습니다.

 # 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

user5542464Piyush S. Wanare의 답변 과 동일 하지만 두 단계로 나뉩니다.

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

그렇지 않으면 파이프는 두 암호를 동시에 묻습니다.


대상 데이터베이스의 테이블 이름을 언급 할 가능성이 있습니까?
Piyush S. Wanare

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

두 DB (부터 &까지)가 비밀번호로 보호 된 경우,이 시나리오 터미널에서 두 DB에 대한 비밀번호를 요청하지 않으면 비밀번호 프롬프트가 한 번만 나타납니다. 따라서이 문제를 해결하려면 명령과 함께 암호를 전달하십시오.

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

1

DataGrip (Intellij Idea) 을 사용하고 있었습니다 . 한 테이블에서 다른 데이터베이스로 다른 테이블로 데이터를 복사하는 것은 매우 쉬웠습니다.

먼저, Data Grip에서 두 DataSource와 연결되어 있는지 확인하십시오.

소스 테이블을 선택하고 F5를 누르거나 마우스 오른쪽 단추로-> 테이블 복사 대상을 선택하십시오.

모든 테이블 목록이 표시됩니다 (팝업 창에서 테이블 이름을 사용하여 검색 할 수도 있음). 대상을 선택하고 확인을 누르십시오.

DataGrip은 다른 모든 것을 처리합니다.


2
DataGrip은 무료아닙니다 !
Rahmat Ali

0

Windows에서 pgAdmin (Backup : pg_dump, Restore :)을 실행하면 pg_restore기본적으로 파일을 출력하려고 시도 c:\Windows\System32하므로 사용자 postgres가 충분히 높아지지 않았기 때문에 권한 / 액세스 거부 오류가 발생합니다. pgAdmin 을 관리자 권한 으로 실행 하거나 Windows의 시스템 폴더 이외의 출력 위치를 선택하십시오.


0

대안으로, 외부 데이터 랩퍼 확장을 사용하여 리모트 테이블을 로컬 테이블로 표시 할 수도 있습니다. 그런 다음 원격 데이터베이스의 테이블에서 선택하여 테이블에 삽입 할 수 있습니다. 유일한 단점은 매우 빠르지 않다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.