Backing up a postgres instance is rather straight forward. You can automate the backup or manual backup. I have documented either or below. If you have a better way please feel free to let me know.
Manual:
- pg_dump -h ##SERVERNAME## -p ##SERVERPORT## -U ##USER## -j 8 -c --if-exists -Fd -b -v -f ##FILENAME_W_PATH## ##DB_NAME## > ##OUTPUT_LOG## 2>&1
There are a variety of options you can choose from but the above is a standard I like to use.
- -Fc: This compresses the data and allows for restoring via pg_restore
- -Fd: This compresses the data to a directory structure for restoring via pg_restore
- -j 8: This runs 8 concurrent jobs.
- -N mySchema: This excludes the schema mySchema from being backed up.
- –if-exists: Used with -c
Automated:
You can also use PgAgent to do scheduled backups and I recommend this however I don’t have the steps yet. That will hopefully come shortly.
You should create a backup user for the automated version. Here is what the user should have.
- CREATE USER ##BACKUP_USER## WITH ENCRYPTED PASSWORD '##PASSWORD##';
- GRANT CONNECT ON DATABASE ##DATABASE NAME## TO ##BACKUP_USER##;
- GRANT USAGE ON SCHEMA public TO ##BACKUP_USER##;
- GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO ##BACKUP_USER##;
- GRANT SELECT ON ALL TABLES IN SCHEMA public TO ##BACKUP_USER##;
Whichever OS you are using there is a different way to set it up.
Windows:
- You need to create “pgpass.conf” file in “%APPDATA%\postgresql” directory.
- pgpass should contain connection information such as “hostname:port:database:username:password”
- You can then create a batch file to run pg_dump. Example of such a batch file below. You could also write a PS script which is the preferred direction to go.
- @echo off
- for /f "tokens=1-4 delims=/ " %%i in ("%date%") do (
- set day=%%i
- set month=%%j
- set year=%%k
- )
- for /f "tokens=1-4 delims=: " %%i in ("%time%") do (
- set hour=%%i
- set minute=%%j
- set second=%%k
- )
- set backupDir=\\NETWORK_SHARE\%month%_%day%_%year%
- set backupFile=DBName_%month%_%day%_%year%_%hour%_%minute%_%second%.backup
- if not exist %backupDir% (mkdir %backupDir%)
- C:\"Program Files"\PostgreSQL\9.4\bin\pg_dump.exe -h ##SERVERNAME## -p ##SERVERPORT## -U ##BACKUP_USER## -j 8 -c --if-exists -Fd -b -v -f %backupDir%\%backupFile% ##DB_NAME## > ##OUTPUT_LOG## 2>&1
Ubuntu:
You need to create the .pgpass file in the users home directory. It should contain information such as hostname:port:database:username:password. You will also need to modify the permissions to be owner read/write.
- touch .pgpass
- chmod 600 .pgpass
Next we need to set the crontab job. By entering “crontab -e”. You can call the backup.sh file on whatever schedule you want.
- #! /bin/sh
- currentDate=$(date +"%m_%d_%Y")
- currentDateTime=$currentDate$(date +"_%H_%M_%S")
- if [ ! -d ##NETWORK_SHARE##/##DB_NAME## ]
- then
- mkdir ##NETWORK_SHARE##/##DB_NAME##
- fi
- if [ ! -d ##NETWORK_SHARE##/##DB_NAME##/$currentDate ]
- then
- echo $currentDate
- mkdir ##NETWORK_SHARE##/##DB_NAME##/$currentDate
- fi
- pg_dump -h ##SERVERNAME## -p ##SERVERPORT## -U ##BACKUP_USER## -j 8 -c --if-exists -Fd -b -v -f ##NETWORK_SHARE##/##DB_NAME##/$currentDate/$currentDateTime.backup ##DB_NAME## > ##OUTPUT_LOG## 2>&1