Я ни в коем случае не администратор БД, поэтому, пожалуйста, не стреляйте в меня, если я делаю это совершенно неправильно ...
Мне нужно добавить некоторое архивирование в производительную базу данных postgres (новейшая версия в Docker-контейнере) и попытаться создать несколько сценариев для использования с WAL.
Идея состоит в том, чтобы иметь еженедельный сценарий, который выполняет полное резервное копирование в новый каталог и затем создает символическую ссылку на этот новый каталог, который используется сценарием WAL для записи его журналов. Также еженедельный скрипт удалит старые резервные копии старше 30 дней.
Буду очень рад любым комментариям по этому поводу ...
Настройки дБ
wal_level = replica
archive_mode = on
archive_command = '/archive/archive_wal.sh "%p" "%f"'
archive_timeout = 300
еженедельный скрипт:
#!/bin/bash
#create base archive dir
#base_arch_dir=/tmp/archive/
base_arch_dir=/archive/
if [ ! -d "$base_arch_dir" ]; then
mkdir "$base_arch_dir"
chown -R postgres:postgres "$base_arch_dir"
fi
#create dir for week
dir="$base_arch_dir"$(date '+%Y_%m_%d__%H_%M_%S')
if [ ! -d "$dir" ]; then
mkdir "$dir"
chown -R postgres:postgres "$dir"
fi
#change/create the symlink
newdir="$base_arch_dir"wals
ln -fsn "$dir" "$newdir"
chown -R postgres:postgres "$newdir"
#do the base backup to the wals dir
if pg_basebackup -D "$newdir" -F tar -R -X fetch -z -Z 9 -U postgres; then
find "$base_arch_dir"* -type d -mtime +31|xargs rm -rf
fi
скрипт crchive:
#!/bin/bash
set -e
arch_dir=/archive/wals
arch_log="$arch_dir/arch.log"
if [ ! -d "$arch_dir" ]; then
echo arch_dir '"$arch_dir"' does not exist >> "$arch_log"
exit -1
fi
#get the variables from postgres
p=$1
f=$2
if [ -f "$arch_dir"/$f.xz ]; then
echo wal file '"$arch_dir"/$f.xz' already exists
exit -1
fi
pxz -2 -z --keep -c $p > "$arch_dir"/$f.xz
Заранее спасибо