むりやりPostgreSQL版も
↑で作成したバックアップのスクリプトを、無理やりPostgreSQL版にも移植してみた。
PostgreSQLサーバの接続可能なデータベース一覧からバックアップ対象のリストを取得する処理など、かなり強引で無理やりな感じになっちゃいました。
#!/bin/sh set -e set -u POSTGRESQLUSER="postgres" POSTGRESQLHOST="localhost" BACKUPDIR=/mnt/nfs-backup-datastore NFS_URI=backup:/var/nas/PostgreSQL SAVED_DAYS=10 TMPDIR=/tmp/postgresql-backup.$$ trap "exit 1" HUP INT PIPE QUIT TERM trap "rm -f ${TMPDIR}/*; rmdir ${TMPDIR}; rm -f ${BACKUPDIR}/lock" EXIT mkdir -p $TMPDIR SELFID=`id | sed -e 's/uid=//' -e 's/(.*//'` if [ $SELFID -ne 0 ]; then # failed ERRMSG="You are not root, You cannot execute this script." logger -t pgdump $ERRMSG echo $ERRMSG exit 100 fi if [ -f "${BACKUPDIR}/lock" ]; then # failed ERRMSG="Data directory to be backup is not empty!" logger -t pgdump $ERRMSG echo $ERRMSG exit 101 fi DATABASES=` psql \ --host=${POSTGRESQLHOST} \ --user=${POSTGRESQLUSER} \ --list \ --tuples-only \ --pset="format=unaligned" \ --pset="fieldsep=," \ | sed 's!^postgres=CTc/postgres$!!g' \ | cut --delimiter=',' --fields=1 \ | sed 's/^template[01]$//g' \ | sed '/^$/d' ` if [ $? -ne 0 ]; then # failed ERRMSG="Failed to listup the databases on the PostgreSQL server" logger -t pgdump $ERRMSG echo $ERRMSG exit 200 fi TODAY=`date +%Y%m%d` BACKUP=${TMPDIR}/all-databases.${TODAY}.dump.sql pg_dumpall \ --host=${POSTGRESQLHOST} \ --username=${POSTGRESQLUSER} \ > $BACKUP if [ $? -eq 0 ]; then logger -t pgdump "Successful in the preparation of the all databases backup" else ERRMSG="Failed in the preparation of the all databases backup" logger -t pgdump $ERRMSG echo $ERRMSG exit 201 fi for DBNAME in $DATABASES do BACKUP=${TMPDIR}/${DBNAME}.${TODAY}.dump.sql pg_dump \ --host=${POSTGRESQLHOST} \ --username=${POSTGRESQLUSER} \ --format=plain \ --create \ --inserts \ --column-inserts \ $DBNAME > $BACKUP if [ $? -eq 0 ]; then logger -t pgdump "Successful in the preparation of the database backup: ${DBNAME}" else # warning logger -t pgdump "Failed in the preparation of the database backup: ${DBNAME}" fi done if [ ! -d "${BACKUPDIR}/nas" ]; then mkdir -p ${BACKUPDIR}/nas fi (mount -t nfs -o rw ${NFS_URI} ${BACKUPDIR}/nas && touch ${BACKUPDIR}/lock) find ${BACKUPDIR}/nas -type f -mtime +${SAVED_DAYS} -print0 | xargs -0 rm -f mv ${TMPDIR}/*.${TODAY}.dump.sql ${BACKUPDIR}/nas/ (umount -t nfs ${BACKUPDIR}/nas && rmdir ${BACKUPDIR}/nas) (rm -f ${BACKUPDIR}/lock && rmdir $BACKUPDIR) logger -t pgdump "Backup of the database on PostgreSQL server was completed"