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.