WAL-G: PostgreSQL DBMS āĻāĻ° āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ°

āĻāĻŸāĻŋ āĻĻā§€āĻ°ā§āĻ˜āĻĻāĻŋāĻ¨ āĻ§āĻ°ā§‡āĻ‡ āĻœāĻžāĻ¨āĻž āĻ—ā§‡āĻ›ā§‡ āĻ¯ā§‡ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻĄāĻžāĻŽā§āĻĒāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž (āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ pg_dump āĻŦāĻž pg_dumpall) āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ˛ āĻ§āĻžāĻ°āĻŖāĻž āĻ¨āĻ¯āĻŧāĨ¤ PostgreSQL DBMS āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ•āĻ°āĻ¤ā§‡, āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ­āĻžāĻ˛ pg_basebackup, āĻ¯āĻž WAL āĻ˛āĻ—ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ‡āĻ¨āĻžāĻ°āĻŋ āĻ•āĻĒāĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻ–āĻ¨ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°ā§‹ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻŸāĻŋ āĻ…āĻ§ā§āĻ¯āĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻŦā§‡āĻ¨, āĻ¤āĻ–āĻ¨ āĻ†āĻĒāĻ¨āĻŋ āĻŦā§āĻāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨ āĻ¯ā§‡ āĻāĻŸāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ•āĻŽāĻĒāĻ•ā§āĻˇā§‡ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻŸā§āĻ°āĻžāĻ‡āĻ¸āĻžāĻ‡āĻ•ā§‡āĻ˛ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ‰āĻĒāĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¨ā§€āĻšā§‡ āĻ‰āĻ­āĻ¯āĻŧāĻ‡ āĻŦā§āĻ¯āĻĨāĻž āĻ¸ā§ƒāĻˇā§āĻŸāĻŋ āĻ•āĻ°āĻŦā§‡ āĻ¨āĻžāĨ¤ āĻĻā§āĻ°ā§āĻ­ā§‹āĻ— āĻ•āĻŽāĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯, WAL-G āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛āĨ¤

āĻ“āĻ¯āĻŧāĻžāĻ˛-āĻœāĻŋ PostgreSQL āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻŦā§āĻ¯āĻžāĻ• āĻ†āĻĒ āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ Go-āĻ¤ā§‡ āĻ˛ā§‡āĻ–āĻž āĻāĻ•āĻŸāĻŋ āĻŸā§āĻ˛ (āĻāĻŦāĻ‚ āĻ…āĻ¤āĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°āĻ¤āĻŋ MySQL/MariaDB, MongoDB āĻāĻŦāĻ‚ FoundationDB) āĻāĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻŽāĻžāĻœāĻ¨ S3 āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ (āĻāĻŦāĻ‚ āĻ…ā§āĻ¯āĻžāĻ¨āĻžāĻ˛āĻ—āĻ—ā§āĻ˛āĻŋ, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ‡āĻ¯āĻŧāĻžāĻ¨āĻĄā§‡āĻ•ā§āĻ¸ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ), āĻ¸ā§‡āĻ‡āĻ¸āĻžāĻĨā§‡ āĻ—ā§āĻ—āĻ˛ āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ, āĻ…ā§āĻ¯āĻžāĻœā§āĻ° āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ, āĻ¸ā§āĻ‡āĻĢāĻŸ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻāĻŦāĻ‚ āĻ¸āĻšāĻœāĻ­āĻžāĻŦā§‡ āĻĢāĻžāĻ‡āĻ˛ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸ā§‡āĻŸāĻ†āĻĒāĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ§āĻžāĻĒā§‡ āĻ¨ā§‡āĻŽā§‡ āĻ†āĻ¸ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸ āĻœā§āĻĄāĻŧā§‡ āĻ›āĻĄāĻŧāĻŋāĻ¯āĻŧā§‡ āĻ›āĻŋāĻŸāĻŋāĻ¯āĻŧā§‡ āĻĨāĻžāĻ•āĻžāĻ° āĻ•āĻžāĻ°āĻŖā§‡, āĻļā§āĻ°ā§ āĻĨā§‡āĻ•ā§‡ āĻļā§‡āĻˇ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒāĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨āĻ“ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛ āĻ¨ā§‡āĻ‡ (āĻšāĻžāĻŦā§āĻ°ā§‡āĻ¤ā§‡ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻĒā§‹āĻ¸ā§āĻŸ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻŽāĻŋāĻ¸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡)āĨ¤

WAL-G: PostgreSQL DBMS āĻāĻ° āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ°

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻžāĻ° āĻœā§āĻžāĻžāĻ¨ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ—āĻ¤āĻ­āĻžāĻŦā§‡ āĻ˛ā§‡āĻ–āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡. āĻ†āĻŽāĻŋ āĻāĻ•āĻœāĻ¨ DBA āĻ¨āĻ‡ āĻāĻŦāĻ‚ āĻ†āĻŽāĻŋ āĻ•ā§‹āĻĨāĻžāĻ“ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŽāĻžāĻ¨ā§āĻˇā§‡āĻ° āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻ¨āĻŋāĻœā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ, āĻ¤āĻžāĻ‡ āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ āĻ¸āĻ‚āĻļā§‹āĻ§āĻ¨ āĻ¸ā§āĻŦāĻžāĻ—āĻ¤ āĻœāĻžāĻ¨āĻžāĻ‡!

āĻ†āĻ˛āĻžāĻĻāĻžāĻ­āĻžāĻŦā§‡, āĻ†āĻŽāĻŋ āĻ˛āĻ•ā§āĻˇā§āĻ¯ āĻ•āĻ°āĻŋ āĻ¯ā§‡ āĻ¨ā§€āĻšā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•āĻŋāĻ›ā§ āĻĒā§āĻ°āĻžāĻ¸āĻ™ā§āĻ—āĻŋāĻ• āĻāĻŦāĻ‚ āĻ‰āĻŦā§āĻ¨ā§āĻŸā§ 12.3 āĻ PostgreSQL 18.04 āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§‡āĻˇ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤

āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ˛ā§‡āĻ–āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, WAL-G āĻāĻ° āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻļā§€āĻ˛ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ v0.2.15 (āĻŽāĻžāĻ°ā§āĻš 2020). āĻāĻŸāĻŋāĻ‡ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ (āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻŽāĻžāĻ¸ā§āĻŸāĻžāĻ° āĻļāĻžāĻ–āĻž āĻĨā§‡āĻ•ā§‡ āĻāĻŸāĻŋ āĻ¨āĻŋāĻœā§‡āĻ‡ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¤āĻŦā§‡ āĻ—āĻŋāĻĨā§āĻŦ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ā§‡ āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļāĻžāĻŦāĻ˛ā§€ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡) āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻāĻŦāĻ‚ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¯āĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡:

#!/bin/bash

curl -L "https://github.com/wal-g/wal-g/releases/download/v0.2.15/wal-g.linux-amd64.tar.gz" -o "wal-g.linux-amd64.tar.gz"
tar -xzf wal-g.linux-amd64.tar.gz
mv wal-g /usr/local/bin/

āĻāĻ° āĻĒāĻ°ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĒā§āĻ°āĻĨāĻŽā§‡ WAL-G āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° PostgreSQL āĻ¨āĻŋāĻœā§‡āĻ‡āĨ¤

WAL-G āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯, Amazon S3 āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻŦā§‡ (āĻ•āĻžāĻ°āĻŖ āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻ° āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ•āĻžāĻ›āĻžāĻ•āĻžāĻ›āĻŋ āĻāĻŦāĻ‚ āĻāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ–ā§āĻŦāĻ‡ āĻ¸āĻ¸ā§āĻ¤āĻž) āĻāĻŸāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻžāĻ° āĻāĻ•āĻŸāĻŋ "s3 āĻŦāĻžāĻ˛āĻ¤āĻŋ" āĻāĻŦāĻ‚ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ•ā§€āĻ—ā§āĻ˛āĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§ˇ

WAL-G āĻ¸āĻŽā§āĻŦāĻ¨ā§āĻ§ā§‡ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§€ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĻ›ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ‡ āĻ°āĻŋāĻ˛āĻŋāĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻāĻ–āĻžāĻ¨ā§‡ āĻ…āĻŦāĻ¸ā§āĻĨāĻŋāĻ¤ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ .walg.json āĻĢāĻžāĻ‡āĻ˛ āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻšā§‹āĻŽ āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋāĻ¤ā§‡āĨ¤ āĻāĻŸāĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡, āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻŦā§āĻ¯āĻžāĻļ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸāĻŸāĻŋ āĻšāĻžāĻ˛āĻžāĻ¨:

#!/bin/bash

cat > /var/lib/postgresql/.walg.json << EOF
{
    "WALG_S3_PREFIX": "s3://your_bucket/path",
    "AWS_ACCESS_KEY_ID": "key_id",
    "AWS_SECRET_ACCESS_KEY": "secret_key",
    "WALG_COMPRESSION_METHOD": "brotli",
    "WALG_DELTA_MAX_STEPS": "5",
    "PGDATA": "/var/lib/postgresql/12/main",
    "PGHOST": "/var/run/postgresql/.s.PGSQL.5432"
}
EOF
# ОйŅĐˇĐ°Ņ‚ĐĩĐģŅŒĐŊĐž ĐŧĐĩĐŊŅĐĩĐŧ вĐģĐ°Đ´ĐĩĐģŅŒŅ†Đ° Ņ„Đ°ĐšĐģĐ°:
chown postgres: /var/lib/postgresql/.walg.json

āĻ†āĻŽāĻžāĻ•ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻāĻ•āĻŸā§ āĻŦā§āĻ¯āĻžāĻ–ā§āĻ¯āĻž āĻ•āĻ°āĻž āĻ¯āĻžāĻ•:

  • WALG_S3_PREFIX - āĻ†āĻĒāĻ¨āĻžāĻ° S3 āĻŦāĻžāĻ˛āĻ¤āĻŋāĻ¤ā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻĒāĻĨ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻšāĻŦā§‡ (āĻ†āĻĒāĻ¨āĻŋ āĻ°ā§āĻŸ āĻŦāĻž āĻĢā§‹āĻ˛ā§āĻĄāĻžāĻ°ā§‡ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨);
  • AWS_ACCESS_KEY_ID - S3 āĻ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ•ā§€ (āĻāĻ•āĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ°ā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻāĻ‡ āĻ•ā§€āĻ—ā§āĻ˛āĻŋāĻ° āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĒāĻ āĻ¨ āĻ¨ā§€āĻ¤āĻŋ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡! āĻāĻŸāĻŋ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ°ā§‡āĻ° āĻŦāĻŋāĻ­āĻžāĻ—ā§‡ āĻ†āĻ°āĻ“ āĻŦāĻŋāĻļāĻĻā§‡ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤);
  • AWS_SECRET_ACCESS_KEY - S3 āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœā§‡ āĻ—ā§‹āĻĒāĻ¨ āĻ•ā§€;
  • WALG_COMPRESSION_METHOD - āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ, āĻŦā§āĻ°āĻŸāĻ˛āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ­āĻžāĻ˛ (āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻāĻŸāĻŋ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻ†āĻ•āĻžāĻ° āĻāĻŦāĻ‚ āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨/āĻĄāĻŋāĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻ—āĻ¤āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸ā§‹āĻ¨āĻžāĻ˛ā§€ āĻ—āĻĄāĻŧ);
  • WALG_DELTA_MAX_STEPS - āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ†āĻ—ā§‡ "āĻĄā§‡āĻ˛ā§āĻŸāĻž" āĻāĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž (āĻ¤āĻžāĻ°āĻž āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻĄā§‡āĻŸāĻžāĻ° āĻ†āĻ•āĻžāĻ° āĻŦāĻžāĻāĻšāĻžāĻ¯āĻŧ, āĻ¤āĻŦā§‡ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ°ā§‡āĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻŸāĻŋāĻ•ā§‡ āĻ•āĻŋāĻ›ā§āĻŸāĻž āĻ§ā§€āĻ° āĻ•āĻ°ā§‡ āĻĻāĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ¤āĻžāĻ‡ āĻŦāĻĄāĻŧ āĻŽāĻžāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ¯ā§āĻ•ā§āĻ¤ āĻ¨āĻ¯āĻŧ);
  • PGDATA - āĻ†āĻĒāĻ¨āĻžāĻ° āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻĄā§‡āĻŸāĻž āĻ¸āĻš āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋāĻ° āĻĒāĻĨ (āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ–ā§āĻāĻœā§‡ āĻĒā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ pg_lsclusters);
  • PGHOST - āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž, āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ¸āĻš āĻāĻ‡ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡āĻ° āĻŽāĻ¤ā§‹ āĻāĻ•āĻŸāĻŋ āĻ‡āĻ‰āĻ¨āĻŋāĻ•ā§āĻ¸-āĻ¸āĻ•ā§‡āĻŸā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻāĻŸāĻŋ āĻ•āĻ°āĻž āĻ­āĻžāĻ˛āĨ¤

āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨ā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§‡: https://github.com/wal-g/wal-g/blob/v0.2.15/PostgreSQL.md#configuration.

PostgreSQL āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻ­āĻŋāĻ¤āĻ°ā§‡ āĻ†āĻ°ā§āĻ•āĻžāĻ‡āĻ­āĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§āĻ˛āĻžāĻ‰āĻĄā§‡ WAL āĻ˛āĻ— āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ (āĻ¯āĻĻāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¯āĻŧ), āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ /etc/postgresql/12/main/postgresql.conf. āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻļā§āĻ°ā§āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻŋ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĻ¨āĻŋāĻšā§‡āĻ° āĻ•ā§‹āĻ¨ā§‹ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻ…āĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨ā§‹ āĻŽāĻžāĻ¨ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻ¨ā§‡āĻ‡, āĻ¯āĻžāĻ¤ā§‡ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, DBMS āĻ•ā§āĻ°ā§āĻ¯āĻžāĻļ āĻ¨āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ‡ āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨:

#!/bin/bash

echo "wal_level=replica" >> /etc/postgresql/12/main/postgresql.conf
echo "archive_mode=on" >> /etc/postgresql/12/main/postgresql.conf
echo "archive_command='/usr/local/bin/wal-g wal-push "%p" >> /var/log/postgresql/archive_command.log 2>&1' " >> /etc/postgresql/12/main/postgresql.conf
echo “archive_timeout=60” >> /etc/postgresql/12/main/postgresql.conf
echo "restore_command='/usr/local/bin/wal-g wal-fetch "%f" "%p" >> /var/log/postgresql/restore_command.log 2>&1' " >> /etc/postgresql/12/main/postgresql.conf

# ĐŋĐĩŅ€ĐĩСаĐŗŅ€ŅƒĐļĐ°ĐĩĐŧ ĐēĐžĐŊŅ„иĐŗ Ņ‡ĐĩŅ€ĐĩС ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐēŅƒ SIGHUP ŅĐ¸ĐŗĐŊĐ°ĐģĐ° вŅĐĩĐŧ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ°Đŧ БД
killall -s HUP postgres

āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋāĻ—ā§āĻ˛āĻŋāĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻž:

  • āĻ“āĻ¯āĻŧāĻžāĻ˛_āĻ˛ā§‡āĻ­ā§‡āĻ˛ - WAL āĻ˛āĻ—āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ•āĻ¤ āĻ¤āĻĨā§āĻ¯ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻŦā§‡, "āĻĒā§āĻ°āĻ¤āĻŋāĻ˛āĻŋāĻĒāĻŋ" - āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ˛āĻŋāĻ–ā§āĻ¨;
  • āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻ—āĻžāĻ°_āĻŽā§‹āĻĄ - āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ WAL āĻ˛āĻ— āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°ā§āĻ¨ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻ—āĻžāĻ°_āĻ•āĻŽāĻžāĻ¨ā§āĻĄ;
  • āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻ—āĻžāĻ°_āĻ•āĻŽāĻžāĻ¨ā§āĻĄ - āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ WAL āĻ˛āĻ— āĻ†āĻ°ā§āĻ•āĻžāĻ‡āĻ­ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ;
  • āĻ†āĻ°ā§āĻ•āĻžāĻ‡āĻ­_āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ - āĻ˛āĻ—ā§‡āĻ° āĻ†āĻ°ā§āĻ•āĻžāĻ‡āĻ­āĻŋāĻ‚ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšāĻ˛ā§‡āĻ‡ āĻ¸āĻžā§āĻšāĻžāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻ¸āĻžāĻŽāĻžāĻ¨ā§āĻ¯ āĻĄā§‡āĻŸāĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨/āĻ¸āĻ‚āĻ¯ā§‹āĻœāĻ¨ āĻ•āĻ°ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸ā§€āĻŽāĻž āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°āĻž āĻŦā§‹āĻ§āĻ—āĻŽā§āĻ¯ āĻšāĻ¯āĻŧ, āĻ¯āĻžāĻ° āĻĒāĻ°ā§‡ āĻ†āĻ°ā§āĻ•āĻžāĻ‡āĻ­āĻŋāĻ‚ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻ•ā§‡ āĻœā§‹āĻ° āĻ•āĻ°ā§‡ āĻĄāĻžāĻ•āĻž āĻšāĻŦā§‡ (āĻ†āĻŽāĻŋ āĻĒā§āĻ°āĻ¤āĻŋ āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻ¨āĻŋāĻŦāĻŋāĻĄāĻŧāĻ­āĻžāĻŦā§‡ āĻ˛āĻŋāĻ–āĻŋ, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻŋ āĻāĻ‡ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ°āĻŸāĻŋ āĻ‰ā§ŽāĻĒāĻžāĻĻāĻ¨ā§‡ āĻ¸ā§‡āĻŸ āĻ¨āĻž āĻ•āĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋ);
  • restore_command - āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻĨā§‡āĻ•ā§‡ WAL āĻ˛āĻ— āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¯āĻĻāĻŋ "āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ" (āĻŦā§‡āĻ¸ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ) āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻ¸āĻžāĻŽā§āĻĒā§āĻ°āĻ¤āĻŋāĻ• āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¨āĻž āĻĨāĻžāĻ•ā§‡āĨ¤

āĻ†āĻĒāĻ¨āĻŋ āĻ…āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨ā§‡āĻ° āĻ…āĻ¨ā§āĻŦāĻžāĻĻā§‡ āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ†āĻ°āĻ“ āĻĒāĻĄāĻŧāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨: https://postgrespro.ru/docs/postgresql/12/runtime-config-wal.

āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§‚āĻšā§€ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡ā§ˇ

āĻ¯ā§‡ āĻ¯āĻžāĻ‡ āĻŦāĻ˛ā§āĻ• āĻ¨āĻž āĻ•ā§‡āĻ¨, āĻāĻŸāĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ• āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻšāĻ˛ āĻ•ā§āĻ°ā§‹āĻ¨āĨ¤ āĻāĻŸāĻŋāĻ‡ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻŦāĨ¤ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•: wal-g-āĻ āĻāĻŸāĻŋ āĻ˛āĻžā§āĻš āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ-āĻĒā§āĻļ. āĻ¤āĻŦā§‡ āĻĒā§āĻ°āĻĨāĻŽā§‡, āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ āĻŋāĻ• āĻ†āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻāĻ‡ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻŸāĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹ āĻ­āĻžāĻ˛ (āĻāĻŦāĻ‚ āĻ•ā§‹āĻ¨āĻ“ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ¨ā§‡āĻ‡):

#!/bin/bash

su - postgres -c '/usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main'

āĻ˛āĻžā§āĻš āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸāĻ—ā§āĻ˛āĻŋ āĻĄā§‡āĻŸāĻž āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋāĻ° āĻĒāĻĨ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°ā§‡ - āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŽāĻ¨ā§‡ āĻ•āĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻāĻŋāĻšā§āĻ›āĻŋ āĻ¯ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻāĻŸāĻŋ āĻšāĻžāĻ˛āĻŋāĻ¯āĻŧā§‡ āĻāĻŸāĻŋ āĻ–ā§āĻāĻœā§‡ āĻĒā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ pg_lsclusters.

āĻ¯āĻĻāĻŋ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻšāĻ˛ā§‡ āĻ¯āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĄā§‡āĻŸāĻž S3 āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœā§‡ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ•ā§āĻ°āĻ¨āĻŸāĻžāĻŦā§‡ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻ•ā§āĻ°āĻŽāĻŋāĻ• āĻ˛āĻžā§āĻš āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨:

#!/bin/bash

echo "15 4 * * *    /usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main >> /var/log/postgresql/walg_backup.log 2>&1" >> /var/spool/cron/crontabs/postgres
# СадаĐĩĐŧ вĐģĐ°Đ´ĐĩĐģŅŒŅ†Đ° и вŅ‹ŅŅ‚авĐģŅĐĩĐŧ ĐŋŅ€Đ°Đ˛Đ¸ĐģŅŒĐŊŅ‹Đĩ ĐŋŅ€Đ°Đ˛Đ° Ņ„Đ°ĐšĐģŅƒ
chown postgres: /var/spool/cron/crontabs/postgres
chmod 600 /var/spool/cron/crontabs/postgres

āĻāĻ‡ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡, āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ°āĻ¤āĻŋāĻĻāĻŋāĻ¨ āĻ¸āĻ•āĻžāĻ˛ 4:15 āĻ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤

āĻĒā§āĻ°āĻžāĻ¨ā§‹ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻšāĻšā§āĻ›ā§‡

āĻ–ā§āĻŦ āĻ¸āĻŽā§āĻ­āĻŦāĻ¤, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŽā§‡āĻ¸ā§‹āĻœā§‹āĻ¯āĻŧāĻŋāĻ• āĻ¯ā§āĻ—ā§‡āĻ° āĻāĻ•ā§‡āĻŦāĻžāĻ°ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ°āĻžāĻ–āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¨āĻž, āĻ¤āĻžāĻ‡ āĻāĻŸāĻŋ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻ•ā§āĻ°āĻŽā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœāĻ•ā§‡ "āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ°" āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ¯ā§‹āĻ—ā§€ āĻšāĻŦā§‡ (āĻ‰āĻ­āĻ¯āĻŧ "āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ" āĻāĻŦāĻ‚ āĻ“āĻ¯āĻŧāĻžāĻ˛ āĻ˛āĻ—)āĨ¤ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ°ā§‹āĻ¨ āĻŸāĻžāĻ¸ā§āĻ•ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻāĻŸāĻŋ āĻ•āĻ°āĻŦ:

#!/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

āĻ•ā§āĻ°ā§‹āĻ¨ āĻĒā§āĻ°āĻ¤āĻŋāĻĻāĻŋāĻ¨ āĻ¸āĻ•āĻžāĻ˛ 6:30 āĻŸāĻžāĻ¯āĻŧ āĻāĻ‡ āĻŸāĻžāĻ¸ā§āĻ•āĻŸāĻŋ āĻšāĻžāĻ˛āĻžāĻŦā§‡, āĻ—āĻ¤ 10 āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ•āĻĒāĻŋ āĻŦā§āĻ¯āĻ¤ā§€āĻ¤ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ (āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ, āĻĄā§‡āĻ˛ā§āĻŸāĻž āĻāĻŦāĻ‚ āĻ“āĻ¯āĻŧāĻžāĻ˛) āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻŦā§‡, āĻ¤āĻŦā§‡ āĻ•āĻŽāĻĒāĻ•ā§āĻˇā§‡ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ°ā§‡āĻ–ā§‡ āĻ¯āĻžāĻŦā§‡ āĻĨā§‡āĻ•ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¤āĻžāĻ°āĻŋāĻ– āĻ¯āĻžāĻ¤ā§‡ āĻ•ā§‹āĻ¨ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ ĐŋĐžŅĐģĐĩ āĻ¤āĻžāĻ°āĻŋāĻ–āĻ—ā§āĻ˛āĻŋ āĻĒāĻŋāĻ†āĻ‡āĻŸāĻŋāĻ†āĻ°-āĻ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ›āĻŋāĻ˛āĨ¤

āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻāĻŸāĻŋ āĻ•ā§‹āĻ¨āĻ“ āĻ—ā§‹āĻĒāĻ¨ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻ¨āĻ¯āĻŧ āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻ¸ā§āĻĨ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻšāĻžāĻŦāĻŋāĻ•āĻžāĻ āĻŋ āĻšāĻ˛ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻ•ā§āĻ°āĻŽāĻŋāĻ• āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻāĻŦāĻ‚ āĻ­āĻŋāĻ¤āĻ°ā§‡ āĻĨāĻžāĻ•āĻž āĻĄā§‡āĻŸāĻžāĻ° āĻ…āĻ–āĻŖā§āĻĄāĻ¤āĻž āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°āĻžāĨ¤ āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ‡ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡ WAL-G āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¤āĻž āĻŦāĻ˛āĻŦ, āĻāĻŦāĻ‚ āĻ†āĻŽāĻ°āĻž āĻĒāĻ°ā§‡ āĻšā§‡āĻ•āĻ—ā§āĻ˛āĻŋāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻŦāĨ¤

āĻāĻŸāĻŋ āĻĒā§ƒāĻĨāĻ•āĻ­āĻžāĻŦā§‡ āĻ˛āĻ•ā§āĻˇ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¯ā§‡āĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ (āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ¯āĻž āĻ‰ā§ŽāĻĒāĻžāĻĻāĻ¨ āĻ¨āĻ¯āĻŧ) āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ S3-āĻ āĻāĻ•āĻŸāĻŋ āĻĒāĻ āĻ¨āĻ¯ā§‹āĻ—ā§āĻ¯ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯āĻžāĻ¤ā§‡ āĻĻā§āĻ°ā§āĻ˜āĻŸāĻ¨āĻžāĻ•ā§āĻ°āĻŽā§‡ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒāĻ—ā§āĻ˛āĻŋ āĻ“āĻ­āĻžāĻ°āĻ°āĻžāĻ‡āĻŸ āĻ¨āĻž āĻšāĻ¯āĻŧāĨ¤ WAL-G-āĻāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ—ā§āĻ°ā§āĻĒ āĻ¨ā§€āĻ¤āĻŋāĻ¤ā§‡ S3 āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ…āĻ§āĻŋāĻ•āĻžāĻ°āĻ—ā§āĻ˛āĻŋ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ (āĻĒā§āĻ°āĻ­āĻžāĻŦ: āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻāĻŋāĻ¨): s3: GetObject, s3:āĻ˛āĻŋāĻ¸ā§āĻŸāĻŦāĻžāĻ•ā§‡āĻŸ, s3: GetBucketLocation. āĻāĻŦāĻ‚, āĻ…āĻŦāĻļā§āĻ¯āĻ‡, āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻ­ā§āĻ˛āĻŦā§‡āĻ¨ āĻ¨āĻž āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻ—āĻžāĻ°_āĻŽā§‹āĻĄ = āĻŦāĻ¨ā§āĻ§ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻĢāĻžāĻ‡āĻ˛ā§‡ postgresql.conf, āĻ¯āĻžāĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻļāĻžāĻ¨ā§āĻ¤āĻ­āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻžāĻ• āĻ†āĻĒ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¯āĻŧ āĻ¨āĻžāĨ¤

āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻšāĻžāĻ¤ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻŽāĻžāĻ¨ā§āĻ¯ āĻ†āĻ¨ā§āĻĻā§‹āĻ˛āĻ¨ āĻ¸āĻ™ā§āĻ—ā§‡ āĻŦāĻžāĻšāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ¸āĻŽāĻ¸ā§āĻ¤ PostgreSQL āĻĄā§‡āĻŸāĻž āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻšāĻšā§āĻ›ā§‡ (āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ¸āĻš), āĻ¤āĻžāĻ‡ āĻ†āĻĒāĻ¨āĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ…āĻ¤ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¸āĻ¤āĻ°ā§āĻ•āĻ¤āĻž āĻ…āĻŦāĻ˛āĻŽā§āĻŦāĻ¨ āĻ•āĻ°ā§āĻ¨āĨ¤

#!/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

āĻ¯āĻžāĻ°āĻž āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ°ā§‡āĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¤āĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻŦā§āĻ¯āĻžāĻļ āĻŽā§āĻ¯āĻžāĻœāĻŋāĻ•ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ›ā§‹āĻŸ āĻ…āĻ‚āĻļ āĻ¨ā§€āĻšā§‡ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¯āĻžāĻ¤ā§‡ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ°ā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻšāĻ˛ā§‡, āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¨-āĻœāĻŋāĻ°ā§‹ āĻāĻ•ā§āĻ¸āĻŋāĻŸ āĻ•ā§‹āĻĄ āĻ¸āĻš āĻ•ā§āĻ°ā§āĻ¯āĻžāĻļ āĻšāĻŦā§‡āĨ¤ āĻāĻ‡ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡, āĻ¸āĻŋāĻ—āĻ¨ā§āĻ¯āĻžāĻ˛ āĻĢāĻžāĻ‡āĻ˛āĻŸāĻŋ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻ–ā§āĻāĻœā§‡ āĻŦā§‡āĻ° āĻ•āĻ°āĻ¤ā§‡ 120 āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡āĻ° āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ (āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŽā§‹āĻŸ 5 āĻŽāĻŋāĻ¨āĻŋāĻŸ) 10āĻŸāĻŋ āĻšā§‡āĻ• āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ (āĻāĻ° āĻ…āĻ°ā§āĻĨ āĻšāĻ˛ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ¸āĻĢāĻ˛ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡):

#!/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

āĻ¸āĻĢāĻ˛ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ°ā§‡āĻ° āĻĒāĻ°ā§‡, āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ†āĻŦāĻžāĻ° āĻļā§āĻ°ā§ āĻ•āĻ°āĻ¤ā§‡ āĻ­ā§āĻ˛āĻŦā§‡āĻ¨ āĻ¨āĻž (pgbouncer/monit, āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ)āĨ¤

āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ°ā§‡āĻ° āĻĒāĻ°ā§‡ āĻĄā§‡āĻŸāĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻĒā§āĻ¨āĻƒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ā§‡āĻ° āĻĒāĻ°ā§‡ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻ…āĻ–āĻŖā§āĻĄāĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻ…āĻĒāĻ°āĻŋāĻšāĻžāĻ°ā§āĻ¯, āĻ¯āĻžāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ™ā§āĻ—āĻž/āĻ•ā§āĻŸāĻŋāĻ˛ āĻŦā§āĻ¯āĻžāĻ•āĻ†āĻĒ āĻ¸āĻš āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ¨āĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻ—āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻŸāĻŋ āĻ•āĻ°āĻž āĻ†āĻ°āĻ“ āĻ­āĻžāĻ˛, āĻ¤āĻŦā§‡ āĻ•ā§‹āĻĨāĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ¤āĻž āĻ•ā§‡āĻŦāĻ˛āĻŽāĻžāĻ¤ā§āĻ° āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻ˛ā§āĻĒāĻ¨āĻžāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡ (āĻ†āĻĒāĻ¨āĻŋ āĻĒā§āĻ°āĻ¤āĻŋ āĻ˜āĻ¨ā§āĻŸāĻžāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ¤ā§‡ āĻĒā§ƒāĻĨāĻ• āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻŦāĻžāĻĄāĻŧāĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻŦāĻž CI-āĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻšā§‡āĻ• āĻšāĻžāĻ˛āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨)āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¨ā§āĻ¯ā§‚āĻ¨āĻ¤āĻŽāĻ­āĻžāĻŦā§‡, āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻĄā§‡āĻŸāĻž āĻāĻŦāĻ‚ āĻ¸ā§‚āĻšāĻ•āĻ—ā§āĻ˛āĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤

āĻĄā§‡āĻŸāĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻĄāĻžāĻŽā§āĻĒā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹ āĻ¯āĻĨā§‡āĻˇā§āĻŸ, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻ†āĻ°āĻ“ āĻ­āĻžāĻ˛ āĻ¯ā§‡ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ†āĻĒāĻ¨āĻŋ āĻšā§‡āĻ•āĻ¸āĻžāĻŽāĻ—ā§āĻ˛āĻŋ āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨ (āĻĄā§‡āĻŸāĻž āĻšā§‡āĻ•āĻ¸āĻžāĻŽ):

#!/bin/bash

if ! su - postgres -c 'pg_dumpall > /dev/null'
then
    echo 'pg_dumpall failed'
    exit 125
fi

āĻ¸ā§‚āĻšā§€ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ - āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ amcheck āĻŽāĻĄāĻŋāĻ‰āĻ˛, āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ•ā§‹āĻ¯āĻŧā§‡āĻ°āĻŋ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻ• WAL-G āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻāĻŦāĻ‚ āĻāĻŸāĻŋāĻ° āĻšāĻžāĻ°āĻĒāĻžāĻļā§‡ āĻāĻ•āĻŸā§ āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨:

#!/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

āĻ¸āĻ‚āĻ•ā§āĻˇāĻŋāĻĒā§āĻ¤āĻ¸āĻžāĻ°

āĻ†āĻŽāĻŋ āĻ†āĻ¨ā§āĻĻā§āĻ°ā§‡ āĻŦā§‹āĻ°ā§‹āĻĄāĻŋāĻ¨ā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻ•ā§ƒāĻ¤āĻœā§āĻžāĻ¤āĻž āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ āĻĒā§āĻ°āĻ•āĻžāĻļāĻ¨āĻžāĻŸāĻŋ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¤āĻžāĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŦāĻ‚ WAL-G āĻāĻ° āĻ‰āĻ¨ā§āĻ¨āĻ¯āĻŧāĻ¨ā§‡ āĻ¤āĻžāĻ° āĻ…āĻŦāĻĻāĻžāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻŋāĻļā§‡āĻˇ āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ!

āĻāĻŸāĻŋ āĻāĻ‡ āĻ¨ā§‹āĻŸāĻŸāĻŋ āĻļā§‡āĻˇ āĻ•āĻ°ā§‡āĨ¤ āĻ†āĻŽāĻŋ āĻ†āĻļāĻž āĻ•āĻ°āĻŋ āĻ¯ā§‡ āĻ†āĻŽāĻŋ āĻ¸ā§‡āĻŸāĻ†āĻĒā§‡āĻ° āĻ¸āĻšāĻœāĻ¤āĻž āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§‹āĻŽā§āĻĒāĻžāĻ¨āĻŋāĻ¤ā§‡ āĻāĻ‡ āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻŦāĻŋāĻļāĻžāĻ˛ āĻ¸āĻŽā§āĻ­āĻžāĻŦāĻ¨āĻž āĻœāĻžāĻ¨āĻžāĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĨ¤ āĻ†āĻŽāĻŋ WAL-G āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ•āĻŋāĻ›ā§ āĻļā§āĻ¨ā§‡āĻ›āĻŋ, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻŦāĻ¸ā§‡ āĻŦāĻ¸ā§‡ āĻāĻŸāĻŋ āĻŦā§‡āĻ° āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒāĻ°ā§āĻ¯āĻžāĻĒā§āĻ¤ āĻ¸āĻŽāĻ¯āĻŧ āĻĒāĻžāĻ‡āĻ¨āĻŋāĨ¤ āĻāĻŦāĻ‚ āĻ†āĻŽāĻŋ āĻŦāĻžāĻĄāĻŧāĻŋāĻ¤ā§‡ āĻāĻŸāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡, āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ†āĻŽāĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻŦā§‡āĻ°āĻŋāĻ¯āĻŧā§‡ āĻāĻ¸ā§‡āĻ›ā§‡āĨ¤

āĻ†āĻ˛āĻžāĻĻāĻžāĻ­āĻžāĻŦā§‡, āĻāĻŸāĻŋ āĻ˛āĻ•ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻ¯ā§‡ WAL-G āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ DBMS āĻāĻ° āĻ¸āĻžāĻĨā§‡āĻ“ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡:

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨