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 Anforderungen erfüllen sollte:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
Außer nachdem ich das ausgeführt habe, wird erwartet, dass ich ein Passwort eingebe. Ich kann das nicht tun, wenn ich es von Cron aus laufen lasse. Wie kann ich eine automatisch übergeben?
bash
postgresql
shell
crontab
mpen
quelle
quelle
Antworten:
Erstellen Sie eine
.pgpass
Datei im Ausgangsverzeichnis des Kontos,pg_dump
das als ausgeführt wird. Weitere Informationen zum Format finden Sie in der Postgresql-Dokumentation libpq-pgpass (einschließlich des letzten Absatzes, in dem erklärt wird, dass es ignoriert wird, wenn Sie den Modus nicht auf einstellen0600
).quelle
sudo su postgres
: Dieser Unix-Benutzer muss nicht unbedingt vorhanden sein. Das muss nicht sein. Aber der DB-Benutzer sollte.Oder Sie können crontab so einrichten, dass ein Skript ausgeführt wird. In diesem Skript können Sie eine Umgebungsvariable wie folgt festlegen:
export PGPASSWORD="$put_here_the_password"
Auf diese Weise können Sie alle Befehle, für die ein Kennwort erforderlich ist, alle in das Skript einfügen. Wenn sich das Passwort ändert, müssen Sie es nur an einer Stelle ändern (im Skript).
Und ich stimme Joshua zu, dass die Verwendung
pg_dump -Fc
das flexibelste Exportformat generiert und bereits komprimiert ist. Weitere Informationen finden Sie unter: pg_dump-DokumentationZ.B
quelle
.pgpass
bleibt auch alles an einem Ort, ohne dass eine zusätzliche Indirektionsebene hinzugefügt wird. Wenn ich nur eine Variable exportieren wollte, würde ich das in meiner.bashrc
Datei tun , oder was auch immer es ist..pgpass
Datei eine bessere Lösung wäre. Ich gab nur eine Alternative, nicht sicher, ob es eine Ablehnung verdient :)Wenn Sie es in einem Befehl tun möchten:
quelle
postgres://
Syntax funktioniert . Habe das nicht ausprobiert,.pgpass
weil mein Postgress-Benutzer kein Home-Verzeichnis hat.Für einen Einzeiler wie das Migrieren einer Datenbank können Sie
--dbname
eine Verbindungszeichenfolge (einschließlich des Kennworts) verwenden, wie im Handbuch pg_dump angegebenIm Wesentlichen.
pg_dump --dbname=postgresql://username:[email protected]:5432/mydatabase
Hinweis: Stellen Sie sicher, dass Sie die Option
--dbname
anstelle der kürzeren verwenden-d
und ein gültiges URI-Präfix verwenden,postgresql://
oderpostgres://
.Das allgemeine URI-Formular lautet:
postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
Best Practice in Ihrem Fall (sich wiederholende Aufgabe in Cron) Dies sollte aus Sicherheitsgründen nicht durchgeführt werden. Ohne
.pgpass
Datei würde ich die Verbindungszeichenfolge als Umgebungsvariable speichern.export MYDB=postgresql://username:[email protected]:5432/mydatabase
dann haben in Ihrem crontab
0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
quelle
quelle
Dieser eine Liner hilft mir beim Erstellen eines Dumps einer einzelnen Datenbank.
quelle
@Josue Alexander Ibarra Antwort funktioniert auf Centos 7 und Version 9.5, wenn --dbname nicht übergeben wird.
quelle
--dbname
Beachten Sie, dass sich die
pgpass.conf
Datei in Windows im folgenden Ordner befinden muss:Wenn sich kein
postgresql
Ordner im%APPDATA%
Ordner befindet, erstellen Sie ihn.Der
pgpass.conf
Dateiinhalt ist ungefähr so:Prost
quelle
Korrigieren Sie mich, wenn ich falsch liege, aber wenn der Systembenutzer mit dem Datenbankbenutzer identisch ist, fragt PostgreSQL nicht nach dem Kennwort - es ist für die Authentifizierung auf das System angewiesen. Dies kann eine Frage der Konfiguration sein.
Wenn ich also wollte, dass der Datenbankbesitzer
postgres
jede Nacht seine Datenbanken sichert, könnte ich eine Crontab dafür erstellen :crontab -e -u postgres
. Natürlichpostgres
müsste es erlaubt sein, Cron-Jobs auszuführen; Daher muss es in aufgeführt sein/etc/cron.allow
oder/etc/cron.deny
leer sein.quelle
Sichern Sie über ssh mit einem Kennwort unter Verwendung temporärer .pgpass-Anmeldeinformationen und drücken Sie auf S3:
Ersetzen Sie einfach die ersten paar Konfigurationszeilen durch alles, was Sie brauchen - natürlich. Für diejenigen, die nicht am S3-Backup-Teil interessiert sind, nehmen Sie es heraus - offensichtlich.
Dieses Skript löscht die Anmeldeinformationen
.pgpass
anschließend, da in einigen Umgebungen der Standard-SSH-Benutzer ohne Kennwort sudo kann, z. B. eine EC2-Instanz mit demubuntu
Benutzer. Daher ist die Verwendung.pgpass
mit einem anderen Hostkonto zur Sicherung dieser Anmeldeinformationen möglicherweise sinnlos.quelle
history
diese Weise am Terminal protokolliert , nein?history -c
. Verwenden Sie bei der Verwendung mit Jenkins dieInject passwords to the build as environment variables
Option, damit das Passwort maskiert wirdWie in diesem Blogbeitrag beschrieben , gibt es zwei Möglichkeiten, PostgreSQL-Dienstprogrammen wie dem Befehl "pg_dump" nicht interaktiv ein Kennwort bereitzustellen: Verwenden der Datei ".pgpass" oder der Umgebungsvariablen "PGPASSWORD" .
quelle
Eine andere (wahrscheinlich nicht sichere) Möglichkeit, ein Passwort zu übergeben, ist die Umleitung von Eingaben, dh das Aufrufen
pg_dump [params] < [path to file containing password]
quelle
Sie können ein Passwort direkt an pg_dump übergeben, indem Sie Folgendes verwenden:
quelle
Meiner Meinung nach ist dies der einfachste Weg: Sie bearbeiten Ihre Haupt-Postgres-Konfigurationsdatei: pg_hba.conf Dort müssen Sie die folgende Zeile hinzufügen:
host <you_db_name> <you_db_owner> 127.0.0.1/32 trust
und danach musst du anfangen cron so:
pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz
und es funktionierte ohne Passwort
quelle