pg_restore가 --create를 무시하는 이유는 무엇입니까? 오류 : 실패 : 치명적 : "new_db"데이터베이스가 없습니다.


16

다음 명령을 실행하려고합니다.

sshpass  -p "pass" ssh  x@1.2.3.4 "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db

나는 얻다:

failed: FATAL:  database "new_db" does not exist

답변:


19

pg_restore가 작동하는 방식이기 때문입니다.

pg_restore 매뉴얼 은 다음과 같이 읽습니다.

-C, --create 데이터베이스를 복원하기 전에 작성하십시오. --clean도 지정되면 연결하기 전에 대상 데이터베이스를 삭제하고 다시 작성하십시오.

이 옵션을 사용하면 -d로 이름 지정된 데이터베이스는 초기 DROP DATABASE 및 CREATE DATABASE 명령을 발행하는 데만 사용됩니다 . 모든 데이터는 아카이브에 나타나는 데이터베이스 이름으로 복원됩니다 .

-C가 사용되지 않는 경우에만 -d는 주어진 데이터베이스에서 복원됩니다. -C를 사용하는 경우 데이터베이스는 대상이 아닌 "런치 패드"로 사용됩니다.


6
명확히하기 위해 : 임의의 데이터베이스 이름을 생성하고로 복원 할 수있는 방법이 없습니다 pg_restore. -C 옵션은 이름이 덤프 파일의 데이터베이스 이름과 일치하는 데이터베이스 만 작성할 수 있습니다. 임의의 데이터베이스로 복원하려면을 실행 CREATE DATABASE new_db;하기 전에 psql 에서 실행 해야합니다 pg_restore --dbname=new_db.
Luke

내 명령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"'
srghma

5
도구가 쉬울 때 왜 혼란스러워해야합니까?
Augustin Riedinger

8

간단히 말해서 (기존의 정리) : (데이터베이스 이름은 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가 말한 내용을 참조하십시오.


첫 번째 제안은 9.1에서 작동하지 않았습니다.pg_restore: [archiver] -C and -c are incompatible options
peetasan

이것이 작동하는지 확인할 수 있습니다 (편집 후 및 "postgres"의 철자가 틀린 경우). pg_restore -C -d postgres db.dump무섭게 보일 수 있지만 postgres 데이터베이스에는 아무런 영향을 미치지 않으며 초기 연결에만 사용됩니다.
Zilk

0

좀 더 명시 적으로 말하면, 이것이 나를 위해 문제를 해결 한 것입니다.

  1. 원하는 이름으로 빈 데이터베이스를 만듭니다. (필자의 경우 사용자 이름은 'postgres'입니다)

    psql -U [username]

그런 다음 암호를 묻는 메시지가 나타납니다. 이때 [username] (으)로 로그인됩니다. 다음을 입력하십시오.

    CREATE DATABASE [dbname];

이제 세션을 종료하고 일반 터미널 세션으로 돌아갑니다.

  1. 대상 데이터베이스 이름을 방금 작성한 데이터베이스 이름으로 설정 한 파일에서 데이터베이스를 복원하십시오.

    cat [your_file_path/filename] | psql -U [username] [dbname]

여기서 [your_file_path / filename]은 복원하려는 db 파일 또는 텍스트 파일의 위치입니다.


de -F옵션을 사용하여 백업을 생성 할 때 -F pSQL 문장이있는 일반 텍스트 파일을 생성 하지 않는 한 pg_restore를 사용하여 백업을 복원해야합니다 .
EAmez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.