2009-05-12 13 views
11

posso eseguire comandi come vacuumdb, pg_dump e psql bene in uno script se li prefazione in questo modo:Come faccio a eseguire il backup del mio database PostgreSQL con Cron?

/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 

Esse funzionano a riga di comando su Redhat quando sono sudo per radicare e poi come si vede nei comandi sopra faccio un sudo -u to postgres.

Ma quando provo a calci fuori questo da cron, ottengo zero byte in tutti i file - il che significa che non è stata eseguita correttamente. E non ho idea dei registri che posso vedere.

mio file/etc/crontab ha questa voce in fondo

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

E sì, /etc/db_backup.cron è chmod ug + x, di proprietà di root, e la parte superiore del file dice " #!/bin/bash "(meno le doppie quotazioni).

Qualcuno sa cosa dà?

+0

almeno su redhat, i simboli% devono essere sottoposti a escape. non sfuggirle comporterà che cron cercherà di eseguire il comando solo fino alla%. Vedi - http://fahdshariff.blogspot.com/2009/05/percent-sign-in-crontab.html – chrismarx

risposta

9

Dal momento che ti sembra di avere privilegi di supervisore in ogni caso, si potrebbe mettere i comandi in crontab dell'utente postgres in questo modo:

sudo su postgres 
crontab -e 

e poi mettere la pg_dump/vacuumdb comandi lì.

+1

Questo è quello che alla fine ho finito e ha funzionato bene solo quando ho fatto chown postgres.root/opt/postgresql (dove stavano andando i file). – Volomike

+7

"sudo su postgres" "È pazzesco! Prova '' sudo -u postgres ''. Imposta una specifica sudo, è molto più sicuro. –

+0

Non è possibile accedere a (postgres) (crontab) a causa della configurazione di pam. –

4

Le variabili di ambiente potrebbero non essere impostate in cron.

nella sessione normale, probabilmente hanno definito queste variabili:

PG_PORT 
PG_HOST 
PG_DATABASE 
PG_USERNAME 
PG_PASSWORD 

Aggiungi un "env" in sceneggiatura yout.

+0

Ho bisogno di un po 'più di aiuto di quello che penso. Ho messo 'env' lì prima dei comandi e dopo #!/Bin/bash e tutto ciò che ha fatto è stato scaricare l'ambiente nel file di log (perché ora sto scaricando l'output in un file di log mentre viene eseguito). – Volomike

+0

Il modo per impostare queste variabili sarebbe 'export PG_PORT = 5432' ecc. – jhwist

+1

Queste non sono esattamente le variabili utilizzate da pg_dump e vacuumdb. Puoi vedere l'elenco completo qui: http://www.postgresql.org/docs/8.4/static/libpq-envars.html – liviucmg

11

Ho uno script bash dinamico che esegue il backup di tutti i database sul server. Ottiene un elenco di tutti i database e quindi evita ogni DB prima di eseguire un backup. Tutti i registri sono scritti su un file e quindi il registro viene inviato per email. Questo è qualcosa che potresti usare se vuoi.

Copia il codice seguente in un file e aggiungi il file al tuo crontab. Ho impostato il mio pg_hba.conf in modo che consideri affidabili le connessioni locali.

#!/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

È possibile aggiungere "--analyze" al comando/usr/bin/vacuumdb per eseguire anche un'analisi. –

+5

Ecco un altro buon script: http://wiki.postgresql.org/wiki/Automated_Backup_on_Linux –

+2

@Imraan Parker come si fa a saltare usando la password? Voglio fare il backup come account amministratore del database, non come utente root, come posso farlo? –

1

probabilmente hai l'autenticazione "ident" nel tuo pg_hba.conf per l'utente postgres. L'opzione "-u postgres" fallisce quando questo è il caso. cambia utente a postgres nello script di backup o configura un metodo di autenticazione diverso.

0

Anziché il seguente comando: database = 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'}

È possibile utilizzare di seguito: database = psql -t -c "select datname from pg_database where datname not like 'template%';" | grep -v '^$'

Il primo ritorno '|' per i database dei modelli e una riga vuota.

Il secondo è più pulito.

0

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

0

Un'altra versione per ottenere l'elenco dei database:
psql -lqt | grep -vE '^ +(template[0-9]+|postgres)? *\|' | cut -d'|' -f1| sed -e 's/ //g' -e '/^$/d'

Come il mio psql -lqt output è:

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

ho impostato il mio cron in questo modo. Ogni 59 minuti dal lunedi al venerdì

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

Lo script per eseguire il backup è all'interno back_my_bd.sh file e il contenuto è:

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

e ho creato il file .pgpass all'interno home directory per consentire il backup senza specificare l'utente e la password

localhost:5432:DATABASENAME:USER:PASSWORD 

Scusate il mio inglese non è buono!

Problemi correlati