仙台の山奥で自転車に乗ったり転んだり

愛車の GIOS でサイクリングしたりポタリングしたり、それをブログに記録してみたり。ロードバイクや自転車や坂のことを書いてみたり。ときたまプログラムのことを忘れないようにメモってみたり。

むりやり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"