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




copy database-table (13)

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


Answers

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 사용하기

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

나는 여기서 몇 가지 해결책을 시도했으며, 실제로 도움이되었다. 내 경험에 의하면 최상의 솔루션은 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 -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

기존 스키마가있는 경우 소스 데이터베이스의 언급 된 테이블을 대상 데이터베이스의 동일한 명명 된 테이블로 복사합니다.


pgdump가 항상 작동하지 않습니다 ...

두 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"

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


여기 나를 위해 일한 것이 있습니다. 먼저 파일로 덤프하십시오.

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

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

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

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


먼저 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 
 );

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


하나의 테이블 데이터를 다른 데이터베이스의 다른 테이블로 복사하려면 DbLink를 사용해야합니다. 데이터베이스 간 쿼리를 실행하려면 DbLink 확장을 설치하고 구성해야합니다.

이 주제에 대한 자세한 게시물을 이미 만들었습니다. 이 링크를 방문하십시오.


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

그렇지 않으면 파이프는 같은 시간에 두 개의 암호를 묻습니다.


이 방법으로 갈 수 있습니다 : (일반적인 예)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

또한 insert 절을 넣기 위해 열 이름을 생성해야하는 경우 다음을 사용하십시오.

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

결과를 복사하여 쿼리 창에 붙여 넣어 테이블 열 이름을 나타내십시오. 그러면 ID 열도 제외됩니다.

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

데이터베이스가 같은 위치에 속하면 행을 복사하는 스크립트가 작동합니다.

이것을 시도 할 수 있습니다.

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

두 DB가 동일한 서버에 있으면 서버 이름은 선택 사항입니다.





postgresql copy database-table