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
$ 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
Комментариев нет:
Отправить комментарий