매일 밤마다 치명적인 일이 발생하기 전에 데이터베이스를 백업하기 위해 cronjob을 만들려고합니다. 이 명령이 내 요구를 충족시켜야하는 것 같습니다.
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
그것을 실행 한 후에는 암호를 입력해야합니다. cron에서 실행하면 그렇게 할 수 없습니다. 자동으로 어떻게 전달할 수 있습니까?
매일 밤마다 치명적인 일이 발생하기 전에 데이터베이스를 백업하기 위해 cronjob을 만들려고합니다. 이 명령이 내 요구를 충족시켜야하는 것 같습니다.
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
그것을 실행 한 후에는 암호를 입력해야합니다. cron에서 실행하면 그렇게 할 수 없습니다. 자동으로 어떻게 전달할 수 있습니까?
답변:
.pgpass
계정 pg_dump
이 실행될 홈 디렉토리에 파일을 작성하십시오 . 형식에 대한 자세한 내용은 PostgreSQL 설명서 libpq-pgpass 를 참조하십시오 (모드를로 설정하지 않으면 형식이 무시되는 마지막 단락 포함 0600
).
sudo su postgres
: 유닉스 사용자가 반드시 존재하지 않습니다. 필요하지 않습니다. 그러나 DB 사용자는해야합니다.
또는 스크립트를 실행하도록 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
.pgpass
간접적 인 레이어를 추가하지 않고도 모든 것을 한곳에 보관할 수 있습니다. 또한 변수 내보내기와 관련된 모든 작업을 수행하려면 .bashrc
파일 또는 다른 작업을 수행하십시오.
.pgpass
파일이 더 나은 솔루션 인 이유를 알 수 있습니다 . 나는 단지 대안을 제시하고 있었지만 그것이 downvote를받을 자격이 있는지 확실하지 않다. :)
하나의 명령으로 수행하려면 다음을 수행하십시오.
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
postgres://
구문으로 작동시키는 방법을 알 수 없었습니다. .pgpass
내 postgress 사용자에게 홈 디렉토리가 없기 때문에 시도하지 않았습니다 .
데이터베이스 마이그레이션과 같은 단일 라이너의 --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
--dbname
Windows에서 pgpass.conf
파일은 다음 폴더에 있어야합니다.
%APPDATA%\postgresql\pgpass.conf
postgresql
폴더 안에 폴더 가 없으면 %APPDATA%
만듭니다.
pgpass.conf
파일 내용은 같은 것입니다 :
localhost:5432:dbname:dbusername:dbpassword
건배
내가 틀렸다면 정정하지만 시스템 사용자가 데이터베이스 사용자와 동일하면 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
해당 신임 정보를 보호하기 위해 다른 호스트 계정으로 사용 하는 것이 의미가 없으므로 이후에 신임 정보를 삭제합니다 .
history
이런 식 으로 터미널에 기록됩니다 .
history -c
. Jenkins와 함께 사용 Inject passwords to the build as environment variables
하는 경우 비밀번호가 마스크되도록 옵션을 사용하십시오.
암호를 전달하는 또 다른 (아마 안전하지 않은) 방법은 입력 리디렉션을 사용하는 것입니다.
pg_dump [params] < [path to file containing password]
다음을 사용하여 비밀번호를 pg_dump에 직접 전달할 수 있습니다.
pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql
내 의견으로는 가장 쉬운 방법은 다음과 같습니다. 기본 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
암호없이 작동했습니다.