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.
