Programing

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

lottogame 2020. 4. 6. 07:58
반응형

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


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

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

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


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


또는 스크립트를 실행하도록 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

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

PGPASSWORD="mypass" pg_dump mydb > mydb.dump

데이터베이스 마이그레이션과 같은 단일 라이너의 --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


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

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

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

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

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

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

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


임시 .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다른 신임 정보를 보호하기 위해 다른 호스트 계정으로 사용 하는 것이 무의미 할 수 있으므로 이후에 신임 정보를 삭제합니다.


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


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

%APPDATA%\postgresql\pgpass.conf

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

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

localhost:5432:dbname:dbusername:dbpassword

건배


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

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


내 의견으로는 가장 쉬운 방법은 다음과 같습니다. 기본 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

암호없이 작동했습니다.

참고 URL : https://stackoverflow.com/questions/2893954/how-to-pass-in-password-to-pg-dump

반응형