Бэкап базы данных¶
Подготовка¶
Убедитесь, что на жёстком диске достаточно свободного места:
df -h
Проверьте, что установлена и запущена работоспособная версия PostgreSQL:
sudo service postgresql status
Остановите службы сервера, иначе резервное копирование может занять длительное время:
sudo staffcop stop
Проверьте, что службы остановлены:
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