Program Tip

다른 스키마로 데이터베이스를 복원하고 싶습니다.

programtip 2021. 1. 10. 19:28
반응형

다른 스키마로 데이터베이스를 복원하고 싶습니다.


temp1다음 명령을 사용하여 라는 데이터베이스 덤프를 가져 왔습니다.

$  pg_dump -i -h localhost  -U postgres -F c -b -v -f pub.backup temp1 

이제 "db_temp"라는 다른 데이터베이스에서 덤프를 복원하고 싶지만 모든 테이블이 "temp_schema"(fms temp1 데이터베이스에있는 기본 스키마가 아님)에 생성되어야합니다. "db_temp"데이터베이스.

pg_restore명령을 사용하여 이것을 수행하는 방법이 있습니까?

다른 방법도 감사합니다!


pg_restore 자체에는 방법이 없습니다. 할 수있는 것은 pg_restore를 사용하여 SQL 출력을 생성 한 다음이를 변경하기 위해 예를 들어 sed 스크립트를 통해 전송하는 것입니다. 하지만 sed 스크립트를 작성하는 방법에주의해야하므로 데이터 내부의 내용이 일치하지 않고 변경되지 않습니다.


간단한 해결책이 있습니다.

  • 일반 SQL 형식으로 백업 덤프를 생성합니다 ( --format=p또는 매개 변수를 사용하여 "p"형식 -F p).
  • 자주 사용하는 편집기로 pub.backup.sql 덤프를 편집하고 파일 맨 위에 다음 두 줄을 추가합니다.

create schema myschema;

SET search_path TO myschema;

이제 다음 명령을 사용하여 백업 덤프를 복원 할 수 있습니다.

psql -f pub.backup.sql

set search_path to <schema>명령은 myschema를 기본값으로 설정하므로 이전에 살았던 "기본"스키마와 관계없이이 스키마에 새 테이블 및 기타 개체가 생성됩니다.


빠르고 더러운 방법 :

1) 기본 스키마 이름 바꾸기 :

alter schema public rename to public_save;

2) 새 스키마를 기본 스키마로 만듭니다.

create schema public;

3) 데이터 복원

pg_restore -f pub.backup db_temp [and whatever other options]

4) 필요에 따라 스키마 이름을 바꿉니다.

alter schema public rename to temp_schema;
alter schema public_save rename to public;

아마도 가장 쉬운 방법은 복원 후 스키마 이름을 변경하는 것입니다. 즉, 다음 SQL을 사용합니다.

ALTER SCHEMA my_schema RENAME TO temp_schema

pg_dump의 출력에 압축 된 아카이브 형식을 사용하고 있기 때문에 복원하기 전에 변경할 수 없다고 생각합니다. 옵션은 기본 출력을 사용하고 스키마 이름을 검색하고 바꾸는 것이지만, 위험 할 수 있으며주의하지 않으면 데이터가 손상 될 수 있습니다.


당신은 단지 당신이 한 번에 하나 개의 테이블을 복원 할 수있는 몇 테이블이있는 경우, pg_restore받아들이는 -d database당신이 지정하는 경우 -t tablename. 물론 테이블을 복원하기 전에 스키마를 설정 한 다음 테이블 복원이 완료되면 인덱스와 제약 조건을 정렬해야합니다.

또는 다른 포트에 다른 서버를 설정하고, 새 PostgreSQL 서버를 사용하여 복원하고, 스키마 이름을 바꾸고, 덤프하고, 원래 데이터베이스로 복원합니다. 이것은 물론 약간의 슬러지이지만 작업을 완료합니다.

모험을 좋아한다면 16 진 편집기를 사용하여 덤프 파일의 데이터베이스 이름을 변경할 수 있습니다. 나는 그것이 덤프의 한곳에서만 언급되고 새 데이터베이스 이름과 이전 데이터베이스 이름이 같으면 작동해야한다고 생각합니다. YMMV, 프로덕션 환경에서 이와 같은 작업을 수행하지 마십시오. 이것이 폭발하여 고향을 평평하게하더라도 저를 비난하지 마십시오. 그리고 나머지 모든 일반적인 면책 조항이 있습니다.


임시 데이터베이스에서 스키마 이름을 바꿉니다.

스키마를 내 보냅니다.

pg_dump --schema-only --schema=prod > prod.sql

새 데이터베이스를 만듭니다. 내보내기를 복원하십시오.

psql -f prod.sql

ALTER SCHEMA prod RENAME TO somethingelse;

pg_dump --schema-only --schema=somethingelse > somethingelse.sql

(데이터베이스 삭제)

데이터의 search_path경우 상단에 있는 세트 수정할 수 있습니다 .


As noted, there's no direct support in pg_dump, psql or pg_restore to change the schema name during a dump/restore process. But it's fairly straightforward to export using "plain" format then modify the .sql file. This Bash script does the basics:

rename_schema () {

  # Change search path so by default everything will go into the specified schema
  perl -pi -e "s/SET search_path = $2, pg_catalog/SET search_path = $3, pg_catalog, $2;/" "$1"

  # Change 'ALTER FUNCTION foo.' to 'ALTER FUNCTION bar.'
  perl -pi -e 's/^([A-Z]+ [A-Z]+) '$2'\./$1 '$3'./' "$1"

  # Change the final GRANT ALL ON SCHEMA foo TO PUBLIC
  perl -pi -e 's/SCHEMA '$2'/SCHEMA '$3'/' "$1"

}

Usage:

pg_dump --format plain --schema=foo --file dump.sql MYDB
rename_schema dump.sql foo bar
psql -d MYDB -c 'CREATE SCHEMA bar;'
psql -d MYDB -f dumpsql

ReferenceURL : https://stackoverflow.com/questions/4191653/i-want-to-restore-the-database-with-a-different-schema

반응형