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?
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).
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
Wenn Sie es mit einem Befehl tun wollen:
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
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
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
@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
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.
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.
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.
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