PostgreSQL Saatlik Yedekleme Script’i

Projemizde birden fazla Postgresql veritabanı bulunmakta.  Hepsinde de anlık değişiklikler olabiliyor. Sistemsel olarak yedeklemeler mevcut fakat .SQL uzantılı yedeğimiz bulunmamakta. Çünkü bir tablo veya bir satır içerik / veri için tüm sistemi geri döndürmek oldukça mantıksız duruyor.

Daha öncesinde MYSQL için yapmış olduğum yedekleme BASH SCRIPT’ini POSTGRESQL için uyarladım ve çalışır hale getirdim. Database boyutu düşük olduğu için 24 saatlik yedekleme şuanda gayet uygun. Database boyutunu ve server disk kapasitesini düşünerekten geçmişe dönük yedekleri silmeyi unutmayın. Canınız yanar 🙂

#!/bin/bash

TIMESTAMP=$(date +"%F-%H") # Tarihi alıyoruz

DELTIME=$(date -d '24 hour ago' '+%F-%H') # Kaç saat önceki yedekler silinecek

BACKUP_DIR="/home/sql_backup/$TIMESTAMP"  #Yedekleme dizini

mkdir -p "$BACKUP_DIR/" # Yedekleme klasörü oluşturuyoruz

rm -r -f "/home/sql_backup/$DELTIME" # Belirlenen x Saat önceki yedekleri siliyoruz

# Database listesini alıyoruz.
databases=`echo "SELECT datname FROM pg_database;" | psql | tail -n +3 | head -n -2 | egrep -v 'template0|template1|postgres'`

for db in $databases; do

echo "##### Backup Alınan Database : $db\n\n"

mkdir -p "$BACKUP_DIR/$db/" # Backup dizini altında veritabanına ait klasör oluşturuyoruz

# Veritabanı içindeki tabloları çekiyoruz
tables=`echo "SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema NOT IN ('pg_catalog', 'information_schema');" | psql -d $db | tail -n +3 | head -n -2 | egrep -v 'template0|template1|postgres'`

for tb in $tables; do
echo "$db  -- >  $tb" # Backup alınan veritabanı içindeki tablo
pg_dump -d $db -t $tb > "$BACKUP_DIR/$db/$tb.sql"
done

echo "-----------------"

# Veritabanına bakım yapıyoruz.
echo "VACUUM -- >  $db"
vacuumdb -z $db > /dev/null 2>&1 

# Veritabanını komple yedekliyoruz.
echo "DUMP -- >    $db"
pg_dump -d $db > "$BACKUP_DIR/all_$db.sql" 
echo "-----------------"
done

Yukarıdaki Script’e ek olarak FTP komutları ekleyip yedekleri farklı lokasyona da aldırabilirsiniz. Bu Script aynı sunucu üzerinde yedekleme yapmaktadır. Aynı zamanda POSTGRESQL için kullanıcı bilgileri girilmedi. Local bir sistem olduğu için ROLE tanımları ANY / ANY  – ALLOW durumunda diyebilirim. Sizde ROLE tanımları yapıp yetkilendirme yapabilirsiniz.

Scripti CRON ile birlikte aşağıdakine benzer şekilde saatlik olarak çalıştırabilirsiniz.

57 * * * * sudo sh /home/backup.sh > /dev/null 2>&1

Script üzerinde aynı zamanda Tüm DATABASE DUMP edilmeden önce VACUUM edilerek optimize ediliyor. Veritabanınızın yapısı ve veriye göre VACUUM seçeneklerinizi düşünmenizi tavsiye ederim.

Bir Cevap Yazın