воскресенье, 13 октября 2019 г.

Сравнение pg_dump в файл и в каталог

25.1. Выгрузка в SQL

$ sudo su postgres -c "psql -c \"select pg_size_pretty( pg_database_size('demo'))\""
 pg_size_pretty
----------------
 9195 MB
(1 строка)



$ time sudo su postgres -c "pg_dump -Fc demo"  > ~/demo.dump
real    6m5,898s
user    5m25,457s
sys     0m6,010s


$ sudo mkdir /pg_dump
$ sudo chown -R postgres:postgres /pg_dump
$ time sudo su postgres -c "pg_dump -j 4 -F d -f /pg_dump demo"

real    3m24,548s
user    5m18,820s
sys     0m8,760s


Удалить базу:
$ sudo -u postgres psql -c "DROP DATABASE demo;"
$ sudo su postgres -c "createdb --username postgres -T template0 demo"


Создадим несколько баз:
$ 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"

Восстановим указав резервную копию
$ time sudo su postgres -c "pg_restore -d demo1 /home/user/demo.dump"
real    42m55,742s
user    0m41,076s
sys     0m4,237s

$ time sudo su postgres -c "pg_restore -d  demo2 -j 4 /home/user/demo.dump"
real    21m50,954s
user    0m51,454s
sys     0m10,632s


$ time sudo su postgres -c "pg_restore -d demo3 -j 4   /pg_dump"

real    21m31,491s
user    0m49,814s
sys     0m8,429s


$ 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      | 9195 MB
 template1 | 7079 kB
 template0 | 6969 kB
 demo1     | 9186 MB
 demo2     | 9183 MB
 demo3     | 9182 MB
(7 строк)

$ nano backup_demo.sh

#!/bin/sh -e
#/backup
BASE=demo
#должна быть папка:
DIRPGDUMP=/backup/pg_dump
#должны быть права
#sudo chown -R postgres:postgres /backup
DATEST=`date +"%Y-%m-%d %H-%M-%S"`
sudo su postgres -c "echo '$DATEST ---------------------------------' >> $DIRPGDUMP/pg_dump_$BASE.log"
DATA=`date +"%Y-%m-%d_%H-%M-%S"`
DIR=$DIRPGDUMP/$BASE-$DATA
sudo -u postgres mkdir -p $DIR
sudo su postgres -c "pg_dump -j 4 -F d -f $DIR $BASE" && sudo su postgres -c "cd $DIRPGDUMP; \
     tar -cvzf $BASE-$DATA.tar.gz $BASE-$DATA > /dev/null 2>&1"
if [ $? -ne 0 ]
then
     echo "$BASE-$DATA.tar.gz неудачное завершение"
     sudo su postgres -c "echo '$BASE-$DATA.tar.gz неудачное завершение' >> $DIRPGDUMP/pg_dump_$BASE.log"
else
     echo "$BASE-$DATA.tar.gz удачное завершение"
     sudo su postgres -c "echo '$BASE-$DATA.tar.gz удачное завершение' >> $DIRPGDUMP/pg_dump_$BASE.log"
fi
DATEEND=`date +"%Y-%m-%d %H-%M-%S"`
sudo su postgres -c "echo '$DATEEND ---------------------------------' >> $DIRPGDUMP/pg_dump_$BASE.log"
sudo su postgres -c "echo '-----------------------------------------------------' >> $DIRPGDUMP/pg_dump_$BASE.log"
sudo su postgres -c "rm -rf $DIR"

Сохранить.

$ time sh backup_demo.sh


$ nano backup_all.sh

#!/bin/sh -e
#/backup
#должна быть папка:
BACKUP_DIR=/backup/pg_dump
LOG1=$BACKUP_DIR/backup.log
#должны быть права
#sudo chown -R postgres:postgres /backup
sudo su postgres -c "echo '---------------------------------' >> $LOG1"
#exit
#============================================
# делаем  backup
DB_BASE=`sudo su postgres -c "/usr/bin/psql -qAt -c 'SELECT * FROM pg_database;'" | \
     cut -d"|" -f1 | /bin/grep -v template | /bin/grep -v postgres`
#DB_BASE="demo test" #конкретные базы
#DB_BASE="" #пропустить
echo $DB_BASE
for DB_NAME in $DB_BASE
 do
     DATA=`date +"%Y-%m-%d_%H-%M-%S"`
     DATA1=`date +"%Y-%m-%d %H:%M:%S"`
     # Записываем информацию в лог с секундами
     sudo su postgres -c "echo '$DATA1 Начало backup базы ${DB_NAME}' >> $LOG1"
     echo "$DATA1 Начало backup базы ${DB_NAME}"
     DIR=$BACKUP_DIR/$DB_NAME-$DATA
     sudo su postgres -c "mkdir -p $DIR"
     sudo su postgres -c "pg_dump -j 4 -F d -f $DIR $DB_NAME" && sudo su postgres -c \
     "cd $BACKUP_DIR; tar -cvzf $DB_NAME-$DATA.tar.gz $DB_NAME-$DATA > /dev/null 2>&1"
     if [ $? -ne 0 ]
     then
         DATA1=`date +"%Y-%m-%d %H:%M:%S"`
         echo "$DATA1 Ошибка завершения backup для базы ${DB_NAME}"
         sudo su postgres -c "echo '$DATA1 Ошибка backup для для базы ${DB_NAME}' >>  $LOG1"
         sudo su postgres -c "rm -rf $DIR"
         sudo su postgres -c "rm -rf $DIR.tar.gz"
     else
         DATA1=`date +"%Y-%m-%d %H:%M:%S"`
         echo "$DATA1 Завершение backup для базы ${DB_NAME}"
         sudo su postgres -c "echo '$DATA1 Завершение backup для для базы ${DB_NAME}' >>  $LOG1"
         #sudo su postgres -c "rm -rf $DIR"
         #sudo su postgres -c "rm -rf $DIR.tar.gz"
     fi
     sudo su postgres -c "echo '--------------------------------------------------------------------' >> $LOG1"
done
#============================================


Сохранить.

$ time sh backup_demo.sh

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

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