it-swarm.com.de

Wie kann ich ein Passwort an pg_dump übergeben?

Ich versuche, jeden Abend einen Cronjob zu erstellen, um meine Datenbank zu sichern, bevor etwas katastrophales passiert. Es sieht so aus, als ob dieser Befehl meine Bedürfnisse erfüllen sollte:

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

Abgesehen davon, dass ich das ausgeführt habe, muss ich ein Passwort eingeben. Ich kann das nicht tun, wenn ich es von cron starte. Wie kann ich eine automatisch übergeben?

215
mpen

Erstellen Sie eine .pgpass-Datei im Basisverzeichnis des Kontos, unter dem pg_dump ausgeführt wird. Weitere Informationen zum Format finden Sie in der Dokumentation zu Postgresql libpq-pgpass (einschließlich des letzten Absatzes, in dem erläutert wird, dass es ignoriert wird, wenn Sie den Modus nicht auf 0600 setzen).

229
araqnid

Oder Sie können crontab so einrichten, dass ein Skript ausgeführt wird. Innerhalb dieses Skripts können Sie eine Umgebungsvariable wie folgt festlegen: export PGPASSWORD="$put_here_the_password"

Wenn Sie über mehrere Befehle verfügen, für die ein Kennwort erforderlich ist, können Sie sie alle in das Skript einfügen. Wenn sich das Passwort ändert, müssen Sie es nur an einer Stelle (dem Skript) ändern.

Und ich stimme mit Joshua überein: pg_dump -Fc erzeugt das flexibelste Exportformat und ist bereits komprimiert. Weitere Informationen finden Sie unter: pg_dump Dokumentation

Z.B. 

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

# restore the database
pg_restore -d newdb db.dump
170
Max

Wenn Sie es mit einem Befehl tun wollen:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump
135
gitaarik

Für einen Einzeiler, wie das Migrieren einer Datenbank, können Sie --dbname Gefolgt von einer Verbindungszeichenfolge (einschließlich des Kennworts) verwenden, wie im pg_dump manual angegeben

Im Wesentlichen.

pg_dump --dbname=postgresql://username:[email protected]:5432/mydatabase

Hinweis: Stellen Sie sicher, dass Sie die Option --dbname Anstelle des kürzeren -d Verwenden und ein gültiges URI-Präfix verwenden. postgresql:// Oder postgres://.

Die allgemeine URI-Form lautet:

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

Best Practice in Ihrem Fall (repetitive Task in Cron) Dies sollte aus Sicherheitsgründen nicht durchgeführt werden. Ohne die Datei .pgpass Würde ich die Verbindungszeichenfolge als Umgebungsvariable speichern.

export MYDB=postgresql://username:[email protected]:5432/mydatabase

dann haben Sie in Ihrem crontab

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

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

@Josue Die Antwort von Alexander Ibarra funktioniert auf Centos 7 und Version 9.5 , Wenn --dbname nicht übergeben wird. 

pg_dump postgresql://username:[email protected]:5432/mydatabase 
13
Jauyzed

Korrigieren Sie mich, wenn ich falsch liege. Wenn der Systembenutzer jedoch derselbe ist wie der Datenbankbenutzer, fragt PostgreSQL nicht nach dem Kennwort. Es wird vom System zur Authentifizierung abgerufen. Dies kann eine Frage der Konfiguration sein.

Wenn ich also wollte, dass der Datenbankbesitzer postgres jede Nacht ein Backup seiner Datenbanken erstellt, kann ich eine Crontab erstellen: crontab -e -u postgres. Natürlich muss postgres erlaubt sein, Cron-Jobs auszuführen. daher muss es in /etc/cron.allow aufgeführt sein, oder /etc/cron.deny muss leer sein.

4
Tobias

Backup über SSH mit Passwort mit temporären .pgpass-Zugangsdaten und Push to S3:

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

DB_Host="*******.*********.us-west-2.rds.amazonaws.com"
DB_USER="*******"
SSH_Host="[email protected]_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

Ersetzen Sie einfach die ersten paar Konfigurationszeilen durch das, was Sie benötigen - offensichtlich . Wenn Sie sich nicht für den S3-Backup-Teil interessieren, nehmen Sie ihn heraus - offensichtlich.

Dieses Skript löscht die Berechtigungsnachweise anschließend in .pgpass, da der Standard-SSH-Benutzer in einigen Umgebungen Sudo ohne Kennwort verwenden kann, z. B. eine EC2-Instanz mit dem Benutzer ubuntu. Daher kann die Verwendung von .pgpass mit einem anderen Host-Konto zur Sicherung dieser Berechtigungsnachweise verwendet werden zwecklos.

3
MikeM

Wie in diesem Blogbeitrag ausführlich beschrieben, gibt es zwei Möglichkeiten, PostgreSQL-Dienstprogramme wie dem Befehl "pg_dump" nicht interaktiv ein Kennwort bereitzustellen: Verwenden Sie die Datei ".pgpass" oder die "PGPASSWORD" Umgebungsvariable.

2
manfall19

Beachten Sie, dass sich in Windows die Datei pgpass.conf im folgenden Ordner befinden muss:

%APPDATA%\postgresql\pgpass.conf

wenn sich im Ordner %APPDATA% kein Ordner postgresql befindet, erstellen Sie ihn.

der Inhalt der pgpass.conf-Datei ist ungefähr so:

localhost:5432:dbname:dbusername:dbpassword

prost

Dieser eine Liner hilft mir beim Erstellen eines Dumps einer einzelnen Datenbank.

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