pg_maint PostgreSQL Backup Script
A nightly backup and maintenance script for PostgreSQL servers.
Copyright © 2007 by Daniel G. Delaney, Fluid Mind Software
This script is free and open source. You may copy and modify it in any
way you wish as long as you keep the copyright information at the top of the script.
This is a fairly simple script that reads the list of databases in your
PostgreSQL instance, and runs pg_dump for them, placing the output files
into separate folders in the backup directory and naming each file with
the database name and the date of backup. It then deletes all backup
files older than the specified number of days and finally runs vacuumdb
to clean the old crud out of the tables. Optionally, it can also rsync
the entire backup directory to another server.
Installation and Usage
NOTE: DO NOT RUN THIS SCRIPT AS ROOT! It is not designed to
run as root and could be very dangerous. This script is designed
to be run by the postgres user.
- Download the perl script either as a text file or
as a gzipped file (you might have to
right-click those links and choose "Save as"). Place this script anywhere on
your server, it doesn't have to be in a directory in the PATH. You might be
/usr/local/sbin, or possibly in a "bin" directory in the postgres user's
home directory. Just make sure the postgres user has access to execute it.
-
Create a directory where backups will be stored. Set the owner and group
to the user that your postmaster daemon runs under (usually 'postgres').
Set it's permissions to 2770. For example:
mkdir /data/backup/hostname/pgsql
chown postgres:postgres /data/backup/hostname/pgsql
chmod 2770 /data/backup/hostname/pgsql
-
Edit the options in the OPTIONS area at the beginning of the script. Options include:
- $backupDir – The Directory where backup files should be stored. Could be
something like '/data/backup/pgsql'
- $vacuum – How often to VACUUM all databases at the end of the backup,
'' for none, 'D' for daily, 'W' for weekly, 'M' for monthly
- $remote – You can optionally have this script use rsync through SSH to
copy your backup files to a remote location. Specify the location the way
you would with the rsync command. For example:
'postgres@example.com:/data/backup/hostname/pgsql'.
- $daysToKeep – How many days to keep old backup files. The script will automatically
remove backup files older than this number of days.
- $excluded – List of databases NOT to backup. Note the format of this list,
it is exacly what goes in an SQL "IN" predicate. The default is "'template0','template1'".
-
To run the script every night at 1:00 AM, just login as root, type
'su - postgres' to become the postres user, type 'crontab -e' and add
the following line to the file (using your path to the script):
0 1 * * * /usr/local/sbin/pg_maint
- To rsync files to a remote server, the postgres user will have to have
an SSH key (type 'ssh-keygen -t rsa' as the postgres user to generate one)
and the public key will have to be placed into the "authorized_keys" file in
the home directory of the user you're logging in as on the remote server (in
that example, the "postgres" user). Just type "cat ~/.ssh/id_rsa.pub" and
copy the whole thing, then paste it into the ~/.ssh/authorized_keys file on
the remote server. (Note that sshd on some servers defaults to not using the
authorized_keys file. In the /etc/ssh/sshd_config file on the remote server,
the following options will need to be uncommented: RSAAuthentication,
PubkeyAuthentication, AuthorizedKeysFile.)