PostgreSQL : 동일한 데이터베이스에서 데이터베이스 스키마의 전체 사본을 만드는 방법은 무엇입니까?


26

public전체 테이블 구조, 데이터, 함수, fk, pk 등을 사용하여 스키마를 동일한 데이터베이스에 복사하는 방법
Postgres 버전은 8.4
PS입니다. 스키마 NOT 데이터베이스 를 복사해야 합니다.


더 많은 스키마가 public있습니까?
a_horse_with_no_name

공개 및 데모 스키마가 있습니다. 데모 계정을 만들려면 데모를 복사해야합니다.

이것은 할 수있는 편리한 일입니다.
Kuberchaun

답변:


19

pg_dump / pg_restore 자체에서이를 수행하는 간단한 방법은 없습니다. 데이터베이스를 일시적으로 제거 할 수있는 경우 다음을 시도 할 수 있습니다.

  1. pg_dump를 사용하여 공개 스키마 덤프를 가져옵니다.
  2. "ALTER SCHEMA public RENAME TO public_copy"실행
  3. pg_restore를 사용하여 1 단계에서 공개 스키마 덤프를 복원하십시오.

PHP를 통해 pg_dump 및 pg_restore에 어떻게 액세스 할 수 있습니까?

데이터베이스를 실행하는 위치에 따라 다릅니다. 서버의 쉘에서 pg_dump 및 pg_restore에 액세스 할 수 있습니다. 당신이 쉘 액세스 할 수없는 경우에 당신은 PHPs 사용하여 시도 할 수 shell_exec을 그렇지 않으면, 다른 백업 방법으로 볼 필요가 있습니다 아마 사용하여, PostgreSQL의 GUI 도구

1
+1 지금까지 가장 똑똑한 솔루션입니다. 쉘 명령은 다음과 같이 보일 것입니다 ( 매뉴얼에 더 있음 ) pg_dump -n my_schema -f '/path/to/file.pgsql' my_db. 의 비밀번호없이 인증을받은 수퍼 유저 ( postgres) 로서 가장 쉽습니다 . 원래 스키마의 이름을 바꾼 후 복원하십시오 . 당신은 일반 SQL 덤프가있는 경우, 당신은 할 수 없습니다 필요합니다 . peerpg_haba.confpsql my_db -f '/path/to/file.pgsql'pg_restore
Erwin Brandstetter

쉬운 방법이 있습니다, 내 대답을 참조하십시오. pg_dump는 스키마 선택을위한 -n 스위치를 지원합니다. 그런 다음 덤프에서 스키마 이름을 편집하고 다시로드하십시오.
Scott Marlowe

2
스키마 이름을 바꾸면 gist.github.com/pschultz/5387172 함수 내에서 참조가 업데이트되지 않습니다 . 이름을 바꾸면 덤프를 검색 할 수 있고 덤프를 바꾸면 훨씬 더 안정적입니다.
Peter

9
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

PHP에 갇힌 경우 백틱을 사용하십시오.

`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`

또는 exec () 명령. 변경 사항은 sed와 같은 방식으로 사용할 수 있습니다.

여기에 6 자 더 있습니다


1
스키마 이름을 내용으로 표시 할 수있는 경우 (예 :) 스키마의 이름을 바꾸고 백업 된 원본 스키마를 다시로드하는 것이 더 안전합니다 public.
artm

7

pgAdmin을 사용하면 다음을 수행 할 수 있습니다. 꽤 수동적이지만 필요한 모든 것일 수 있습니다. 스크립트 기반 접근 방식이 훨씬 더 바람직합니다. 관리자 액세스 권한이없고 데이터베이스가 크면 로컬 컴퓨터에있는 개발 데이터베이스에서는 제대로 작동해야합니다.

  1. 복사하려는 스키마 이름을 마우스 오른쪽 단추로 클릭하고 백업을 클릭하십시오. (이보다 더 깊이 들어가서 둘 다 대신 구조를 백업하도록 선택할 수 있습니다).

  2. 백업 파일 이름을 지정하고 형식을 선택하십시오. (보통 Tar를 사용합니다.)

  3. 백업을 클릭하십시오.

  4. 백업 한 스키마를 마우스 오른쪽 단추로 클릭하고 특성을 클릭하고 임시로 다른 이름으로 바꾸십시오. (예 : temprename )

  5. 스키마 루트를 클릭하고 오브젝트 브라우저에서 마우스 오른쪽 단추로 클릭하고 새 스키마 작성을 클릭 하고 스키마 이름을 public으로 지정하십시오 . 백업에서 복사하는 스키마가됩니다.

  6. 5 단계에서 새 스키마 공용 을 마우스 오른쪽 단추로 클릭하고 복원을 클릭하십시오. 3 단계의 백업 파일에서 복원하십시오.

  7. 새 스키마 이름 바꾸기 대중을 다른 이름 (예를 들어, 사용하여 newSchema ).

  8. 스키마 temprename 변경 이름을 4 단계에서 원래 이름으로 변경하십시오.


5 단계에서 생성 한 새 스키마는 백업 한 스키마와 이름이 같아야합니다. 그렇지 않으면 pgAdmin이 아무 것도 복원하지 않습니다.
Cao Minh Tu

5

당신은 사용할 수 있습니다

CREATE DATABASE new_db TEMPLATE = old_db;

그런 다음 필요하지 않은 모든 스키마를 삭제하십시오.

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

유일한 단점은 복사본을 만들려면 old_db에 대한 모든 연결을 결정해야한다는 것입니다. 따라서 CREATE DATABASE명령문 을 실행하는 프로세스는 예를 들어 template1에 연결해야합니다.

이것이 옵션이 아닌 경우 pg_dump / pg_restore가 유일한 방법입니다.


1
이 질문을하기 전에 비슷한 데이터베이스 복제 방법을 사용했습니다. 그러나 시간이 많이

@sigra는 : 복제의 a_horse의 방법 입니다 실제 파일 그냥 많은 오버 헤드를 절약 할 수 복사 할 수 있기 때문에, 데이터베이스에 대한 가장 빠른. 스키마가 전체 db의 작은 부분이 아니라면 스키마의 덤프 및 다시로드가 더 빠를 것이라고 의심합니다. 따라서 실제 질문에 대답하지 않더라도이 답변에 +1이 적용됩니다.
Erwin Brandstetter

단일 스키마를 복제하려면 많은 작업이 필요합니다. 스키마 덤프, 덤프에서 이름 바꾸기 및 재로드 속도가 훨씬 빠릅니다.
Scott Marlowe

@ScottMarlowe : 가장 큰 스키마가 무엇인지에 따라 다릅니다. 가장 큰 것이 떨어진 것 중 하나라면 그렇습니다.
a_horse_with_no_name

2

user1113185 answer 확장 하면 psql / pg_dump를 사용하는 전체 워크 플로우가 있습니다.

다음은의 모든 객체를 내보내고 데이터베이스 에서 와 같이 old_schemanew_schema스키마 로 가져옵니다 .userdbname

psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.