Ще настроим резервно копиране на PostgreSQL в Linux (Debian).

Техническо задание

  • PostgreSQL backup трябва да се извършва автоматично по задание на cron всеки ден в 4 часа сутринта;
  • Бекъпът е нужен само за една PostgreSQL база данни с име db1c, която е собственик на потребителя postgres;
  • трябва да се съхранява backup 30 дни;
  • Трябва да запазвате резервни копия на отделен раздел на диска, чиято идентификационна маркировка е UUID=“cb541d40-4aad-4155-b1a3-c1294c7bbd1d“;
  • преди да запазите резервната копие, трябва да я архивирате с използване на алгоритъма gzip;
  • Името на файла с резервно копие трябва да е във формат db1c.pgsql.ГГГГММДД.gz, където ГГГГ е четирицифрената година на резервното копие, ММ са двуцифрените месеци на резервното копие, ДД са двуцифрените дни на резервното копие.

Раздели на дискове и техните UUID идентификатори.

За да разберем кои раздели на дисковете има в системата, въведете командата:

lsblk

Примерен изход на командата lsblk:

Командата lsblk за да разберете наличните раздели на дисковете.

За да научим идентификатора (UUID) на дисковия раздел (sda1), въведете командата:

blkid /dev/sda1

Примерен изход на командата blkid:

Как да разберем UUID на дисковия раздел?

За да намерите раздела на диска, който съответства на зададения UUID (UUID=“cb541d40-4aad-4155-b1a3-c1294c7bbd1d“), въведете командата:

blkid -U "cb541d40-4aad-4155-b1a3-c1294c7bbd1d"

Пример на извеждане на командата:

Как да открием раздел на диск по даден UUID?

Т.е. ще запазим резервно копие на PostgreSQL на раздел /dev/sda1, който ще монтираме в директорията /media/files/ на файловата система.

Bash скрипт за резервно копиране на PostgreSQL

Създаваме файл backupPostgresql.sh:

touch backupPostgresql.sh

Разрешавам на собственика да изпълни файл backupPostgresql.sh:

chmod u+x backupPostgresql.sh

Добавяме следния текст във файл backupPostgresql.sh:

#! /bin/bash
DEVICE=`/sbin/blkid -U "cb541d40-4aad-4155-b1a3-c1294c7bbd1d"`
MOUNTED=`/bin/df -h | /bin/grep /media/files | /usr/bin/wc -l`
FILENAME=`/bin/date +/media/files/db1c.pgsql.%Y%m%d.gz`
if [ $MOUNTED -eq 0 ]
then
        /bin/mount $DEVICE /media/files/ && MOUNTED=1
fi
if [ $MOUNTED -eq 1 ]
then
        /opt/pgpro/1c-14/bin/pg_dump --username=postgres --dbname=db1c | /bin/gzip > $FILENAME && /bin/ls -t /media/files/db1c.pgsql* | /usr/bin/tail -n+30 | /usr/bin/xargs -I{} /bin/rm {};
        /bin/umount $DEVICE
fi

#! /bin/bash е пътят към интерпретатора – програма, която превръща кода на нашия скрипт в инструкции, разбираеми от машината.

DEVICE=`/sbin/blkid -U "cb541d40-4aad-4155-b1a3-c1294c7bbd1d"` – резултатът от изпълнението на командата /sbin/blkid -U „cb541d40-4aad-4155-b1a3-c1294c7bbd1d“ се запазва в променливата DEVICE. В моя случай в променливата DEVICE ще бъде низът /dev/sda1;

MOUNTED=`/bin/df -h | /bin/grep $DEVICE | /usr/bin/wc -l` – резултатът от изпълнението на командата /bin/df -h | /bin/grep $DEVICE | /usr/bin/wc -l се запазва в променливата MOUNTED. В моя случай MOUNTED ще бъде 0, ако дялът на диска /dev/sda1 не е монтиран, и в променливата MOUNTED ще бъде 1, ако дялът на диска /dev/sda1 е бил предварително монтиран в директорията /media/files/;

FILENAME=`/bin/date +/media/files/db1c.pgsql.%Y%m%d.gz` – в променливата FILENAME запазваме пълното име на файла за резервно копие в изискания от ТЗ формат. Например, в моя случай в променливата FILENAME ще бъде низът /media/files/db1c.pgsql.20230125.gz;

Ако променливата MOUNTED е равна на 0, тогава:

  • /bin/mount $DEVICE /media/files/ – монтираме дяла на диска в /media/files/;

Ако променливата MOUNTED е равна на 1, тогава:

  • /opt/pgpro/1c-14/bin/pg_dump --username=postgres --dbname=db1c | /bin/gzip > $FILENAME – създаваме резервно копие на PostgreSQL базата db1c, която е собственост на потребителя postgres, архивираме и запазваме в /media/files/db1c.pgsql.ГГГГММДД.gz;
  • /bin/ls -t /media/files/db1c.pgsql* | /usr/bin/tail -n+30 | /usr/bin/xargs -I{} /bin/rm {} – изтриваме старите резервни копия на базата данни и запазваме само 30 най-нови.
  • Сливането на команди с && означава, че втората команда ще се изпълни само ако първата команда завърши успешно.
  • /bin/umount $DEVICE – Демонтираме раздела на диска.

Стартиране на pg_dump без въвеждане на парола.

За да може командата pg_dump (вж. предишния раздел) да се изпълнява без да се изисква паролата на потребителя postgres, трябва да се редактира конфигурационният файл /var/lib/pgpro/1c-14/data/pg_hba.conf и да се зададе trust (т.е. доверие) за всички local (т.е. локални връзки):

Конфигурационният файл pg_hba.conf

Рестартираме PostgreSQL:

systemctl restart postgrespro-1c-14

Автоматично резервно копие

Под потребителя root ще отворим за редактиране конфигурационния файл crontab, където се съхраняват задачите на cron:

crontab -e

Добавете ред:

0 4 * * * /path/to/file/backupPostgresql.sh

където /path/to/file/ е пълният път до bash скрипта backupPostgresql.sh.

Всичко! Наш bash скрипт ще се стартира автоматично всеки ден в 4 часа сутринта.

Изводи

С помощта на малък bash скрипт и запис в cron ние автоматизирахме създаването на бекъп за PostgreSQL база данни.

Как това може да помогне на бизнеса?

Когато в базата данни има важни за бизнеса данни, резервното копие на базата данни е жизнено необходимо нещо!

Коментари

Вашият коментар

Этот сайт защищен reCAPTCHA, и к нему применяются Google Политика конфиденциальности и Условия использования.

Sign In

Register

Reset Password

Please enter your username or email address, you will receive a link to create a new password via email.