Panguva yekunyora chinyorwa ichi, iyo yakagadzikana vhezheni yeWAL-G iri v0.2.15 (Kurume 2020). Izvi ndizvo zvatichashandisa (asi kana iwe uchida kuzvivaka iwe pachako kubva kune master bazi, saka iyo github repository ine mirairo yese yeizvi.) Kudhawunirodha uye kuisa iwe unofanirwa kuita:
#!/bin/bash
echo "30 6 * * * /usr/local/bin/wal-g delete before FIND_FULL $(date -d '-10 days' '+%FT%TZ') --confirm >> /var/log/postgresql/walg_delete.log 2>&1" >> /var/spool/cron/crontabs/postgres
# ещё раз задаем владельца и выставляем правильные права файлу (хоть это обычно это и не нужно повторно делать)
chown postgres: /var/spool/cron/crontabs/postgres
chmod 600 /var/spool/cron/crontabs/postgres
Cron ichamhanyisa basa iri zuva rega rega na6:30 am, ichidzima zvese (yakazara backups, deltas uye WALs) kunze kwemakopi emazuva gumi apfuura, asi ichisiya kamwechete backup. up to yakatarwa date kuitira kuti chero pfungwa после mazuva akaiswa muPITR.
Kudzoreredza kubva kune backup
Haisi chakavanzika kuti kiyi kune ine hutano dhatabhesi kudzoreredza nguva nenguva uye kusimbiswa kwekuvimbika kwe data mukati. Ini ndichakuudza nzira yekupora uchishandisa WAL-G muchikamu chino, uye tichazotaura nezve cheki gare gare.
Kudzorera kunoitwa nekufamba zvishoma kweruoko kudzima data rese rePostgreSQL (kusanganisira vashandisi), saka ndapota chenjera zvakanyanya paunomhanyisa mirairo inotevera.
#!/bin/bash
# если есть балансировщик подключений (например, pgbouncer), то вначале отключаем его, чтобы он не нарыгал ошибок в лог
service pgbouncer stop
# если есть демон, который перезапускает упавшие процессы (например, monit), то останавливаем в нём процесс мониторинга базы (у меня это pgsql12)
monit stop pgsql12
# или останавливаем мониторинг полностью
service monit stop
# останавливаем саму базу данных
service postgresql stop
# удаляем все данные из текущей базы (!!!); лучше предварительно сделать их копию, если есть свободное место на диске
rm -rf /var/lib/postgresql/12/main
# скачиваем резервную копию и разархивируем её
su - postgres -c '/usr/local/bin/wal-g backup-fetch /var/lib/postgresql/12/main LATEST'
# помещаем рядом с базой специальный файл-сигнал для восстановления (см. https://postgrespro.ru/docs/postgresql/12/runtime-config-wal#RUNTIME-CONFIG-WAL-ARCHIVE-RECOVERY ), он обязательно должен быть создан от пользователя postgres
su - postgres -c 'touch /var/lib/postgresql/12/main/recovery.signal'
# запускаем базу данных, чтобы она инициировала процесс восстановления
service postgresql start
Kune avo vanoda kutarisa maitiro ekugadzirisa, chidimbu chiduku che bash magic chakagadzirirwa pasi apa, kuitira kuti kana pane matambudziko mukugadzirisa, script ichaputsika nekodhi isina zero yekubuda. Mumuenzaniso uyu, macheki zana nemakumi maviri anoitwa nenguva yekubuda kwemasekonzi mashanu (yakazara maminetsi gumi ekupora) kuona kana faira rechiratidzo rakadzimwa (izvi zvinoreva kuti kupora kwakabudirira):
#!/bin/bash
CHECK_RECOVERY_SIGNAL_ITER=0
while [ ${CHECK_RECOVERY_SIGNAL_ITER} -le 120 ]
do
if [ ! -f "/var/lib/postgresql/12/main/recovery.signal" ]
then
echo "recovery.signal removed"
break
fi
sleep 5
((CHECK_RECOVERY_SIGNAL_ITER+1))
done
# если после всех проверок файл всё равно существует, то падаем с ошибкой
if [ -f "/var/lib/postgresql/12/main/recovery.signal" ]
then
echo "recovery.signal still exists!"
exit 17
fi
Mushure mekubudirira kupora, usakanganwa kutanga maitiro ese kumashure (pgbouncer/monit, nezvimwewo).
Kuongorora data mushure mekupora
Izvo zvakakosha kuti utarise kutendeseka kweiyo dhatabhesi mushure mekudzoreredzwa, kuitira kuti mamiriro ane yakatyoka / yakakombama backup isamuke. Uye zviri nani kuita izvi nearchive yega yega yakagadzirwa, asi kupi uye sei zvinoenderana chete nekufungidzira kwako (iwe unogona kusimudza maseva ega paawa kana kumhanyisa cheki muCI). Asi pane zvishoma, zvinodikanwa kuti utarise iyo data uye indexes mune dhatabhesi.
Kuti utarise iyo data, zvakakwana kuti uimhanye kuburikidza nekurasira, asi zviri nani kuti kana uchigadzira dhatabhesi une macheki akagoneswa (data checksums):
#!/bin/bash
if ! su - postgres -c 'pg_dumpall > /dev/null'
then
echo 'pg_dumpall failed'
exit 125
fi
#!/bin/bash
# добавляем sql-запрос для проверки в файл во временной директории
cat > /tmp/amcheck.sql << EOF
CREATE EXTENSION IF NOT EXISTS amcheck;
SELECT bt_index_check(c.oid), c.relname, c.relpages
FROM pg_index i
JOIN pg_opclass op ON i.indclass[0] = op.oid
JOIN pg_am am ON op.opcmethod = am.oid
JOIN pg_class c ON i.indexrelid = c.oid
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE am.amname = 'btree'
AND c.relpersistence != 't'
AND i.indisready AND i.indisvalid;
EOF
chown postgres: /tmp/amcheck.sql
# добавляем скрипт для запуска проверок всех доступных баз в кластере
# (обратите внимание что переменные и запуск команд – экранированы)
cat > /tmp/run_amcheck.sh << EOF
for DBNAME in $(su - postgres -c 'psql -q -A -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;" ')
do
echo "Database: ${DBNAME}"
su - postgres -c "psql -f /tmp/amcheck.sql -v 'ON_ERROR_STOP=1' ${DBNAME}" && EXIT_STATUS=$? || EXIT_STATUS=$?
if [ "${EXIT_STATUS}" -ne 0 ]
then
echo "amcheck failed on DB: ${DBNAME}"
exit 125
fi
done
EOF
chmod +x /tmp/run_amcheck.sh
# запускаем скрипт
/tmp/run_amcheck.sh > /tmp/amcheck.log
# для проверки что всё прошло успешно можно проверить exit code или grep’нуть ошибку
if grep 'amcheck failed' "/tmp/amcheck.log"
then
echo 'amcheck failed: '
cat /tmp/amcheck.log
exit 125
fi