programing

Postgres에서 한 데이터베이스에서 다른 데이터베이스로 표 복사

yellowcard 2023. 5. 15. 21:27
반응형

Postgres에서 한 데이터베이스에서 다른 데이터베이스로 표 복사

Postgres의 한 데이터베이스에서 다른 데이터베이스로 전체 테이블을 복사하려고 합니다.좋은 의견이라도 있나?

테이블을 추출하여 대상 데이터베이스로 직접 파이프 연결합니다.

pg_dump -t table_to_copy source_db | psql target_db

참고: 다른 데이터베이스에 이미 테이블이 설정되어 있는 경우,-a데이터만 가져오려면 플래그를 지정합니다. 그렇지 않으면 "메모리 부족"과 같은 이상한 오류가 나타날 수 있습니다.

pg_dump -a -t table_to_copy source_db | psql target_db

pgAdmin II에서 백업 기능을 사용할 수도 있습니다.다음 단계를 수행합니다.

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

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

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

truncate table tableA;

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

두 서버에 모두 연결할 수 있는 리눅스 호스트에서 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" )

처음 설치된 깜박임

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

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

원격 서버가 모두 있는 경우 다음을 수행할 수 있습니다.

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

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

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

다음 작업을 수행할 수 있습니다.

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>

로컬 설정에서 데이터베이스 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

사용자 5542464Piyush S의 답변과 동일합니다. WAN은 두 단계로 분할됩니다.

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

그렇지 않으면 파이프는 두 개의 비밀번호를 동시에 묻습니다.

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

먼저, 데이터 그립의 두 데이터 소스에 모두 연결되어 있는지 확인합니다.

Source Table을 선택하고 F5 또는 를 누릅니다(우클릭 -> Copy Table to 선택).

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

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

여기서 몇 가지 해결책을 시도해 봤는데 정말 도움이 되었습니다.제 경험상 가장 좋은 해결책은 psql 명령줄을 사용하는 것이지만, 가끔은 psql 명령줄을 사용하고 싶지 않을 때가 있습니다.다음은 pgAdmin을 위한 다른 솔루션입니다.III

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"

이 파이썬 스크립트 확인

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>

DBeaver 도구 사용자의 경우 다른 데이터베이스의 테이블로 "데이터 내보내기"를 수행할 수 있습니다.

여기에 이미지 설명 입력

제가 계속해서 직면한 유일한 오류는 잘못된 우편물 드라이버 때문이었습니다.

SQL Error [34000]: ERROR: portal "c_2" does not exist
    ERROR: Invalid protocol sequence 'P' while in PortalSuspended state.

다음은 데이터를 내보내는 방법에 대한 공식 Wiki입니다. https://github.com/dbeaver/dbeaver/wiki/Data-transfer

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

저는 이미 이 주제에 대한 자세한 게시물을 작성했습니다.이 링크를 방문하십시오.

가지 간단한 단계로 수행할 수 있습니다.

# dump the database in custom-format archive
pg_dump -Fc mydb > db.dump

# restore the database
pg_restore -d newdb db.dump

원격 데이터베이스의 경우:

# dump the database in custom-format archive
pg_dump -U mydb_user -h mydb_host -t table_name -Fc mydb > db.dump

# restore the database
pg_restore -U newdb_user -h newdb_host -d newdb db.dump

한 서버 데이터베이스에서 다른 서버 데이터베이스로 데이터를 복사하려는 경우 두 데이터베이스 모두에 dblink 연결을 작성한 것입니다. 그렇지 않으면 테이블 데이터를 csv로 내보내고 다른 데이터베이스 테이블로 가져올 수 있습니다. 테이블 필드는 기본 테이블과 동일해야 합니다.

Windows에서는 파이프 없이 다음을 사용할 수 있습니다.

덤프 - 한 줄에 있도록 편집합니다.

"C:\Program Files\PostgreSQL\14\bin\pg_dump.exe"
--host="host-postgres01"
--port="1234"
--username="user01"
-t "schema01.table01"
--format=c
-f "C:\Users\user\Downloads\table01_format_c.sql"
"DB-01"

복원 - 한 줄로 표시되도록 편집합니다.

"C:\Program Files\PostgreSQL\14\bin\pg_restore.exe"
--host="host-postgres02"
--port="5678"
--username="user02"
-1
--dbname="DB-02"
"C:\Users\user\Downloads\table01_format_c.sql"

사용자 암호를 입력하라는 메시지가 표시됩니다.

이 솔루션은 새 테이블을 동일한 이름의 스키마에 배치합니다(schema01).

pgAdmin을 실행하는 경우(백업:pg_dump복원:pg_restoreWindows에서 기본적으로 파일 출력을 시도합니다.c:\Windows\System32사용자 게시물이 충분히 높아지지 않았기 때문이 아니라 권한/액세스 거부 오류가 발생하는 이유입니다.관리자로 pgAdmin을 실행하거나 Windows의 시스템 폴더가 아닌 다른 출력 위치를 선택합니다.

언급URL : https://stackoverflow.com/questions/3195125/copy-a-table-from-one-database-to-another-in-postgres

반응형