Бэкап базы данных

Подготовка

  1. Убедитесь, что на жёстком диске достаточно свободного места:

df -h
  1. Проверьте, что установлена и запущена работоспособная версия PostgreSQL:

sudo service postgresql status
  1. Остановите службы сервера, иначе резервное копирование может занять длительное время:

sudo staffcop stop
  1. Проверьте, что службы остановлены:

sudo staffcop top
sudo staffcop ps

Проведение бэкапа

Выполните команду:

sudo staffcop backup_db

Ваш бэкап будет размещен в папке /var/lib/staffcop/staffcop_backup.

Для переноса на другой компьютер скопируйте эту папку по сети или на переносной носитель.

Восстановление бэкапа

Примечание

Восстановление базы данных должно выполняться в той же версии Staffcop, в которой был создан бэкап. В противном случае не гарантируется работоспособность системы.

Для восстановления бэкапа выполните команду:

sudo staffcop restore_db

Если файл бэкапа находится не в /var/lib/staffcop/staffcop_backup, путь к нему нужно указать явно, например:

sudo staffcop restore_db /home/support/backup

Примечание

Путь к папке должен быть указан полностью!

Исходные коды скриптов:

  • скрипт инсталлятора — bp_install.sh:

    #!/bin/bash -e
    cd ~
    wget -O ~/backup_db http://dist.staffcop.ru/utils/script/backup/backup_db
    cp ~/backup_db /usr/share/staffcop/bin/
    chmod +x /usr/share/staffcop/bin/backup_db
    
    wget -O ~/restore_db http://dist.staffcop.ru/utils/script/backup/restore_db \
    cp ~/restore_db /usr/share/staffcop/bin/restore_db \
    chmod +x /usr/share/staffcop/bin/restore_db
    
  • скрипт создания бэкапа — backup_db.sh:

    echo "Backup StaffCop"
    
    if ! [ -f /bin/tar ]; then
    echo "No app tar. Please install 'sudo apt-get install tar'"
    exit 3
    fi
    
    if ! [ -f /usr/bin/pg_dump ]; then
    echo "No app pg_dump. Exit"
    exit 3
    fi
    #---------------------------
    bname=${DBNAME}-db.dump
    sname=${DBNAME}-setting.tar
    cname=${DBNAME}-sert.tar
    default_folder="staffcop_backup"
    default_path="/var/lib/staffcop"
    #--------------------------
    
    function backup_path_dialog() {
        echo -e "\e[32mПуть для размещения резервной копии базы: '${default_path}'(Y/N)?:\e[0m"
        read var1
        case $var1 in
                Y|y)
                path=${default_path}
                ;;
                N|n)
                request_backup_path
                ;;
                *)
                error
                backup_path_dialog
                ;;
        esac
    }
    
    function request_backup_path() {
        echo -e "\e[32mЗадайте путь для размещения резервной копии базы:\e[0m"
        read path
    }
    
    function error() {
        echo 'не могу распознать ответ'
        echo 'введите Y или N'
    }
    
    if [ $1 ] ;  then
            path=$1
    else
        backup_path_dialog
    fi
    
    #free space from hdd?
    TREE_ROOT=$(df --output=avail $path | sed 1d)
    
    echo "Свобдоное место в папке '${path}': ${TREE_ROOT}"
    
    DBPATH=$(echo $(su - postgres -c "psql -t -U postgres $DBHOST_OPTION $DBPORT_OPTION -d $DBNAME -c \"show data_directory;\""))
    SIZE_DB=`du -sk $DBPATH | cut -f1`
    
    if [[ "$TREE_ROOT" -gt "$SIZE_DB" ]]; then
    echo -e "\e[32mСоздаем резервную копию базы...\e[0m"
    else
    echo -e "\e[31mНехватает свободного места для создания резервной копии базы\e[0m"
    exit 1
    fi
    
    if ! [ -f /usr/bin/realpath ]; then
    echo "Warning. No app realpath. Please install 'sudo apt-get install realpath'"
    else
    path=$(realpath $path)
    fi
    
    path=${path}/${default_folder}
    echo "Backup path $path"
    
    #Create backup path
    echo "Create backup path"
    mkdir -p $path
    chmod 777 -R $path
    
    if ! [ -d  "$path" ] ; then
            echo "directory does not exist. exit"
            exit 1
    fi
    echo "Remove old backup files"
    rm $path/* || true
    
    #File name
    full_path=${path}/${bname}
    sfull_path=${path}/${sname}
    cfull_path=${path}/${cname}
    
    echo "Backup path $full_path"
    echo "Setting path $sfull_path"
    echo "CA path $cfull_path"
    echo "------------------------------------------"
    echo "Backup config"
    tar --absolute-names --create --verbose --file $sfull_path /etc/staffcop
    
    echo "Backup CA"
    tar --absolute-names --create --verbose --file $cfull_path /var/lib/staffcop/CA
    
    echo "Backup DB"
    sudo -u postgres pg_dump --host=$DBHOST_OPTION $DBPORT_OPTION --verbose --compress=7 --clean --create --blobs --format=c --file=$full_path --dbname=$DBNAME
    
    echo "------------------------------------------"
    echo "Backup path"
    
    if ! [ -f $full_path ]; then
    echo 'No file db. Error'
    exit 1
    else
    echo "File DB: $(du -h $full_path)"
    fi
    
    if ! [ -f $sfull_path ]; then
    echo 'No file setting. Error'
    exit 1
    else
    echo "File seting: $(du -h $sfull_path)"
    fi
    
    if ! [ -f $sfull_path ]; then
    echo 'No file CA. Error'
    exit 1
    else
    echo "File CA: $(du -h $sfull_path)"
    fi
    echo "-------------------------------------------"
    echo "Finish Backup StaffCop"
    
  • скрипт восстановления базы данных — restore_db.sh:

    bname=${DBNAME}-db.dump
    sname=${DBNAME}-setting.tar
    cname=${DBNAME}-sert.tar
    def_folder="staffcop_backup"
    def_path="/var/lib/staffcop/${def_folder}"
    
    if [ $1 ] ;  then
        path=$1
    else
        path=${def_path}
    fi
    
    path=$(realpath $path)
    
    full_path=${path}/${bname}
    cfull_path=${path}/${cname}
    
    if ! [ -f $full_path ]; then
            echo "No db backup at $full_path"
    else
            echo "Restore DB ${DBNAME} from $full_path"
            staffcop stop
            service postgresql restart
            echo "sudo -u postgres pg_restore  --host=$DBHOST_OPTION --port=$DBPORT_OPTION  --verbose --clean --create  --format=c $full_path -d postgres"
            sudo -u postgres pg_restore --host=$DBHOST_OPTION --port=$DBPORT_OPTION  --verbose --clean --create  --format=c $full_path -d postgres
            staffcop init
            echo "Done!"
    fi
    
    if ! [ -f $cfull_path ]; then
            echo "No license backup at $cfull_path"
    else
            echo "Restore license"
            rm /var/lib/staffcop/CA/*
            tar --absolute-names --extract --verbose --file $cfull_path
            chown -R staffcop:staffcop /var/lib/staffcop/CA/
            chmod 775 -R /var/lib/staffcop/CA/
            staffcop restart
    fi