답변:
pg_restore가 작동하는 방식이기 때문입니다.
pg_restore 매뉴얼 은 다음과 같이 읽습니다.
-C, --create 데이터베이스를 복원하기 전에 작성하십시오. --clean도 지정되면 연결하기 전에 대상 데이터베이스를 삭제하고 다시 작성하십시오.
이 옵션을 사용하면 -d로 이름 지정된 데이터베이스는 초기 DROP DATABASE 및 CREATE DATABASE 명령을 발행하는 데만 사용됩니다 . 모든 데이터는 아카이브에 나타나는 데이터베이스 이름으로 복원됩니다 .
-C가 사용되지 않는 경우에만 -d는 주어진 데이터베이스에서 복원됩니다. -C를 사용하는 경우 데이터베이스는 대상이 아닌 "런치 패드"로 사용됩니다.
docker-compose -p dump_import -f docker/dump_import.yml run --rm be bash -c 'waitforit -host=postgres -port=5432 -timeout=30 && export PGPASSWORD=$DATABASE_PASSWORD && createdb --echo --port=$DATABASE_PORT -host=$DATABASE_HOST --username=$DATABASE_USER $DATABASE_NAME && pg_restore --format=c --dbname=$DATABASE_URL_WITHOUT_QUERY tmp/full.dump && echo "Import done"'
간단히 말해서 (기존의 정리) : (데이터베이스 이름은 postgres
)
pg_restore -c -d postgres db.dump
또는 (새로 만들기)
pg_restore -C -d postgres db.dump
또는 (명확하게 새로 작성)
createdatabase the_database
pg_restore -d the_database db.dump
자세한 내용은 SCO가 말한 내용을 참조하십시오.
pg_restore: [archiver] -C and -c are incompatible options
pg_restore -C -d postgres db.dump
무섭게 보일 수 있지만 postgres 데이터베이스에는 아무런 영향을 미치지 않으며 초기 연결에만 사용됩니다.
좀 더 명시 적으로 말하면, 이것이 나를 위해 문제를 해결 한 것입니다.
원하는 이름으로 빈 데이터베이스를 만듭니다. (필자의 경우 사용자 이름은 'postgres'입니다)
psql -U [username]
그런 다음 암호를 묻는 메시지가 나타납니다. 이때 [username] (으)로 로그인됩니다. 다음을 입력하십시오.
CREATE DATABASE [dbname];
이제 세션을 종료하고 일반 터미널 세션으로 돌아갑니다.
대상 데이터베이스 이름을 방금 작성한 데이터베이스 이름으로 설정 한 파일에서 데이터베이스를 복원하십시오.
cat [your_file_path/filename] | psql -U [username] [dbname]
여기서 [your_file_path / filename]은 복원하려는 db 파일 또는 텍스트 파일의 위치입니다.
-F
옵션을 사용하여 백업을 생성 할 때 -F p
SQL 문장이있는 일반 텍스트 파일을 생성 하지 않는 한 pg_restore를 사용하여 백업을 복원해야합니다 .
pg_restore
. -C 옵션은 이름이 덤프 파일의 데이터베이스 이름과 일치하는 데이터베이스 만 작성할 수 있습니다. 임의의 데이터베이스로 복원하려면을 실행CREATE DATABASE new_db;
하기 전에 psql 에서 실행 해야합니다pg_restore --dbname=new_db
.