다른 이름으로 PostgreSQL 데이터베이스를 내보내고 가져 옵니까?


39

PostgreSQL 데이터베이스를 내보내고 나중에 다른 이름으로 가져 오는 방법이 있습니까?

Rails와 함께 PostgreSQL을 사용하고 있으며 데이터베이스를 blah_production이라고하는 프로덕션에서 데이터를 내보내고 개발 또는 스테이징시 blah_development 및 blah_staging이라는 이름으로 가져옵니다. MySQL에서는 내보내기에 데이터베이스가 어디에도 없기 때문에 (사소한 경우는 제외) 사소한 것이지만 PostgreSQL에서는 불가능한 것 같습니다. 불가능합니까?

현재 데이터베이스를 이런 식으로 덤프하고 있습니다.

pg_dump blah > blah.dump

-c 또는 -C 옵션을 사용하지 않습니다. 해당 덤프에는 다음과 같은 명령문이 포함됩니다.

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

로 가져 오려고하면

psql blah_devel < blah.dump

나는 얻다

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

아마도 문제는 실제로 데이터베이스가 아니라 역할일까요?

이 방법으로 덤프하면 :

pg_dump --format=c blah > blah.dump

다음과 같이 가져 오십시오.

pg_restore -d blah_devel < tmp/blah.psql

이 오류가 발생합니다.

pg_restore: WARNING:  database "blah" does not exist
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1513; 1259 16435 TABLE checks blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.checks OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1509; 1259 16409 TABLE users blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1508; 1259 16407 SEQUENCE users_id_seq blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users_id_seq OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1824; 0 0 ACL public postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: REVOKE ALL ON SCHEMA public FROM postgres;
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: GRANT ALL ON SCHEMA public TO postgres;
WARNING: errors ignored on restore: 11

어떤 아이디어?

sed 스크립트를 사용하여 덤프를 수정하는 사람들이 있습니다. 그 해결책을 피하고 싶지만 대안이 없다면 취할 것입니다. 덤프의 데이터베이스 이름을 변경하는 스크립트를 작성하여 데이터를 변경하지 않은 사람이 있습니까?

답변:


42

솔루션은 다음과 같이 덤프했습니다.

pg_dump --no-owner --no-acl blah > blah.psql

다음과 같이 가져옵니다.

psql blah_devel < blah.psql > /dev/null

여전히이 경고가 나타납니다.

WARNING:  database "blah" does not exist

그러나 나머지는 효과가있는 것 같습니다.


2
당신은 생명의 은인 :)
Sri Harsha Kappala

생명의 은인 형제 :)
당신은 누구를 알고

11

텍스트 덤프를 작성하는 경우 CREATE DATABASE비트 없이 데이터베이스를 내보낼 수 있습니다 (예 : -cC옵션을 지정하지 않음 pg_dump). 이것은 Postgres가 데이터베이스를 삭제, 생성 및 연결하려고 시도하지 못하게합니다.

보관 형식 중 하나를 사용하는 경우 복원 할 데이터베이스의 이름 -d을 지정하는 옵션을 지정할 수 있습니다 pg_restore.

에 대한 매뉴얼 페이지를 확인 pg_dump하고 pg_restore자세한 내용 및 마운트하는 것을 잊지 마세요 스크래치 원숭이 당신은 내가 몇 가지 중요한 내용을 왼쪽 경우 생산 시스템에서이 작업을 시도하기 전에.


감사합니다. 나는 -da에게 pg_restore를 시도해 볼 것이지만, 지금은 텍스트로 덤프하고 pg_dump에서는 -c와 -C를 지정하지 않습니다. 방금 pg_dump databasename을 호출하고 있습니다. 뭔가 빠졌습니까?
pupeno

어떤 옵션에 pg_dump당신이 (그것이 내가 텍스트 덤프를했다 및 다른 DB로 복원 이후 동안을이었다,하지만 존재하지 않는 경우에 연결하든 데이터베이스로 복원하는 것이 덤프 생성 안 CREATE& \connect비트를 텍스트 덤프의 SQL이 실행됩니다를 \i덤프 파일을 이동할 때 어디에 있든
voretaq7

텍스트 또는 이진 모드의 pg_dump에는 기본적으로 데이터베이스 이름에 대한 수많은 언급이 있습니다.
pupeno

6

이제 pg_restore에는 -d 옵션이 있으며 데이터를 가져올 데이터베이스 이름을 설정할 수 있습니다.

소스 :

pg_dump -v -Fc mydb.dmp mydb

대상 :

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp


3
이 구문은 나를 위해 일했습니다 : pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5).
Paolo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.