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
비트 없이 데이터베이스를 내보낼 수 있습니다 (예 : -c
및 C
옵션을 지정하지 않음 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