Ще настроим резервно копиране на 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
:

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

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

Т.е. ще запазим резервно копие на 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 (т.е. локални връзки):

Рестартираме 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 база данни.
Как това може да помогне на бизнеса?
Когато в базата данни има важни за бизнеса данни, резервното копие на базата данни е жизнено необходимо нещо!
Коментари