답변:
테이블을 추출하여 대상 데이터베이스에 직접 파이프하십시오.
pg_dump -t table_to_copy source_db | psql target_db
참고 : 다른 데이터베이스에 이미 테이블이 설정되어 있으면 -a
플래그를 사용하여 데이터 만 가져와야합니다. 그렇지 않으면 "메모리 부족"과 같은 이상한 오류가 표시 될 수 있습니다.
pg_dump -a -t my_table my_db | psql target_db
pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
-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
pg_dump -t '"tableToCopy"' source_db | psql target_db
. 작은 AND 큰 따옴표는 테이블 이름을 둘러싼 다.
pgAdmin II에서 백업 기능을 사용할 수도 있습니다. 다음 단계를 따르십시오.
잘 작동하며 한 번에 여러 테이블을 수행 할 수 있습니다.
Objects
섹션 에서 여러 테이블을 선택할 수 있습니다 . OSX에서 SQL 버튼을 클릭하거나 메뉴를 SQL Editor
통해 Tools
백업 파일에서 복사 한 SQL에 붙여 넣습니다.
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);
두 서버 모두에 연결된 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 ...
필요가 없으므로 명시 적 서브 쉘이 필요하지 않습니다! 일반적으로 몇 가지 설정을 먼저 수행해야하므로 어쨌든 서브 쉘이 필요할 수 있습니다. 또한 비밀번호는 후속 프로세스로 내보내지지 않습니다. 감사!
pg_dump -t '<table_name>' --schema-only
첫 번째 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
);
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은 원격입니다. 작은 따옴표를 이스케이프합니다. 열 유형을 제공하십시오.)
pg_dump를 사용하여 테이블 데이터를 덤프 한 다음 psql로 복원하십시오.
다음을 수행 할 수 있습니다.
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>
나는 여기에 몇 가지 해결책을 시도했으며 실제로 도움이되었습니다. 내 경험상 가장 좋은 해결책은 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
)
)
이 방법의 문제점은 복사하려는 필드의 이름과 테이블 유형을 작성해야한다는 것입니다.
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"
user5542464 및 Piyush S. Wanare의 답변 과 동일 하지만 두 단계로 나뉩니다.
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
그렇지 않으면 파이프는 두 암호를 동시에 묻습니다.
하나의 테이블 데이터를 다른 데이터베이스의 다른 테이블로 복사하려면 DbLink를 사용해야합니다. 데이터베이스 간 쿼리를 실행하려면 DbLink 확장을 설치하고 구성해야합니다.
이 주제에 대해 이미 자세한 게시물을 작성했습니다. 이 링크를 방문하십시오
이 파이썬 스크립트를 확인하십시오
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);
두 DB (부터 &까지)가 비밀번호로 보호 된 경우,이 시나리오 터미널에서 두 DB에 대한 비밀번호를 요청하지 않으면 비밀번호 프롬프트가 한 번만 나타납니다. 따라서이 문제를 해결하려면 명령과 함께 암호를 전달하십시오.
PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>
DataGrip (Intellij Idea) 을 사용하고 있었습니다 . 한 테이블에서 다른 데이터베이스로 다른 테이블로 데이터를 복사하는 것은 매우 쉬웠습니다.
먼저, Data Grip에서 두 DataSource와 연결되어 있는지 확인하십시오.
소스 테이블을 선택하고 F5를 누르거나 마우스 오른쪽 단추로-> 테이블 복사 대상을 선택하십시오.
모든 테이블 목록이 표시됩니다 (팝업 창에서 테이블 이름을 사용하여 검색 할 수도 있음). 대상을 선택하고 확인을 누르십시오.
DataGrip은 다른 모든 것을 처리합니다.
대안으로, 외부 데이터 랩퍼 확장을 사용하여 리모트 테이블을 로컬 테이블로 표시 할 수도 있습니다. 그런 다음 원격 데이터베이스의 테이블에서 선택하여 테이블에 삽입 할 수 있습니다. 유일한 단점은 매우 빠르지 않다는 것입니다.