PostgreSQL - Folyamatos archiválás

A RoolWikiBÓL

(Változatok közti eltérés)
2007. szeptember 18., 14:55 változat (szerkesztés)
212.40.118.115 (Vita)

← Előző változtatások
2007. október 9., 17:24 változat (szerkesztés) (undo)
212.40.118.115 (Vita)

Következő változtatások →
64. sor: 64. sor:
Ekkor nem lesz folytonos a mentés. Induláskor amíg talál wal szegmenst, addig azokat betölti, de ezután leáll a visszaállító mód. Ezután hiába jönnek létre a fő szerveren wal szegmensek, azok nem kerülnek át a biztonsági szerverre. A "restore commnad" minden wal szegmensre ki lesz adva, ha az nincs a pg_xlog mappában. Ha egy olyan parancsot írunk ide (lehet egy szkript is), ami addig vár, amíg elérhető nem lesz a következő szegmens, majd végrehajtja a másolást, akkor elérhető a folyamatos mentés. Ezzel magyarázható az is, hogy a biztonsági adatbázis nem használható lekérdezésre. Ekkor nem lesz folytonos a mentés. Induláskor amíg talál wal szegmenst, addig azokat betölti, de ezután leáll a visszaállító mód. Ezután hiába jönnek létre a fő szerveren wal szegmensek, azok nem kerülnek át a biztonsági szerverre. A "restore commnad" minden wal szegmensre ki lesz adva, ha az nincs a pg_xlog mappában. Ha egy olyan parancsot írunk ide (lehet egy szkript is), ami addig vár, amíg elérhető nem lesz a következő szegmens, majd végrehajtja a másolást, akkor elérhető a folyamatos mentés. Ezzel magyarázható az is, hogy a biztonsági adatbázis nem használható lekérdezésre.
 +
 +=== A folytonos archiválást biztosító program ===
 +
 + #!/bin/bash
 + <br>
 + SOURCE=$1
 + TARGET=$2
 + OK=0
 + LOGFILE=masol.txt
 + <br>
 + SIZE_EXPECTED=16777216 #bytes 16 MB
 + <br>
 + echo >> $LOGFILE
 + echo $SOURCE >> $LOGFILE
 + COUNTER=0
 + WRONG_SIZE_COUNTER=0
 + <br>
 + if [ $SOURCE == "00000001.history" ]
 + then
 + exit 1
 + fi
 + <br>
 + while [ 1 ]
 + do
 + echo `date` Copy $SOURCE to $TARGET >> $LOGFILE
 + scp 192.168.1.13:/home/postgres/wal_ahead_log_8.2.3/$SOURCE $TARGET
 + RET=$?
 + echo Copy returns $RET >> $LOGFILE
 + if [ "$RET" -ne "0" ]
 + then
 + ((COUNTER++))
 + echo $COUNTER. returns $RET >> $LOGFILE
 + if [ $COUNTER -gt 10 ]
 + then
 + exit 1
 + fi
 + echo sleep 10 minutes >> $LOGFILE
 + sleep 10m
 + else
 + if [ -f $TARGET ]
 + then
 + TARGET_SIZE=$(stat -c '%s' ${TARGET})
 + else
 + TARGET_SIZE=-1
 + fi
 + echo target size is $TARGET_SIZE >> $LOGFILE
 + if [ $TARGET_SIZE -eq $SIZE_EXPECTED ]
 + then
 + echo done. >> $LOGFILE
 + exit 0
 + else
 + ((WRONG_SIZE_COUNTER++))
 + echo $WRONG_SIZE_COUNTER. wrong size: $TARGET_SIZE >> $LOGFILE
 + if [ $WRONG_SIZE_COUNTER -gt 1 ]
 + then
 + exit 0
 + fi
 + echo sleep 1 minute >> $LOGFILE
 + sleep 1m
 + fi
 + fi
 + done
 + <br>
 + echo "HIBA" >> $LOGFILE
 +
 +=== Az archiválás leállítása ===
 +
 +<small>fejlesztés alatt<small>

2007. október 9., 17:24 változat

Ez a folyamatos archiválás teszt és dokumentáció a 23.3. Continuous Archiving and Point-In-Time Recovery (PITR) és a [1] postgresql dokumentáció alapján készült.

A cél egy másik számítógépre duplikálni a fő adatbázist, úgy hogy folyamatosan - a lehető leginkább - naprakész legyen. Ha a fő rendszer bármilyen hiba miatt működésképtelenné válik, akkor ez a biztonsági léphet a helyébe. A biztonsági adatbázis nem hozzáférhető ebben az üzemmódban. A használatba állításához le kell állítani a folytonos mentés funkcióját.


Tartalomjegyzék

Engedélyezzük a WAL log archiválást

A postgresql.conf fájlban az archive_command változónak kell értéket adni. pl:

archive_command = '
  echo %f >> /home/postgres/wal_ahead_log_8.2.3/date 
  && date >> /home/postgres/wal_ahead_log_8.2.3/date 
  && test ! -f /home/postgres/wal_ahead_log_8.2.3/%f 
  && echo copy >> /home/postgres/wal_ahead_log_8.2.3/date 
  && cp %p /home/postgres/wal_ahead_log_8.2.3/%f
'

(egy sorba kell írni a parancsot!) Elő lehet írni, hogy ha egy megadott időn belül nem készül wal log fájl, akkor készítse el:

archive_timeout = 1h

A wal_ahead_log_8.2.3 mappában összegyűlt fájlokat majd egy másik hoszton működő szerver fogja magához másolni, amikor szüksége van rá. Ezt az scp paranccsal teszi. Mivel a másolás a háttérben történik, be kell állítani, hogy az scp ne kérjen jelszót.

Újra kell olvastatni a postgresql-el a konfigurációs fájlokat.

/etc/init.d/postgresql8.2.3 reload

Készíteni kell egy alap mentést

  • Működjön a wal logok archiválása!
  • Be kell lépni a backup módba.
select pg_start_backup('label');
  • Fájlrendszer szintű mentést kell készíteni
 tar cjf data_wal_start.tbz2 data
  • backup mód vége
 select pg_stop_backup();

Befejezi a backup módot. Kiírja az utolsó wal szegmens számát. Eddig felhasználva a wal szegmenseket (azaz log fájlokat) a stop backuppal azonos állapotú adatbázis jön majd létre.

Létrehozzuk a backup adatbázist

  • PostgreSQL telepítése a backup gépre. (Ugyanaz a verzió legyen mint a forrás rendszeren!)
  • A data_wal_start.tbz2 kicsomagolása
    • Töröljük a pg_log, pg_xlog tartalmát
    • Töröljük a serverlog, postgresql.pid fájlt!
    • Szerkesszük át a postgresql.conf fáljt: ne legyen bekapcsolva a wal archiválás!
archive_command = <két egymást követő aposztróf>
archive_timeout = 0
  • A data mappában létre kell hozni egy recovery.conf állományt. Ez tartalmazza a rendszer visszaállítást vezérlő paramétereket. Nekünk most a következő kell:
restore_command = 'scp 192.168.1.13:/home/postgres/wal_ahead_log_8.2.3/%f %p'
  • Indítsuk el a szervert!

Ekkor nem lesz folytonos a mentés. Induláskor amíg talál wal szegmenst, addig azokat betölti, de ezután leáll a visszaállító mód. Ezután hiába jönnek létre a fő szerveren wal szegmensek, azok nem kerülnek át a biztonsági szerverre. A "restore commnad" minden wal szegmensre ki lesz adva, ha az nincs a pg_xlog mappában. Ha egy olyan parancsot írunk ide (lehet egy szkript is), ami addig vár, amíg elérhető nem lesz a következő szegmens, majd végrehajtja a másolást, akkor elérhető a folyamatos mentés. Ezzel magyarázható az is, hogy a biztonsági adatbázis nem használható lekérdezésre.

A folytonos archiválást biztosító program

#!/bin/bash

SOURCE=$1 TARGET=$2 OK=0 LOGFILE=masol.txt
SIZE_EXPECTED=16777216 #bytes 16 MB
echo >> $LOGFILE echo $SOURCE >> $LOGFILE COUNTER=0 WRONG_SIZE_COUNTER=0
if [ $SOURCE == "00000001.history" ] then exit 1 fi
while [ 1 ] do echo `date` Copy $SOURCE to $TARGET >> $LOGFILE scp 192.168.1.13:/home/postgres/wal_ahead_log_8.2.3/$SOURCE $TARGET RET=$? echo Copy returns $RET >> $LOGFILE if [ "$RET" -ne "0" ] then ((COUNTER++)) echo $COUNTER. returns $RET >> $LOGFILE if [ $COUNTER -gt 10 ] then exit 1 fi echo sleep 10 minutes >> $LOGFILE sleep 10m else if [ -f $TARGET ] then TARGET_SIZE=$(stat -c '%s' ${TARGET}) else TARGET_SIZE=-1 fi echo target size is $TARGET_SIZE >> $LOGFILE if [ $TARGET_SIZE -eq $SIZE_EXPECTED ] then echo done. >> $LOGFILE exit 0 else ((WRONG_SIZE_COUNTER++)) echo $WRONG_SIZE_COUNTER. wrong size: $TARGET_SIZE >> $LOGFILE if [ $WRONG_SIZE_COUNTER -gt 1 ] then exit 0 fi echo sleep 1 minute >> $LOGFILE sleep 1m fi fi done
echo "HIBA" >> $LOGFILE

Az archiválás leállítása

fejlesztés alatt

Személyes eszközök