다른 이름으로 PostgreSQL 데이터베이스를 내보내고 가져 옵니까? 1259 16435 TABLE checks blah pg_restore: [archiver (db)]

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



답변

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

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

다음과 같이 가져옵니다.

psql blah_devel < blah.psql > /dev/null

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

WARNING:  database "blah" does not exist

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


답변

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

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

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


답변

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

소스 :

pg_dump -v -Fc mydb.dmp mydb

대상 :

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp


답변