Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΡ, Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°, Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ΅ΡΠΈ, ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΠ. Π‘Π΅ΡΠ΅Π²ΠΎΠ΅ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅: ΠΊΠΎΠΌΠΌΡΡΠ°ΡΠΎΡ, ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ, ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΌΠΎΡΡ, ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΠ°ΡΠΎΡ, 1. ΠΠΎΠΌΠΎΡΡ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²ΠΊΠ° ΡΠΊΡΠΈΠΏΡΠΎΠ² bash(ΠΊΠΎΠΏΠΈΡ, Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅). 2. Π‘ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΊΡΠΈΠΏΡΠ° cleanwalarch.sh, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΎΡΠΈΡΡΠΊΡ ΠΆΡΡΠ½Π°Π»ΠΎΠ² ΠΏΡΠ΅Π΄Π·Π°ΠΏΠΈΡΠΈ ΡΡΠ°ΡΡΠ΅ 7 Π΄Π½Π΅ΠΉ Π² ΠΏΠ°ΠΏΠΊΠ΅ /backup/wal_arch. Π‘Π΅ΡΠ²Π΅Ρ: Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. 1. ΠΠΎΠΌΠΎΡΡ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²ΠΊΠ° ΡΠΊΡΠΈΠΏΡΠΎΠ² bash(ΠΊΠΎΠΏΠΈΡ, Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅). 2. Π‘ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΊΡΠΈΠΏΡΠ° cleanwalarch.sh, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΎΡΠΈΡΡΠΊΡ ΠΆΡΡΠ½Π°Π»ΠΎΠ² ΠΏΡΠ΅Π΄Π·Π°ΠΏΠΈΡΠΈ ΡΡΠ°ΡΡΠ΅ 7 Π΄Π½Π΅ΠΉ Π² ΠΏΠ°ΠΏΠΊΠ΅ /backup/wal_arch Π‘ΠΎΡΡΠ°Π² ΡΡΠ΅Π½Π°ΡΠΈΡ backup.sh: #!/bin/bash # Π‘ΠΌΠΎΡΡΠΈΠΌ Π΅ΡΡΡ Π»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΡΡΠΈ Π±ΡΠΊΠ°ΠΏΠ°. ΠΡΠ»ΠΈ Π½Π΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ backupfolder=${1:-/backup} [ ! -d $backupfolder ] && echo “Directory $backupfolder DOES NOT exists.“ && exit 1 # ΠΡΠΎΠ²Π΅ΡΠΊΠ° PID Π½Π° ΡΠΎ, ΡΡΠΎ ΡΠΊΡΠΈΠΏΡ Π Π ΡΠΆΠ΅ Π·Π°ΠΏΡΡΠ΅Π½. PID_F=${backupfolder}/backup.pid if [ -r ${PID_F} ]; then PID=`cat ${PID_F}` if /usr/bin/kill -s 0 ${PID} > /dev/null 2>&1; then echo “Backup is already running. PID: ${PID}“ exit 2 fi fi # ΠΡΠ»ΠΈ Π½Π΅ Π·Π°ΠΏΡΡΠ΅Π½ ΠΏΠΈΡΠ΅ΠΌ PID Π² ΡΠ°ΠΉΠ» echo $$ > ${PID_F} display_time=$(date “+%Y-%m-%d %H:%M“) echo “[“$display_time“] Backup started.“ display_time=$(date “+%Y-%m-%d %H:%M“) echo “[“$display_time“] Cleaning backup folder.“ # ΠΡΠΈΡΠ°Π΅ΠΌ ΠΏΠ°ΠΏΠΊΡ Π±ΡΠΊΠ°ΠΏΠΎΠ² rm -rf ${backupfolder}/pgsql-backup rm -f ${backupfolder}/backup.log backup() { # ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π±ΡΠΊΠ°ΠΏ sudo -u pgbackup bash -c “/opt/pgpro/ent-15/bin/pg_basebackup -p 10265 -c fast -D $backupfolder/pgsql-backup -v -Ft -Xs -P“ || return 1 echo “done“ } backup 2>&1 | tee -a ${backupfolder}/backup.log if [ ${PIPESTATUS[0]} == 1 ]; then exit 1; fi # Π£Π΄Π°Π»ΡΠ΅ΠΌ ΡΠ°ΠΉΠ» Ρ PID /usr/bin/rm $PID_F Π‘ΠΎΡΡΠ°Π² ΡΡΠ΅Π½Π°ΡΠΈΡ restore.sh #!/bin/bash # Π£Π±Π΅Π΄ΠΈΡΡΡΡ Π² Π½Π°Π»ΠΈΡΠΈΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΏΡΡΠΈ Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ. ΠΡΠ»ΠΈ Π½Π΅Ρ, Π²ΡΠ²Π΅ΡΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΠΉΡΠΈ if [ -z “$1“ ]; then echo “Usage: restore.sh /restore“ echo “Run under root user“ exit 1; fi; backupfolder=$1 restore() { [ ! -d $backupfolder ] && echo “Directory $backupfolder DOES NOT exists.“ && return 1 [ ! -d $backupfolder/pgsql-backup ] && echo “$backupfolder has no backup“ && return 1 echo “1. Stop Postgres service“; # ΠΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ΅ΡΠ²ΠΈΡΠ° Postgres systemctl stop postgresql-15.service echo “2. remove data files“; rm -rf /pgdb/data/* || echo “check for data folder exist“ mkdir /pgdb/data mkdir /pgdb/data/pg_wal echo “3. extract backup“; # Π Π°ΡΠΏΠ°ΠΊΠΎΠ²Π°ΡΡ backup Π² ΠΏΠ°ΠΏΠΊΡ /pgdb/data tar -xf $backupfolder/pgsql-backup/base.tar -C /pgdb/data || return 1 tar -xf $backupfolder/pgsql-backup/pg_wal.tar -C /pgdb/data/pg_wal || return 1 echo “4. change backup owner to postgres“; # Π΄Π΅Π»Π°Π΅ΠΌ postgres Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ΠΌ chown -R postgres:postgres /pgdb/data || return 1 chmod 750 -R /pgdb/data || return 1 echo “5. start postgresql service“; # Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ΅ΡΠ²ΠΈΡ systemctl start postgresql-15.service echo “done“ } restore 2>&1 | tee restore.log.