peshka.org – WP site

peshka.org – WP site

peshka's reminder site – ver. 2.0

peshka.org – WP site RSS Feed
 
 
 
 

PostgreSLQ – PITR backup

1. Пускане на WAL архивиране:

- в postgres.conf се добавя:
## пускане на копирането на WAL файловете
archive_mode = on

## команда за архивирането която ги изпраща в директорията на отдалечения сървър и им променя  потребителя
archive_command = ‘test ! -f /tmp/pg_backup_in_progress && scp %p <remote user>@<rem serv IP>:<remote dir for WALs>/WALs/%f && ssh <remote user>@<rem serv IP> chown postgres <remote dir for WALs>/WALs/* </dev/null’

## през колко минути да се въртят ако не се напълни 16MB файл
archive_timeout = 60min

(след archive_mode = on трябва restart – за другите reload)

2. Скрипт за същинското бекъпване:

- примерен скрипт:

#!/bin/bash
opt=$1
## данни за връзката с сървъра за бекъп и за локалната директория на постгрес-а
 DATA="<postgres data dir>"
 RemDir="<remote dir for backup>"
 RemSrv="192.168.0.100" ## примерен бекъп сървър
 RemUsr="root"          ## примерен потребител
## команда за копиране (синхронизиране) на фаиловете
 if [ "$opt" = "debug" ]
 then
    Comm="/usr/bin/rsync -av --delete --exclude pg_xlog/ --exclude pg_log/"
    archlog=" "
 else
    Comm="/usr/bin/rsync -a --delete --exclude pg_xlog/ --exclude pg_log/"
    archlog=" > /dev/null"
 fi
## при създаването на този файл спират да се копират WAL архивите от т.1 както е зададено от archive_command
 touch /tmp/pg_backup_in_progress
## за стартиране на бекъпа е пуска функцията pg_start_backup()
 ## в постгрес сървъра независимо от коя база за да могат успешно
 ## да се копират файловете на базата
 if [ "$opt" = "debug" ] ; then echo "$(date +%Y-%h-%d_%H.%M.%S) - start backup function on database" ; fi
 label="hot_backup-$(date +%Y-%h-%d_%H.%M.%S)"
 psql -U postgres postgres -c "select pg_start_backup('$label');"
## Преместваме директорията на WAL архивите в нов директория със съответната дата и
 ## се създава директорията отново. Операциите се извършват на отдалечения сървър
 ssh $RemSrv mv $RemDir/WALs $RemDir/WALs-$(date +%Y-%h-%d_%H.%M.%S)
 ssh $RemSrv mkdir $RemDir/WALs
## Същинската операция по копиране - използва се rsync за да се пести време ама може и друго
 if [ "$opt" = "debug" ] ; then echo "$(date +%Y-%h-%d_%H.%M.%S) - START rsync on DATA dir" ; fi
 $Comm $DATA $RemUsr@$RemSrv:$RemDir/data/
## спиране на бекъпа и визстановяване на нормалното действие на базата с функцията pg_stop_backup()
  ## пак няма значение към коя база се пуска
 if [ "$opt" = "debug" ] ; then echo "$(date +%Y-%h-%d_%H.%M.%S) - stop backup function in database" ; fi
 psql -U postgres postgres -c "select pg_stop_backup();"
## изтриване на временния файл за да може отново да се копират WAL архивите
 rm /tmp/pg_backup_in_progress
## изчистване и подготовка на отдалечената директория за възстановяване
 ssh $RemSrv mkdir -p $RemDir/data/pg_xlog/archive_status
 ssh $RemSrv chown -R postgres $RemDir/data/pg_xlog/
 ssh $RemSrv rm -f $RemDir/data/pg_xlog/archive_status/* $RemDir/data/pg_xlog/00* $RemDir/data/pg_log/*

- забележете, че се подразбира че има нагласена автоматична оторизация на съответния потребител с, който ще се
пуска скрипта и, че този потребител има права да пише в отдалечената папка

- след като се подготви скирипта се слага в някъде на системата (/usr/scripts/backup_the_postgresql.bash) и се тества

3. Периодично пускане на скрипта:

- просто се слага в cron-a за подходящо време
( 1 1 * * * /usr/scripts/backup_the_postgresql.bash debug 1> /var/log/pg_wal_backup.log 2>&1 )

4. Възстановяване:

- Вариант 1 (възстановяване на всички възможни транзакции):

  • от горните точки се вижда, че при евентуално прецакване на базата данни ние оставаме с следните 2 неща:
    папката с данни и конфигурации на постгрес
    WAL архивите на транзакциите от момента на бекъпа до момента на прецакване
  • копираме папката с данни от бекъпа на мястото на старата (не преместване за да запазим и бекъпа все пак)
  • копитаме WAL архивните файлове във времменна папка /tmp/WAL
  • копираме WAL архивните файлове (пак същите) в папка pg_xlog
    (в папката трябва да няма други фаилове – само под-директорията archive_status)
  • създаваме фаила recovery.conf в папката с данни – в него минимум трябва да има следния ред
    ( recovery_command = ‘cp /tmp/WAL/%f %p’)
  • папката с данни и всизки WAL файлове трябва да са притежание на потребителя на постгрес демона
    за да могат да се прочетат при стартирането
  • стартиране на базата данни – ако всичко е наред при стартирането ще се прочетат всички транзакции от WAL фаиловете и ще се приложат на бекъпа за да се постигне същото състояние на базата данни както в момента на краша. След успешно стартиране файла recovery.conf ще бъде преименуван на recovery.done. Файла backup_label също ще бъде преименуван.
  • ако има проблеми разгледайте логовете в pg_log

- Вариант 2 (възстановяване на състоянието в момента на пускането на бекъпа):

  • копираме папката с данни от бекъпа на мястото на старата (не преместване за да запазим и бекъпа все пак)
  • премахва се файла с име backup_label от директорията
  • копитаме от WAL архивираните файлове този с разширение .backup.  в директория pg_xlog/ и го преглеждаме за да видим кои е началния и крайния файл на архива ( редовете с тази информация започват съответно с START WAL и STOP WAL)
  • копираме от WAL архивираните файлове от началния до крайния файл описани в .backup файла пак в директория pg_xlog/
  • стартираме базата и изчакваме малко за да се прочетат WAL архивите и това е …

5. Това е от мен – за повече информация ето тук:

http://www.postgresql.org/docs/8.3/static/continuous-archiving.html