Windows altında Yedek Alma
Aşağıdaki kodları bir xxx.bat dosyası oluşturup bu dosyayı windows zamanlanmış görevlere istenilen sıklıkta çalıştırılması sağlayarak PostgreSQL içindeki*istediğimiz veri tabanını istenilen periyodda yedek almış oluruz.
@echo off
::bilgisayardaki tarih bilgisi alınıyor
set tarih=%date:~6,4%%date:~3,2%%date:~0,2%
::yilaygun_saatdakika formatina ceviriyor
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set saat=%%a%%b)
::dosya adı ve yedek alınacak hedef dizin burada belirtiliyor
set path=yedek_alinacak_dosya_yolu\yedek_dosya_adi_%tarih%_%saat%
::bilgi olması için ekrana dosya yolu ve dosya adı ekrana yazdırılıyor
echo %path%
:
ostgresql kurulu olduğu yerdeki bin dizini
:
g_dump yedek alma programı çalıştırıldığı için bu dizinde pg_dump.exe olmak zorunda yoksa yedek alma işlemi yapılamaz
cd C:\Program Files\PostgreSQL\9.5\bin*
echo on
::-Fc parametresi ile yedek alınıyor sebebi ise yedek dosyasını sıkıştırılmış olarak yedek almak için yapıldı.
::Yerden kazanç inanılmaz derecede boyut farkı oluşuyor.
::500-600 MB db yedeği sıkıştırma ile 50-70 MB arasında çıkıyor
pg_dump -h db_hostname_veya_ip -U yedek_alacak_kullanici_postgres_gibi -Fc yedek_veri_tabani_adi > %path%
::daha sonra bu batch dosyasını windows zamanlanmış görevlere ekleyerek istenilen periyodda yedek almış oluruz.
Linux(Ubuntu) Altında Yedek Alma
Aşağıdaki kodları bir xxx.sh dosyası oluşturup bu dosyayı linux sunucu içine home dizini altında istediğimiz bir*yere kayıt ediyoruz.*Zamanlanmış görevlere yani crontab içine*istenilen sıklıkta çalıştırılması sağlayarak PostgreSQL içindeki*istediğimiz veri tabanını istenilen periyodda yedek almış oluruz.
Bash file oluşturup crontab içinden bu dosyayı zamanlanmış olarak çağıracağız.
Aşağıdaki crontab örneği hergün akşam saat 22:00 da /home/Script/pg_dmp.sh dosyasını çalıştır parametre olarak*yedek alınacak veri tabanı adını gönder.
00 22 * * * /home/Scripts/pg_dmp.sh yedek_alinacak_veri_tabani_adi
script dosyamızın içeriğide aşağıdadır.
Not: Script dosyası içindeki $HOME değişkeni ubuntu içindeki postgres kullanıcısı için tanımlı olan home*dizindir. Bu dizinde*/var/lib/postgresql/*gösteriyor. Yani alınan yedekler burada veri tabanı isimleri ile klasör oluşturulmuş şekilde dosyalar burada olacaktır.
#!/bin/sh
#PostgreSQL yedek alacak kullanıcı adı postgres
PGUSER=postgres
#Yukarıda belirtilen kullanıcının şifresi
PGPASSWORD=postgres_sifresi
export PGUSER PGPASSWORD
#Tarih formati yil-ay-gun seklinde olacak arada - isareti ile ayriliyor
tdate=`date +%Y-%m-%d`
###parametre verilmemişse veya birden fazla parametre varsa kullanımı yardım için konsol*ekranına yazdır.
if [ $# -lt 1 ] or [ $# -ge 2 ]
then
* echo "Eksik veya fazla parametre hatası"
**echo "-----------------------------------"
* echo "KULLANIMI : script_dosya_adi.sh "
* echo "-----------------------------------"
* exit 1
else
**###HOME dizini altında pg_backup_yedegi_alinacak_veritabani_adi seklinde klasor varsa if icine gir yoksa else den devam et
**if [ -d $HOME/pg_backup_$1 ]
**then
* **if [ -f $HOME/pg_backup_$1/$1_$tdate ]
* **then
* * **echo "Yedek dosyası daha önce alınmış mevcut dosya var."
* * * ###Ben işlem yapmadım ama isteğe bağlı bash script için kullanıcıdan onay alınabilir veya direkt yedek alınıp dosyanın üzerine yazma işlemini yapmış oluruz.
* **else
* * **###hedef dosya mevcut dizinde yok burada yedek al
* * **pg_dump -Fc $1 > $HOME/pg_backup_$1/$1_$tdate
* * fi
**else
* **###eksik dizini oluştur
* **mkdir $HOME/pg_backup_$1
* **###sonrasinda veri tabani yedegini al
* **pg_dump -Fc $1 > $HOME/pg_backup_$1/$1_$tdate
**fi
fi
#kullanıcı adı ve şifre değişkenlerinin içini temizle*PGUSER and PGPASSWORD
PGUSER=""
PGPASSWORD=""
export PGUSER PGPASSWORD
###script sonu
Ayrıca alınan yedeği geri yükleme işlemi aşağıdaki komut ile yapılıyor.
pg_restore -h "host_name_or_ip" -U "geri_yukleme_islemini_yapacak_kullanici_adi" -d*"daha_once_olusturulmus_veri_tabani_adi" "yedek_dizin_dosya_adi_tamami"
Bu komuttan sonra kullanıcı için şifre soracaktır. Windows için geri yükleme yapılacaksa bu işlemi CMD komut satırında yönetici olarak yapın veya ubuntu linux içinde consol içinde bu komut çalıştırılmalı.
Aşağıdaki kodları bir xxx.bat dosyası oluşturup bu dosyayı windows zamanlanmış görevlere istenilen sıklıkta çalıştırılması sağlayarak PostgreSQL içindeki*istediğimiz veri tabanını istenilen periyodda yedek almış oluruz.
@echo off
::bilgisayardaki tarih bilgisi alınıyor
set tarih=%date:~6,4%%date:~3,2%%date:~0,2%
::yilaygun_saatdakika formatina ceviriyor
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set saat=%%a%%b)
::dosya adı ve yedek alınacak hedef dizin burada belirtiliyor
set path=yedek_alinacak_dosya_yolu\yedek_dosya_adi_%tarih%_%saat%
::bilgi olması için ekrana dosya yolu ve dosya adı ekrana yazdırılıyor
echo %path%
:
:
cd C:\Program Files\PostgreSQL\9.5\bin*
echo on
::-Fc parametresi ile yedek alınıyor sebebi ise yedek dosyasını sıkıştırılmış olarak yedek almak için yapıldı.
::Yerden kazanç inanılmaz derecede boyut farkı oluşuyor.
::500-600 MB db yedeği sıkıştırma ile 50-70 MB arasında çıkıyor
pg_dump -h db_hostname_veya_ip -U yedek_alacak_kullanici_postgres_gibi -Fc yedek_veri_tabani_adi > %path%
::daha sonra bu batch dosyasını windows zamanlanmış görevlere ekleyerek istenilen periyodda yedek almış oluruz.
Linux(Ubuntu) Altında Yedek Alma
Aşağıdaki kodları bir xxx.sh dosyası oluşturup bu dosyayı linux sunucu içine home dizini altında istediğimiz bir*yere kayıt ediyoruz.*Zamanlanmış görevlere yani crontab içine*istenilen sıklıkta çalıştırılması sağlayarak PostgreSQL içindeki*istediğimiz veri tabanını istenilen periyodda yedek almış oluruz.
Bash file oluşturup crontab içinden bu dosyayı zamanlanmış olarak çağıracağız.
Aşağıdaki crontab örneği hergün akşam saat 22:00 da /home/Script/pg_dmp.sh dosyasını çalıştır parametre olarak*yedek alınacak veri tabanı adını gönder.
00 22 * * * /home/Scripts/pg_dmp.sh yedek_alinacak_veri_tabani_adi
script dosyamızın içeriğide aşağıdadır.
Not: Script dosyası içindeki $HOME değişkeni ubuntu içindeki postgres kullanıcısı için tanımlı olan home*dizindir. Bu dizinde*/var/lib/postgresql/*gösteriyor. Yani alınan yedekler burada veri tabanı isimleri ile klasör oluşturulmuş şekilde dosyalar burada olacaktır.
#!/bin/sh
#PostgreSQL yedek alacak kullanıcı adı postgres
PGUSER=postgres
#Yukarıda belirtilen kullanıcının şifresi
PGPASSWORD=postgres_sifresi
export PGUSER PGPASSWORD
#Tarih formati yil-ay-gun seklinde olacak arada - isareti ile ayriliyor
tdate=`date +%Y-%m-%d`
###parametre verilmemişse veya birden fazla parametre varsa kullanımı yardım için konsol*ekranına yazdır.
if [ $# -lt 1 ] or [ $# -ge 2 ]
then
* echo "Eksik veya fazla parametre hatası"
**echo "-----------------------------------"
* echo "KULLANIMI : script_dosya_adi.sh "
* echo "-----------------------------------"
* exit 1
else
**###HOME dizini altında pg_backup_yedegi_alinacak_veritabani_adi seklinde klasor varsa if icine gir yoksa else den devam et
**if [ -d $HOME/pg_backup_$1 ]
**then
* **if [ -f $HOME/pg_backup_$1/$1_$tdate ]
* **then
* * **echo "Yedek dosyası daha önce alınmış mevcut dosya var."
* * * ###Ben işlem yapmadım ama isteğe bağlı bash script için kullanıcıdan onay alınabilir veya direkt yedek alınıp dosyanın üzerine yazma işlemini yapmış oluruz.
* **else
* * **###hedef dosya mevcut dizinde yok burada yedek al
* * **pg_dump -Fc $1 > $HOME/pg_backup_$1/$1_$tdate
* * fi
**else
* **###eksik dizini oluştur
* **mkdir $HOME/pg_backup_$1
* **###sonrasinda veri tabani yedegini al
* **pg_dump -Fc $1 > $HOME/pg_backup_$1/$1_$tdate
**fi
fi
#kullanıcı adı ve şifre değişkenlerinin içini temizle*PGUSER and PGPASSWORD
PGUSER=""
PGPASSWORD=""
export PGUSER PGPASSWORD
###script sonu
Ayrıca alınan yedeği geri yükleme işlemi aşağıdaki komut ile yapılıyor.
pg_restore -h "host_name_or_ip" -U "geri_yukleme_islemini_yapacak_kullanici_adi" -d*"daha_once_olusturulmus_veri_tabani_adi" "yedek_dizin_dosya_adi_tamami"
Bu komuttan sonra kullanıcı için şifre soracaktır. Windows için geri yükleme yapılacaksa bu işlemi CMD komut satırında yönetici olarak yapın veya ubuntu linux içinde consol içinde bu komut çalıştırılmalı.