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
. 물론 postgres
cron 작업을 실행할 수 있어야합니다. 따라서에 나열되어 /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
'Programing' 카테고리의 다른 글
Java에서 이진 형식으로 정수 인쇄 (0) | 2020.04.06 |
---|---|
python matplotlib에서 축 텍스트 회전 (0) | 2020.04.06 |
web.config에서 연결 문자열 읽기 (0) | 2020.04.06 |
PG :: ConnectionBad-서버에 연결할 수 없습니다 : 연결이 거부되었습니다 (0) | 2020.04.06 |
기기가 스마트 폰 또는 태블릿인지 확인 하시겠습니까? (0) | 2020.04.06 |