pg_dump에 비밀번호를 전달하는 방법은 무엇입니까?


294

매일 밤마다 치명적인 일이 발생하기 전에 데이터베이스를 백업하기 위해 cronjob을 만들려고합니다. 이 명령이 내 요구를 충족시켜야하는 것 같습니다.

0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz

그것을 실행 한 후에는 암호를 입력해야합니다. cron에서 실행하면 그렇게 할 수 없습니다. 자동으로 어떻게 전달할 수 있습니까?


아마도 pg_restore 자동화에 쓴 유용한 게시물! medium.com/@trinity/…
kittyminky

연결 문자열을 사용하여 여기에 응답하십시오 : stackoverflow.com/a/29101292/1579667
Benj

답변:


304

.pgpass계정 pg_dump이 실행될 홈 디렉토리에 파일을 작성하십시오 . 형식에 대한 자세한 내용은 PostgreSQL 설명서 libpq-pgpass 를 참조하십시오 (모드를로 설정하지 않으면 형식이 무시되는 마지막 단락 포함 0600).


99
localhost : 5432 : mydbname : postgres : mypass를 사용하여 ~ / .pgpass를 생성 한 다음 chmod 600 ~ / .pgpass
Mircea Stanciu

6
아마도 도움이 될 것입니다 : Ubuntu에서 "sudo su postgres"는 "postgres"사용자로 전환 한 다음 .pgpass 파일을 생성하고 덤프를 실행합니다.
fivedogit

1
귀하의 답변을 따랐지만 여전히 백업 파일을 성공적으로 만들 수 없습니다. 내 링크를 참조하십시오 unix.stackexchange.com/questions/257898/...은 . 감사합니다.
alyssaeliyah

9.6.2에서 작동 : o)
Andrew

2
에 대한 참고 사항 sudo su postgres: 유닉스 사용자가 반드시 존재하지 않습니다. 필요하지 않습니다. 그러나 DB 사용자는해야합니다.
Fabien Haddadi

216

또는 스크립트를 실행하도록 crontab을 설정할 수 있습니다. 해당 스크립트 내에서 다음과 같은 환경 변수를 설정할 수 있습니다. export PGPASSWORD="$put_here_the_password"

이 방법으로 비밀번호가 필요한 여러 명령이있는 경우 스크립트에 모두 입력 할 수 있습니다. 비밀번호가 변경되면 한 위치 (스크립트)에서만 변경하면됩니다.

그리고 pg_dump -Fc가장 유연한 내보내기 형식을 사용하고 이미 압축 되어있는 Joshua에 동의합니다 . 자세한 내용은 다음을 참조하십시오 : pg_dump documentation

예 :

# dump the database in custom-format archive
pg_dump -Fc mydb > db.dump

# restore the database
pg_restore -d newdb db.dump

3
이것은 이상적이지 않습니다. 그것을 던지면 .pgpass간접적 인 레이어를 추가하지 않고도 모든 것을 한곳에 보관할 수 있습니다. 또한 변수 내보내기와 관련된 모든 작업을 수행하려면 .bashrc파일 또는 다른 작업을 수행하십시오.
mpen

9
.pgpass파일이 더 나은 솔루션 인 이유를 알 수 있습니다 . 나는 단지 대안을 제시하고 있었지만 그것이 downvote를받을 자격이 있는지 확실하지 않다. :)
Max

13
나는 공감하지 않았다. 그것은 다른 누군가였습니다. 나는 그것이 공감대를 보증한다고 생각하지 않았다. 그것을 보완하기 위해 +1을하십시오.
mpen

7
너무 많은 증오. 이 답변에 감사 드리며 본인의 응용 프로그램에 채택하고 있습니다.
James T Snell

8
PGPASSWORD 환경 변수 설정은 문서에서 권장하지 않는 방법 ( postgresql.org/docs/current/static/libpq-envars.html ) : 일부 운영 체제에서는 루트 사용자는 ps를 통해 프로세스 환경 변수를 볼 수 있습니다. 대신 ~ / .pgpass 파일을 사용하여 고려
Bouchon 등

175

하나의 명령으로 수행하려면 다음을 수행하십시오.

PGPASSWORD="mypass" pg_dump mydb > mydb.dump

27
PGPASSWORD 환경 변수 설정은 문서 에서 권장하지 않는 방법 ( postgresql.org/docs/current/static/libpq-envars.html ) : 일부 운영 체제에서는 루트 사용자는 ps를 통해 프로세스 환경 변수를 볼 수 있습니다. 대신 ~ / .pgpass 파일을 사용하여 고려
Bouchon 등

18
여전히 유용한 의견입니다. 이것이 여전히 유용한 배포 사례가 많이 있습니다.
Iain Duncan

1
'사용자'username '에 대한 피어 인증에 실패했습니다'라는 오류가 항상 표시됩니다. 솔루션이었다 PGPASSWORD = "mypass"pg_dump의 -U 사용자 이름 -h 로컬 호스트> mydb.dump
마틴으로 Pabst

4
내 의견은 알려진 암호화되지 않은 위치 에서 와 같이 환경 변수 (제어 할 위치 , 암호 저장 위치방법) 를 설정하는 것이 훨씬 낫다 는 것입니다. postgresql 문서 의이 부분에 결함이 있으며이 답변이 좋습니다.
peterh-Reinstate Monica

1
내 비밀번호에 '@'이 있습니다. 이것은 효과가 있었다. postgres://구문으로 작동시키는 방법을 알 수 없었습니다. .pgpass내 postgress 사용자에게 홈 디렉토리가 없기 때문에 시도하지 않았습니다 .
jmathew

136

데이터베이스 마이그레이션과 같은 단일 라이너의 --dbname경우 pg_dump 매뉴얼에 명시된대로 연결 문자열 (암호 포함)을 사용할 수 있습니다

본질적으로.

pg_dump --dbname=postgresql://username:password@127.0.0.1:5432/mydatabase

참고 : 당신이 옵션을 사용하는 것이 확인 --dbname대신 짧은의를 -d유효한 URI 접두어를 사용, postgresql://또는 postgres://.

일반적인 URI 형식은 다음과 같습니다.

postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]

귀하의 경우 모범 사례 (cron의 반복 작업) 보안 문제로 인해 수행해서는 안됩니다. .pgpass파일 이 아닌 경우 연결 문자열을 환경 변수로 저장합니다.

export MYDB=postgresql://username:password@127.0.0.1:5432/mydatabase

그런 다음 crontab에 있습니다

0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz


Postgre 버전 9.1은 dbname에 대한 알 수없는 옵션을 출력합니다
akohout

이것은 각각 아치 및 RHEL에서 버전 9.4 및 9.3으로 테스트되었습니다. 연결 문자열을 게시 할 수 있습니까? 물론 익명.
Josue Alexander Ibarra

감사합니다, @JosueIbarra. PostgreSQL 9.3, Ubuntu 14.04에서 성공적으로 테스트되었습니다.
Cao Minh Tu

1
@EntryLevelR 저장하려면 출력을 파일로 파이프해야합니다. 이 관련 질문을 참조 askubuntu.com/questions/420981/...
여호수아 알렉산더 바라

4
이것이 정답이어야합니다. 하나의 라이너.
swdev

48
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename

좋지만 슬프게도 저에게는 효과가 없습니다. "쿼리 실패 : 오류 : direction_lookup 관계에 대한 권한이 거부되었습니다"
James T Snell

@Doc pg 사용자에게 필요한 권한을 부여하려고 했습니까?
Francisco Luz

33

이 하나의 라이너는 단일 데이터베이스의 덤프를 만드는 동안 도움이됩니다.

PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql

1
많은 도움이 ... thnxxx
ronit

19

--dbname이 전달되지 않으면 @Josue Alexander Ibarra 답변이 centos 7 및 버전 9.5에서 작동합니다.

pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase 

1
당신이 옳습니다, 그것이 어떻게 보일지, 몇 년 전에 잘못 된 것은 내 쉘 구성이라고 생각합니다. 그것이 내가 사용해야하는 이유입니다.--dbname
Josue Alexander Ibarra

7

Windows에서 pgpass.conf파일은 다음 폴더에 있어야합니다.

%APPDATA%\postgresql\pgpass.conf

postgresql폴더 안에 폴더 가 없으면 %APPDATA%만듭니다.

pgpass.conf파일 내용은 같은 것입니다 :

localhost:5432:dbname:dbusername:dbpassword

건배


4

내가 틀렸다면 정정하지만 시스템 사용자가 데이터베이스 사용자와 동일하면 PostgreSQL은 암호를 요구하지 않습니다-인증을 위해 시스템에 의존합니다. 구성 문제 일 수 있습니다.

따라서 데이터베이스 소유자 postgres가 매일 밤 데이터베이스를 백업 하기를 원할 때 crontab을 만들 수 있습니다 crontab -e -u postgres. 물론 postgrescron 작업을 실행할 수 있어야합니다. 따라서에 나열되어 /etc/cron.allow있거나 /etc/cron.deny비어 있어야합니다.


당신은 바로 여기에 있습니다. 기본 Postgres 구성은 로컬 시스템 계정에 TRUST 인증을 사용합니다. 그러나 대부분의 프로덕션 설정은 RDBMS를 설치 한 직후이 블록을 제거합니다.
Jacek Prucia

4

임시 .pgpass 자격 증명을 사용하여 비밀번호로 ssh를 통해 백업하고 S3으로 푸시 :

#!/usr/bin/env bash
cd "$(dirname "$0")"

DB_HOST="*******.*********.us-west-2.rds.amazonaws.com"
DB_USER="*******"
SSH_HOST="my_user@host.my_domain.com"
BUCKET_PATH="bucket_name/backup"

if [ $# -ne 2 ]; then
    echo "Error: 2 arguments required"
    echo "Usage:"
    echo "  my-backup-script.sh <DB-name> <password>"
    echo "  <DB-name> = The name of the DB to backup"
    echo "  <password> = The DB password, which is also used for GPG encryption of the backup file"
    echo "Example:"
    echo "  my-backup-script.sh my_db my_password"
    exit 1
fi

DATABASE=$1
PASSWORD=$2

echo "set remote PG password .."
echo "$DB_HOST:5432:$DATABASE:$DB_USER:$PASSWORD" | ssh "$SSH_HOST" "cat > ~/.pgpass; chmod 0600 ~/.pgpass"
echo "backup over SSH and gzip the backup .."
ssh "$SSH_HOST" "pg_dump -U $DB_USER -h $DB_HOST -C --column-inserts $DATABASE" | gzip > ./tmp.gz
echo "unset remote PG password .."
echo "*********" | ssh "$SSH_HOST" "cat > ~/.pgpass"
echo "encrypt the backup .."
gpg --batch --passphrase "$PASSWORD" --cipher-algo AES256 --compression-algo BZIP2 -co "$DATABASE.sql.gz.gpg" ./tmp.gz

# Backing up to AWS obviously requires having your credentials to be set locally
# EC2 instances can use instance permissions to push files to S3
DATETIME=`date "+%Y%m%d-%H%M%S"`
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/"$DATETIME".sql.gz.gpg
# s3 is cheap, so don't worry about a little temporary duplication here
# "latest" is always good to have because it makes it easier for dev-ops to use
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/latest.sql.gz.gpg

echo "local clean-up .."
rm ./tmp.gz
rm "$DATABASE.sql.gz.gpg"

echo "-----------------------"
echo "To decrypt and extract:"
echo "-----------------------"
echo "gpg -d ./$DATABASE.sql.gz.gpg | gunzip > tmp.sql"
echo

첫 번째 구성 줄을 필요한 것만으로 대체하십시오. S3 백업 부분에 관심이없는 분은 빼십시오.

이 스크립트 .pgpass는 일부 환경에서 기본 SSH 사용자가 비밀번호없이 (예 : ubuntu사용자 와의 EC2 인스턴스) sudo를 수행 할 수 있으므로 .pgpass해당 신임 정보를 보호하기 위해 다른 호스트 계정으로 사용 하는 것이 의미가 없으므로 이후에 신임 정보를 삭제합니다 .


비밀번호는 history이런 식 으로 터미널에 기록됩니다 .
mpen

1
@mpen 로컬로 그렇습니다. 원격 으로요 제 경우에는 원격 액세스를 허용하지 않는 안전한 VM이기 때문에 로컬 히스토리에 있으면 괜찮습니다. 귀하의 경우에 확인되지 않으면 그냥하십시오 history -c. Jenkins와 함께 사용 Inject passwords to the build as environment variables하는 경우 비밀번호가 마스크되도록 옵션을 사용하십시오.
MikeM

4

에 설명 된대로 이 블로그 게시물 은 Using : 예 "pg_dump의"명령과 대화 형 PostgreSQL의 유틸리티에 대한 암호를 제공 비에 두 가지 방법이있다 ".pgpass" 파일 또는 사용 "PGPASSWORD" 환경 변수.


-1

암호를 전달하는 또 다른 (아마 안전하지 않은) 방법은 입력 리디렉션을 사용하는 것입니다.

pg_dump [params] < [path to file containing password]


보안 관련-이 파일은 원하는 사용자 만 읽을 수 있어야합니다. 그러나 루트 권한이있는 사용자는 보안 설정을 변경하여 암호화되지 않은 비밀번호를 읽을 수 있습니다. 그렇습니다, 이것은 안전하지 않습니다 ...
Tobias

3
@Tobias 대안이 있습니까? 루트 권한을 가진 사람은 암호를 대화식으로 입력하는 것 외에 다른 기술에 관계없이 항상 암호를 볼 수있는 것 같습니다 (질문은 cron에 관한 것입니다). postgresql.org/docs/9.3/static/auth-methods.html#GSSAPI-AUTH 는 싱글 사인온을 지원하는 GSSAPI를 언급하지만 비 대화식으로 작동하는 경우에는 언급하지 않습니다.
Ross Bradbury

4
루트 권한이있는 사람은 누구나 권장되는 .pgpass를 읽을 수 있습니다. 따라서 루트 액세스는 보안 위험으로 간주되지 않습니다.
최대

-1

다음을 사용하여 비밀번호를 pg_dump에 직접 전달할 수 있습니다.

pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql

스택 오버플로에 오신 것을 환영합니다! 귀하의 답변은 효과가있을 수 있지만 보안에 심각한 영향을 미칩니다. 명령의 인수는 ps (1) 에 표시되므로 프로세스가 ps (1)을 모니터하면 비밀번호가 손상됩니다.
Jonathan Rosa

-4

내 의견으로는 가장 쉬운 방법은 다음과 같습니다. 기본 postgres 구성 파일 pg_hba.conf를 편집하면 다음 줄을 추가해야합니다.

host <you_db_name> <you_db_owner> 127.0.0.1/32 trust

그리고이 후에 당신은 cron을 시작해야합니다 :

pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz

암호없이 작동했습니다.


그리고 당신은 시스템 보안을 파괴했습니다. dev 상자에 대해서는 괜찮지 만 다른 것은 없습니다.
Theodore R. Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.