Obsah

PostgreSQL zalohovanie

Vytovaranie pravidelnych zaloch pre postgresql s rozdelenim na:

  1. tyzdenna zaloha
  2. denna zaloha
  3. hodinova zaloha

Pripravene pre spustanie pod uzivatelom postgresql s definovanim vsetkych databaz na servery, ktore je potrebne takto zalohovat.

cron

0 * * * *	/var/lib/postgresql/bin/pg_dump.sh > /tmp/pg_dump.sh.log 2>&1

pg_dump.sh

#!/bin/bash
# 22.11.2011

#vytvorenie zaloh databazy
#1) tyzdenna zaloha
#2) denna zaloha
#3) hodinova zaloha

date
echo "ZACIATOK"

#zoznam databaz
ZALOHUJ_DB="db1 db2 db3"

# nastavenia
DIR=/opt/pg_dump				#nastavenie zalozneho adresara
DIR1=$DIR/tyzdenna				#nastavenie adresara tyzdennych zaloh
DIR2=$DIR/denna					#nastavenie adresara dennych zaloh
DIR3=$DIR/hodinova				#nastavenie adresara hodinovych zaloh
DIR1_MAX=200					#maximalny pocet uchovavanych tyzdennych zaloch
DIR2_MAX=60					#maximalny pocet uchovavanych dennych zaloch
DIR3_MAX=48					#maximalny pocet uchovavanych hodinovych zaloch

##################
#vymazanie starych suborov nad maximalny pocet
function vymaz_subor()
{
	#vstup 1: adresar
	ADRESAR=$1
	#vstup 2: maximalny pocet
	MAX=$2

	echo "vymaz_subor($ADRESAR, $MAX)"

	#kontrola, ci existuje adresar
	if [ ! -d "$ADRESAR" ]; then
		echo "ERROR: nespravny vstup 1, neexistuje adrear - $ADRESAR"
		return 0
	fi

        echo "mazem z: $ADRESAR"

	#kontrola, ci je max vacsie ako 0
        if [[ $MAX -le 0 ]]; then
		echo "ERROR: nespravny vstup 2, maximalny pocet suborov - $MAX"
		return 0
	fi

	#ziskaj zoznam suborov
        POCET=`ls $ADRESAR/* | wc -l | sed -e 's/ //g'`

        echo "aktualny pocet: $POCET"

	#ak je pocet vacsi ako maximum
        if [[ $POCET -gt $MAX ]];
        then
		#vypocet, kolko suborov sa ma vymazat
        	VYMAZ=`expr $POCET - $MAX`

		echo "mazem pocet: $VYMAZ"

		#vytvorenie zoznamu suborov pre vymazanie
		SUBOR=`ls -tr $ADRESAR/* | head -$VYMAZ`

		#vymazanie suborov
	       	rm -f $SUBOR
        fi
}

#######################
#rozposielanie suborov
DAY=`date "+%u"`	#POZOR format 1-7
HOD=`date "+%H"`	#POZOR format 00-23

#tyzdenna zaloha
if [[ $DAY = 1 && $HOD = 00 ]] ; then
	echo "TYZDENNA ZALOHA"

	DIR=$DIR1
	DIR_MAX=$DIR1_MAX

#denna zaloha
else if [[ $HOD = 00 ]] ; then
	echo "DENNA ZALOHA"

	DIR=$DIR2
	DIR_MAX=$DIR2_MAX

#denna zaloha
else
	echo "HODINOVA ZALOHA"

	DIR=$DIR3
	DIR_MAX=$DIR3_MAX
fi fi

#kontrola, ci existuje adresar
if [ ! -d "$DIR" ]; then
	mkdir $DIR
fi

#######################
#prechadzaj jednotlive databazy
for DB in $ZALOHUJ_DB; do
	#vytvor nazov suboru
	SUBOR=$DB\_`date "+%y%m%d_%H%M"`.sql

	#kontrola, ci existuje adresar
	if [ ! -d "$DIR/$DB" ]; then
		mkdir $DIR/$DB
	fi

	#vytvorenie zalohy databazy
	echo "vytvaram zalohu: $SUBOR"
	pg_dump -O $DB > $DIR/$DB/$SUBOR

	#zozipuj zalohu
	gzip -r $DIR/$DB/*

	#odstranenie suborov nad pozadovany pocet zaloch
	vymaz_subor $DIR/$DB $DIR_MAX
done

echo "KONIEC"
date