2009-05-12 13 views
11

Ich kann Befehle wie vacuumdb, pg_dump und psql ganz gut in einem Skript ausführen, wenn ich sie Vorwort wie so:Wie kann ich meine PostgreSQL-Datenbank mit Cron sichern?

/usr/bin/sudo -u postgres /usr/bin/pg_dump -Fc mydatabase > /opt/postgresql/prevac.gz 
/usr/bin/sudo -u postgres /usr/bin/vacuumdb --analyze mydatabase 
/usr/bin/sudo -u postgres /usr/bin/pg_dump -Fc mydatabase > /opt/postgresql/postvac.gz 
SCHEMA_BACKUP="/opt/postgresql/$(date +%w).db.schema" 
sudo -u postgres /usr/bin/pg_dump -C -s mydatabase > $SCHEMA_BACKUP 

Diese auf der Kommandozeile auf Redhat laufen, wenn ich sudo bin zu verankern und dann, wie Sie sehen, In den oben genannten Befehlen mache ich ein Sudo -u nach Postgres.

Aber wenn ich versuche, diese von Cron, kick ich bekomme null Bytes in allen Dateien - was bedeutet, dass es nicht ordnungsgemäß ausgeführt wurde. Und ich habe keine Ahnung in den Protokollen, die ich sehen kann.

Meine/etc/crontab hat diesen Eintrag am unteren

00 23 * * * root /etc/db_backup.cron 

Und ja, /etc/db_backup.cron ist chmod ug + x, im Besitz von Root und der Anfang der Datei sagt " #!/bin/bash "(minus doublequotes).

Wer weiß was gibt?

+0

mindestens auf redhat, müssen% Symbole maskiert werden. Wenn Sie nicht entkommen, wird Cron versuchen, Ihren Befehl nur bis zum% auszuführen. Siehe - http://fahdshariff.blogspot.com/2009/05/percent-sign-in-contab.html – chrismarx

Antwort

9

Da Sie Superuser-Rechte scheinen sowieso zu haben, könnten Sie wie so diese Befehle in die crontab des Postgres Benutzer setzen:

sudo su postgres 
crontab -e 

und setzen dann die pg_dump/vacuumdb dort Befehle.

+1

Dies ist, was ich letztendlich getan habe und es funktionierte nur gut, wenn ich chown postgres.root/opt/postgresql (wo die Dateien gingen). – Volomike

+7

'' sudo su postgres '' Das ist verrückt! Versuchen Sie '' sudo -u postgres ''. Richten Sie eine Sudo-Spezifikation ein, das ist viel sicherer. –

+0

Sie (postgres) dürfen wegen der PAM-Konfiguration nicht auf (crontab) zugreifen. –

4

Ihre Umgebungsvariable ist vielleicht nicht in Cron gesetzt.

PG_PORT 
PG_HOST 
PG_DATABASE 
PG_USERNAME 
PG_PASSWORD 

eine "env" in yout Skript hinzufügen:

In Ihrem normalen Sitzung, haben Sie wahrscheinlich diese Variablen definiert.

+0

Ich brauche ein wenig mehr Hilfe als das, denke ich. Ich habe "env" vor den Befehlen und nach der #!/Bin/bash eingefügt und alles, was ich gemacht habe, war die Umgebung in die Protokolldatei zu exportieren (weil ich jetzt die Ausgabe in eine Logdatei lege, während sie läuft). – Volomike

+0

Der Weg, diese Variablen zu setzen, wäre 'Export PG_PORT = 5432' usw. – jhwist

+1

Das sind nicht gerade die Variablen, die von pg_dump und vacuumdb verwendet werden. Sie können die vollständige Liste hier sehen: http://www.postgresql.org/docs/8.4/static/libpq-envars.html – liviucmg

11

Ich habe ein dynamisches Bash-Skript, das alle Datenbanken auf dem Server sichert. Es ruft eine Liste aller Datenbanken ab und löscht dann jeden DB, bevor eine Sicherung durchgeführt wird. Alle Protokolle werden in eine Datei geschrieben und dieses Protokoll wird mir per E-Mail gesendet. Dies ist etwas, das Sie verwenden können, wenn Sie möchten.

Kopieren Sie den folgenden Code in eine Datei und fügen Sie die Datei zu Ihrer Crontab hinzu. Ich habe meine pg_hba.conf eingerichtet, um lokale Verbindungen zu vertrauen.

#!/bin/bash 
logfile="/backup/pgsql.log" 
backup_dir="/backup" 
touch $logfile 
databases=`psql -h localhost -U postgres -q -c "\l" | sed -n 4,/\eof/p | grep -v rows\) | grep -v template0 | grep -v template1 | awk {'print $1'}` 

echo "Starting backup of databases " >> $logfile 
for i in $databases; do 
     dateinfo=`date '+%Y-%m-%d %H:%M:%S'` 
     timeslot=`date '+%Y%m%d%H%M'` 
     /usr/bin/vacuumdb -z -h localhost -U postgres $i >/dev/null 2>&1 
     /usr/bin/pg_dump -U postgres -i -F c -b $i -h 127.0.0.1 -f $backup_dir/$i-database-$timeslot.backup 
     echo "Backup and Vacuum complete on $dateinfo for database: $i " >> $logfile 
done 
echo "Done backup of databases " >> $logfile 

tail -15 /backup/pgsql.log | mailx [email protected] 
+1

Sie können dem Befehl/usr/bin/vacuumdd '-analyze' hinzufügen, um eine Analyse durchzuführen. –

+5

Hier ist ein weiteres gutes Skript: http://wiki.postgresql.org/wiki/Automated_Backup_on_Linux –

+2

@Imraan Parker Wie schaffen Sie es, das Passwort zu überspringen? Ich möchte als Admin-Account der Datenbank nicht den Root-Benutzer postgres sichern, wie kann ich das tun? –

1

Sie haben wahrscheinlich "Ident" -Authentifizierung in Ihrer pg_hba.conf für Ihren Postgres-Benutzer. Die Option "-u postgres" schlägt fehl, wenn dies der Fall ist. entweder ändern Sie in Ihrem Backup-Skript Benutzer zu Postgres oder konfigurieren Sie eine andere Authentifizierungsmethode.

0

Anstelle des folgenden Befehl ein: Datenbanken = psql -h localhost -U postgres -q -c "\l" | sed -n 4,/\eof/p | grep -v rows\) | grep -v template0 | grep -v template1 | awk {'print $1'}

Sie können unten verwenden: Datenbanken = psql -t -c "select datname from pg_database where datname not like 'template%';" | grep -v '^$'

Die erste Rückkehr '|' für Template-Datenbanken und eine leere Zeile.

Die zweite ist sauberer.

0

Datenbanken = psql -h localhost -U postgres -q -x -t -c "\l" | grep 'Name' | sed 's/ //g' | sed 's/Name|//g'

0

Eine andere Version der Liste der Datenbanken erhalten:
psql -lqt | grep -vE '^ +(template[0-9]+|postgres)? *\|' | cut -d'|' -f1| sed -e 's/ //g' -e '/^$/d'

Als mein psql -lqt Ausgabe lautet:

abcdefghij   | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | 
postgres   | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | 
template0   | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   + 
        |   |   |    |    | postgres=CTc/postgres 
template1   | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   + 
        |   |   |    |    | postgres=CTc/postgres 
abc    | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | 
2

Ich habe meine cron wie folgt festgelegt. Alle 59 Minuten seit Montag bis Freitag

*/59 * * * 1-5 sh /home/my_user/scripts/back_my_bd.sh 

Das Skript das Backup auszuführen sind innerhalb back_my_bd.sh Datei und der Inhalt ist:

pg_dump -U USERDATABASE DATABASENAME > /home/my_user/sql/mybackup.sql 

Und ich schaffte die .pgpass Datei im Home-Verzeichnis um das Backup ohne Benutzer und Passwort zu ermöglichen

localhost:5432:DATABASENAME:USER:PASSWORD 

Sorry mein Englisch ist nicht gut!

Verwandte Themen