понедельник, 14 октября 2019 г.

pg_probackup восстановление одной базы

Запуск Ubuntu server 16.04.5 PostgreSQL, версия 10.3-3.1C без systemctl start postgresql.service
Документация pg_probackup
Стенд pg 9.6.15 pg_probackup


Начиная с pg_probackup 2.2.3
 
$ sudo -u postgres pg_probackup-9.6 version
pg_probackup-9.6 2.2.3 (PostgreSQL 9.6.15)


$ sudo su postgres -c "psql -c \"select pg_size_pretty( pg_database_size('demo'))\""

pg_size_pretty
----------------
 3461 MB
(1 строка)
$ time sudo su postgres -c "pg_dump -Fc demo"  > ~/demo.dump

Создадим несколько баз:
$ sudo su postgres -c "createdb --username postgres -T template0 demo1"
$ sudo su postgres -c "createdb --username postgres -T template0 demo2"
$ sudo su postgres -c "createdb --username postgres -T template0 demo3"
$ sudo su postgres -c "createdb --username postgres -T template0 demo4"
$ sudo su postgres -c "createdb --username postgres -T template0 demo5"

Восстановим указав резервную копию
$ time sudo su postgres -c "pg_restore -d demo1 -j 4 /home/user/demo.dump"
$ time sudo su postgres -c "pg_restore -d demo2 -j 4 /home/user/demo.dump"
$ time sudo su postgres -c "pg_restore -d demo3 -j 4 /home/user/demo.dump"
$ time sudo su postgres -c "pg_restore -d demo4 -j 4 /home/user/demo.dump"
$ time sudo su postgres -c "pg_restore -d demo5 -j 4 /home/user/demo.dump"

$ sudo su postgres -c "psql -c \"SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;\""

   datname  |  size
-----------+---------
 postgres  | 7079 kB
 demo      | 3461 MB
 template1 | 7079 kB
 template0 | 6969 kB
 demo1     | 3425 MB
 demo2     | 3425 MB
 demo3     | 3425 MB
 demo4     | 3426 MB
 demo5     | 3426 MB
(9 строк)

$ time sudo -u postgres pg_probackup-9.6 backup -B /backup --instance main -b FULL --stream --compress --delete-wal --expired -j4

$ sudo -u postgres pg_probackup-9.6 show -B /backup
ID PZGX6Z

Создание дополнительного кластера
$ pg_lsclusters
#$ sudo pg_dropcluster --stop 9.6 beta
$ sudo pg_createcluster --locale ru_RU.UTF-8 9.6 beta --  --data-checksums

Creating new cluster 9.6/beta ...
  config /etc/postgresql/9.6/beta
  data   /var/lib/postgresql/9.6/beta
  locale ru_RU.UTF-8
  socket /var/run/postgresql
  port   5433


Удалим данные кластера beta
$ sudo /bin/su postgres -c "rm -rf /var/lib/postgresql/9.6/beta/*"

Для восстановления базы demo5 добавляем восстановление базы postgres (для простоты подключения)

$ time sudo -u postgres pg_probackup-9.6 restore -B /backup --instance main -D /var/lib/postgresql/9.6/beta -i PZGX6Z -j4 --db-include=demo5 --db-include=postgres

или если восстанавливаем кластер целиком:

$ time sudo -u postgres pg_probackup-9.6 restore -B /backup --instance main -D /var/lib/postgresql/9.6/beta -i PZGX6Z -j4


$ sudo du -h -s /var/lib/postgresql/9.6/main/base
21G     /var/lib/postgresql/9.6/main/base

$ sudo du -h -s /var/lib/postgresql/9.6/beta/base
3,4G    /var/lib/postgresql/9.6/beta/base

Нужно стартануть кластер, хоть он и не запустится
$ sudo pg_ctlcluster 9.6 beta start
#$ sudo sudo systemctl status postgresql@9.6-beta.service 

Для восстановления запустить так:
$ sudo su postgres -c "/usr/lib/postgresql/9.6/bin/pg_ctl start  -w -D /var/lib/postgresql/9.6/beta  -o '-c config_file=/etc/postgresql/9.6/beta/postgresql.conf'"

Если восстанавливаем кластер целиком ниже красным не делаем.
В другом окне (ssh):
   
$ sudo su postgres -c 'psql -p 5433 -c "\l+"'
$ sudo su postgres -c 'psql -p 5433 -l'


$ sudo su postgres -c 'psql -p 5433 -c "DROP DATABASE demo;"'
$ sudo su postgres -c 'psql -p 5433 -c "DROP DATABASE demo1;"'
$ sudo su postgres -c 'psql -p 5433 -c "DROP DATABASE demo2;"'
$ sudo su postgres -c 'psql -p 5433 -c "DROP DATABASE demo3;"'
$ sudo su postgres -c 'psql -p 5433 -c "DROP DATABASE demo4;"'

Остановить:
$ sudo su postgres -c "/usr/lib/postgresql/9.6/bin/pg_ctl stop  -w -D /var/lib/postgresql/9.6/beta  -o '-c config_file=/etc/postgresql/9.6/beta/postgresql.conf'"

После этого будет работать штатный режим:
$ sudo pg_ctlcluster 9.6 beta start

$ sudo sudo systemctl status postgresql@9.6-beta.service
 






  $ time sudo su postgres -c "pg_dump -p 5433 -Fc demo5"  > ~/demo5_5433.dump

Мержевание:

$ time sudo -u postgres pg_probackup-9.6 backup -B /backup --instance main -b FULL --stream --compress --delete-wal --expired -j4

$ time sudo su postgres -c "pg_dump -Fc demo"  > ~/demo.dump

$ sudo su postgres -c "createdb --username postgres -T template0 demo6"

$ time sudo su postgres -c "pg_restore -d demo6 -j 4 /home/user/demo.dump"

$ time sudo -u postgres pg_probackup-9.6 backup -B /backup --instance main -b DELTA --stream --compress --delete-wal --expired -j4

 $ time sudo -u postgres pg_probackup-9.6 backup -B /backup --instance main -b DELTA --stream --compress --delete-wal --expired -j4

$ sudo -u postgres pg_probackup-9.6 show -B /backup



ID PZH4E6

$ time sudo -u postgres pg_probackup-9.6 merge -B /backup --instance main -i PZH4E6 -j 4
$ sudo -u postgres pg_probackup-9.6 show -B /backup



Создание дополнительного кластера
$ pg_lsclusters
$ sudo pg_dropcluster --stop 9.6 beta
$ sudo pg_createcluster --locale ru_RU.UTF-8 9.6 beta --  --data-checksums

Creating new cluster 9.6/beta ...
  config /etc/postgresql/9.6/beta
  data   /var/lib/postgresql/9.6/beta
  locale ru_RU.UTF-8
  socket /var/run/postgresql
  port   5433


Удалим данные кластера beta
$ sudo /bin/su postgres -c "rm -rf /var/lib/postgresql/9.6/beta/*"

Для восстановления базы demo5 добавляем восстановление базы postgres (для простоты подключения)


$ time sudo -u postgres pg_probackup-9.6 restore -B /backup --instance main -D /var/lib/postgresql/9.6/beta -i PZH4E6 -j4


Нужно стартануть кластер, хоть он и не запустится
$ sudo pg_ctlcluster 9.6 beta start
#$ sudo sudo systemctl status postgresql@9.6-beta.service 

Для восстановления запустить так:
$ sudo su postgres -c "/usr/lib/postgresql/9.6/bin/pg_ctl start  -w -D /var/lib/postgresql/9.6/beta  -o '-c config_file=/etc/postgresql/9.6/beta/postgresql.conf'"

Остановить:
$ sudo su postgres -c "/usr/lib/postgresql/9.6/bin/pg_ctl stop  -w -D /var/lib/postgresql/9.6/beta  -o '-c config_file=/etc/postgresql/9.6/beta/postgresql.conf'"

После этого будет работать штатный режим:
$ sudo pg_ctlcluster 9.6 beta start

$ sudo sudo systemctl status postgresql@9.6-beta.service

$ time sudo su postgres -c "pg_dump -p 5433 -Fc demo6"  > ~/demo6_5433.dump




$ sudo nano /etc/postgresql/9.6/main/pg_hba.conf

Раскомментировать:

#host    replication     postgres        127.0.0.1/32            md5
host    replication     postgres        127.0.0.1/32            md5



Сохранить.

$ sudo pg_ctlcluster 9.6 main restart

$ sudo nano /root/backup.sh
#!/bin/sh -e
# Внимание задать пароль PGPASSWORD !!!
#/backup
inst='/backup'
cd $inst
#  /backup/pg_probackup
log=$inst'/log/pg_probackup.log'
log1=$inst'/log/probackup.log'
if [ -f $log ]; then rm $log; fi
cd $inst
sudo su postgres -c "PGPASSWORD=12345 pg_probackup-9.6 backup -B $inst --instance main \
    -U postgres -d postgres -h 127.0.0.1 -b FULL --stream --compress --expired --delete-wal \
    --log-level-file=info -j 4"
grep completed $log > /dev/null 2>&1
if [ $? -ne 0 ]
then
    msg="$inst неудачное завершение."
else
    msg="$inst удачное завершение."
fi
DATA=`date +"%Y-%m-%d %H:%M:%S"`
msg1="Размер экземпляра pg_probackup: $(du -h -s $inst/backups)"
sudo su postgres -c "echo '$DATA $msg' >> $log"
sudo su postgres -c "echo '$DATA $msg1' >> $log"
sudo su postgres -c "echo '==================================================================' >> $log"
sudo su postgres -c "cat $log >> $log1"
#cat $log  | mutt -s "pg_probackup" root
#echo "$DATA $msg" >> $log1
# Сразу архивируем для rsync
#COPY_DIR=$inst/copy
COPY_DIR=/backup/copy
#COPY_LOG=$inst/copy/copy.log
COPY_LOG=/backup/copy/copy.log
#Берем последнюю копию
COPY_ID=$(ls $inst/backups/main -1 | tail -1)
#Она должна быть completed
grep "$COPY_ID completed" $log > /dev/null 2>&1
if [ $? = 0 ]
then
    DATA=`date +"%Y-%m-%d_%H-%M-%S"`
    #rm  $inst/copy/*
    sudo su postgres -c "tar -cvzf $COPY_DIR/pg_pro-$DATA.tar.gz  \
           $inst/backups/main/$COPY_ID > /dev/null 2>&1"
    if [ $? = 0 ]
    then
        msg="создан $COPY_DIR/pg_pro-$DATA.tar.gz"
    else
        msg="ошибка создания $COPY_DIR/pg_pro-$DATA.tar.gz"
    fi
    DATA=`date +"%Y-%m-%d %H:%M:%S"`
    sudo su postgres -c "echo '$DATA $msg' >> $COPY_LOG"
    #echo "$DATA $msg" | mutt -s "copy pg_probackup" root
fi


$ sudo sh /root/backup.sh

$ sudo crontab -e

# m h  dom mon dow   command
45 11 * * * sh /root/backup.sh


Сохранить.

Проверка непрерывного архивирования

$ sudo -u postgres  psql -c " select * from pg_stat_archiver;"

Комментариев нет:

Отправить комментарий