Стратегия бэкапа JIRA описана на сайте Atlassian - https://confluence.atlassian.com/adminjiraserver071/backing-up-data-802592964.html
Встроенный механизм резервного копирования JIRA создает XML файл. Однако как пишет сам Atlassian, крайне рекомендуется использовать штатные средства бэкапирования, которые есть в БД.
За основу бэкапа БД возьмем скрипты с https://wiki.postgresql.org/wiki/Automated_Backup_on_Linux
Создадим каталоги для этих целей и скопируем скрипты для бэкапа:
mkdir /var/backups/scripts mkdir /var/backups/atlassian/jira/db mkdir /var/backups/atlassian/jira/dir cd /var/backups/scripts |
Скопируем скрипты с сайта по ссылке выше в соответствующие файлы и сделаем их исполняемыми:
vim pg_backup.config vim pg_backup.sh chmod ug+x pg_backup.sh vim pg_backup_rotated.sh chmod ug+x pg_backup_rotated.sh |
Файл pg_backup.sh можно использовать для единоразового бэкапа. В дальнейшем мы будем использовать скрипт pg_backup_rotated.sh, который удаляет (ротирует) старые файлы.
Настроим файл pg_backup.config для определения параметров бэкапа БД. В нашем случае ежедневный бэкап будет храниться в течении 7 дней (более старые файлы будут автоматически удаляться), еженедельный бэкап будет делаться в воскресение и храниться 4 недели. Формат файла - custom. Итоговый файл pg_backup.config будет выглядеть:
############################## ## POSTGRESQL BACKUP CONFIG ## ############################## # Optional system user to run backups as. If the user the script is running as doesn't match this # the script terminates. Leave blank to skip check. BACKUP_USER=root # Optional hostname to adhere to pg_hba policies. Will default to "localhost" if none specified. HOSTNAME=127.0.0.1 # Optional username to connect to database as. Will default to "postgres" if none specified. USERNAME= # This dir will be created if it doesn't exist. This must be writable by the user the script is # running as. BACKUP_DIR=/var/backups/atlassian/jira/db/ # List of strings to match against in database name, separated by space or comma, for which we only # wish to keep a backup of the schema, not the data. Any database names which contain any of these # values will be considered candidates. (e.g. "system_log" will match "dev_system_log_2010-01") SCHEMA_ONLY_LIST="" # Will produce a custom-format backup if set to "yes" ENABLE_CUSTOM_BACKUPS=yes # Will produce a gzipped plain-format backup if set to "yes" ENABLE_PLAIN_BACKUPS= # Will produce gzipped sql file containing the cluster globals, like users and passwords, if set to "yes" ENABLE_GLOBALS_BACKUPS= #### SETTINGS FOR ROTATED BACKUPS #### # Which day to take the weekly backup from (1-7 = Monday-Sunday) DAY_OF_WEEK_TO_KEEP=7 # Number of days to keep daily backups DAYS_TO_KEEP=7 # How many weeks to keep weekly backups WEEKS_TO_KEEP=4 ###################################### |
Для того, чтобы скрипт мог исполняться автоматически по cron (не запрашивался пароль), необходимо добавить HOSTNAME из файла pg_backup.config в файл pg_hba.conf как trust:
sudo vim /var/lib/pgsql/data/pg_hba.conf sudo systemctl reload postgresql.service |
Получится:
# IPv4 local connections: host all postgres 127.0.0.1/32 trust host all all 127.0.0.1/32 md5 |
Чтобы проверить, что скрипт бэкапа работает как нужно, запустите и убедитесь в создании файла бэкапа.
Теперь осталось добавить скрипт для запуска по расписанию в crontab, чтобы бэкап создавался автоматически и перегрузить crontab:
sudo vim /etc/crontab sudo systemctl reload crond.service |
Получится:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed #backup DB PSQL (jira) 0 3 * * * root /var/backups/scripts/pg_backup_rotated.sh |
Выражение 0 3 * * * означает запуск бэкапа каждый день в 03:00.
Автоматический бэкап БД настроен.
Для бэкапа директорий JIRA напишем небольшой скрипт, который будет архивировать JIRA home directory и каталог conf (в данном каталоге, например, хранятся настройки reverse proxy в файле server.xml, который может "затираться" при обновлениях), а также удалять старые файлы (старше 7 дней):
cd /var/backups/scripts/ vim ./jira_backup_dir.sh chmod ug+x jira_backup_dir.sh |
Получится:
#!/bin/bash TIME=`date +%d-%m-%Y` FILENAME=backup-jira-$TIME.tar.gz SRCDIR1=/var/atlassian/application-data/jira SRCDIR2=/opt/atlassian/jira/conf DESDIR=/var/backups/atlassian/jira/dir tar -cpzf $DESDIR/$FILENAME $SRCDIR1 $SRCDIR2 find $DESDIR/backup-* -mtime +7 -delete |
Осталось добавить скрипт в crontab для автоматического бэкапа перегрузить:
sudo vim /etc/crontab sudo systemctl reload crond.service |
Получится:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed #backup DB PSQL (jira) 0 3 * * * root /var/backups/scripts/pg_backup_rotated.sh #backup home directory jira + directory conf 15 3 * * * root /var/backups/scripts/jira_backup_dir.sh |
Выражение 15 3 * * * означает запуск бэкапа каждый день в 03:15.
Автоматический бэкап директорий настроен.
Остановим JIRA:
sudo systemctl stop jira |
Восстановим домашний каталог (JIRA home directory) из бэкапа. Если после того, как был сделан бэкап, производились дополнительные установки (например, ставились плагины), то лучше предварительно удалить содержимое каталога:
cd /var/backups/atlassian/jira/dir sudo tar -xzf backup-jira-xx-xx-xx.tar.gz sudo cd /var/atlassian/application-data/jira/ sudo rm -Rf ./* sudo cp -Rpf /var/backups/atlassian/jira/dir/var/atlassian/application-data/jira/* ./ |
Если команда cp запрашивает подтверждение перезаписи файлов, проверьте в ~/.bashrc прописан ли alias cp='cp -i' - если да, уберите ключ -i.
Если вы бэкапили каталог, где установлена JIRA, то для его восстановления необходимо также выполнить команду cp, как указано выше. Например, для восстановления каталога conf:
sudo cd /opt/atlassian/jira/conf/ sudo cp -Rpf /var/backups/atlassian/jira/dir/opt/atlassian/jira/conf/* ./ |
Восстановим БД:
sudo -u postgres -i -bash-4.2$ psql psql (9.2.18) Введите "help", чтобы получить справку. |
Изменим название БД JIRA на всякий случай (после успешного бэкапа удалим):
postgres=# ALTER DATABASE jiradb RENAME TO jiradbcorrupted; |
Создадим новую БД JIRA:
postgres=#CREATE DATABASE jiradb WITH ENCODING='UTF8' OWNER=jiradbuser CONNECTION LIMIT=-1; postgres=#\q |
Проверьте, что название БД JIRA изменилось (вы должны увидеть две БД - jiradbcorrupted и jiradb):
-bash-4.2$ psql -l |
Восстановим БД из бэкапа:
-bash-4.2$ pg_restore --format=c -d jiradb -v /var/backups/atlassian/db/monthly/jiradb.custom |
Если восстановление БД jiradb прошло без ошибок, можно удалить БД jiradbcorrupted и стартовать JIRA:
-bash-4.2$ psql -U postgres -c "drop database jiradbcorrupted" -bash-4.2$ exit sudo systemctl start jira |
Когда восстанавливаете JIRA из бэкапа проверяйте, чтобы каталоги и БД соответствовали друг другу.