WAL-GαŸ– αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ αž“αž·αž„αž€αžΆαžšαžŸαŸ’αžαžΆαžš PostgreSQL DBMS

αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αž‡αžΆαž™αžΌαžšαž˜αž€αž αžΎαž™αžαžΆαž€αžΆαžšαž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„ SQL dumps (αžŠαŸ„αž™αž”αŸ’αžšαžΎ pg_dump ឬ pg_dumpall) αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž‚αŸ†αž“αž·αžαž›αŸ’αž’αž‘αŸαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ PostgreSQL DBMS αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ pg_basebackupαžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αž‚αŸ„αž›αž–αžΈαžšαž“αŸƒαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» WAL αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαž·αž€αŸ’αžŸαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αž˜αžΌαž›αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„ αž“αž·αž„αž€αžΆαžšαžŸαŸ’αžαžΆαžšαž‘αžΎαž„αžœαž·αž‰ αž’αŸ’αž“αž€αž“αžΉαž„αž™αž›αŸ‹αžαžΆαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŸαžšαžŸαŸαžšαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž”αžΈαž€αž„αŸ‹αž”αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡ αž“αž·αž„αž˜αž·αž“αž’αŸ’αžœαžΎαž±αŸ’αž™αž’αŸ’αž“αž€αžˆαžΊαž…αžΆαž”αŸ‹αž‘αžΆαŸ†αž„αžαžΆαž„αž›αžΎ αž“αž·αž„αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαžˆαžΊαž…αžΆαž”αŸ‹ WAL-G αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αŸ”

WAL-G αž‚αžΊβ€‹αž‡αžΆβ€‹αž§αž”αž€αžšαžŽαŸβ€‹αžŠαŸ‚αž›β€‹αžŸαžšαžŸαŸαžšβ€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„ Go αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αžΆαžšβ€‹αž”αž˜αŸ’αžšαž»αž„β€‹αž‘αž»αž€ αž“αž·αž„β€‹αžŸαŸ’αžŠαžΆαžšβ€‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“β€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL (αž αžΎαž™αžαŸ’αž˜αžΈαŸ—αž“αŸαŸ‡ MySQL/MariaDB, MongoDB αž“αž·αž„ FoundationDB) αžœαžΆαž‚αžΆαŸ†αž‘αŸ’αžšαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Amazon S3 storage (αž“αž·αž„ analogues αž§αž‘αžΆαž αžšαžŽαŸ Yandex Object Storage) αž€αŸαžŠαžΌαž…αž‡αžΆ Google Cloud Storage, Azure Storage, Swift Object Storage αž“αž·αž„αžŸαžΆαž˜αž‰αŸ’αž‰αž‡αžΆαž˜αž½αž™αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαŸ” αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž‘αžΆαŸ†αž„αž˜αžΌαž›αž…αž»αŸ‡αž‘αŸ…αž‡αŸ†αž αžΆαž“αžŸαžΆαž˜αž‰αŸ’αž‰αŸ— αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž’αžαŸ’αžαž”αž‘αž’αŸ†αž–αžΈαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαžΆαž™αž”αŸ‰αžΆαž™αž–αžΆαžŸαž–αŸαž‰αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αž αž˜αž·αž“αž˜αžΆαž“αžŸαŸ€αžœαž—αŸ…αžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž–αŸαž‰αž›αŸαž‰αžŠαŸ‚αž›αž“αžΉαž„αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αŸ†αž αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαžŠαžΎαž˜αžŠαž›αŸ‹αž…αž”αŸ‹ (αž˜αžΆαž“αž”αŸ’αžšαž€αžΆαžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž›αžΎ Habre, αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž…αŸ†αžŽαž»αž…αž‡αžΆαž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαž€αžαžΆαž“αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡) αŸ”

WAL-GαŸ– αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ αž“αž·αž„αž€αžΆαžšαžŸαŸ’αžαžΆαžš PostgreSQL DBMS

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‡αžΆαž…αž˜αŸ’αž”αž„ αžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž”αž…αŸ†αž‡αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž“αžΌαžœαž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆ DBA αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αž”αž„αŸ’αž αžΆαž‰αžαŸ’αž›αž½αž“αž―αž„αž‡αžΆαž—αžΆαžŸαžΆαžšαž”αžŸαŸ‹αž§αž”αžΆαžŸαž€αž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆαž˜αž½αž™ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αžΆαžšαž€αŸ‚αžαž˜αŸ’αžšαžΌαžœαžŽαžΆαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αžœαžΆαž‚αž˜αž“αŸ!

αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆ αžαŸ’αž‰αž»αŸ†αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‚αžΊαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’ αž“αž·αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ PostgreSQL 12.3 αž“αŸ…αž›αžΎαž’αŸŠαžΌαž”αŸŠαž»αž“αž‘αžΌ 18.04 αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž‡αžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹

αž“αŸ…αž–αŸαž›αžŸαžšαžŸαŸαžšαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž€αŸ†αžŽαŸ‚αžŸαŸ’αžαŸαžšαž—αžΆαž–αž“αŸƒ WAL-G αž‚αžΊ v0.2.15 (αž˜αžΈαž“αžΆ 2020). αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎ (αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž”αž„αŸ’αž€αžΎαžαžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž–αžΈαžŸαžΆαžαžΆαž˜αŸαž“αŸ„αŸ‡ αžƒαŸ’αž›αžΆαŸ†αž„ github αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡αŸ”) αžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΆαž‰αž™αž€ αž“αž·αž„αžŠαŸ†αž‘αžΎαž„ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαŸ–

#!/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 bucket" αž“αž·αž„αž‚αŸ’αžšαžΆαž”αŸ‹αž…αž»αž…αž…αžΌαž›αŸ”

αž’αžαŸ’αžαž”αž‘αž˜αž»αž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž’αŸ†αž–αžΈ WAL-G αž”αžΆαž“αž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž“αŸαŸ‡ αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžΆαž…αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ… αž―αž€αžŸαžΆαžš .walg.json αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž•αŸ’αž‘αŸ‡αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎ postgres αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžœαžΆ αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž” bash αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

#!/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 αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ‚αž›αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€αž‘αžΎαž„ (αž’αŸ’αž“αž€αž’αžΆαž…αž‘αŸ… root αž¬αž‘αŸ…αžαžαž˜αž½αž™);
  • AWS_ACCESS_KEY_ID - αžŸαŸ„αž…αžΌαž›αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„ S3 (αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸƒαž€αžΆαžšαž„αžΎαž”αž‘αžΎαž„αžœαž·αž‰αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŸαžΆαž€αž›αŸ’αž”αž„ αžŸαŸ„αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αž‚αŸ„αž›αž€αžΆαžšαžŽαŸ ReadOnly! αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αžŸαŸ’αžαžΈαž–αžΈαž€αžΆαžšαž„αžΎαž”αž‘αžΎαž„αžœαž·αž‰αŸ”);
  • AWS_SECRET_ACCESS_KEY - αžŸαŸ„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αž‘αž»αž€ S3;
  • WALG_COMPRESSION_METHOD - αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž”αž„αŸ’αž αžΆαž”αŸ‹ αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎ Brotli (αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž“αŸαŸ‡αž‚αžΊαž‡αžΆαž˜αž’αŸ’αž™αž˜αž˜αžΆαžŸαžšαžœαžΆαž„αž‘αŸ†αž αŸ†αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž“αž·αž„αž›αŸ’αž”αžΏαž“αž”αž„αŸ’αž αžΆαž”αŸ‹/αž”αž„αŸ’αžšαž½αž˜);
  • WALG_DELTA_MAX_STEPS - αž…αŸ†αž“αž½αž“αž“αŸƒ "deltas" αž˜αž»αž“αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž–αŸαž‰αž›αŸαž‰ (αž–αž½αž€αž‚αŸαžŸαž“αŸ’αžŸαŸ†αžŸαŸ†αž…αŸƒαž–αŸαž›αžœαŸαž›αžΆαž“αž·αž„αž‘αŸ†αž αŸ†αž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž‘αžΆαž‰αž™αž€αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αžΆαž…αž”αž“αŸ’αžαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αžαžΆαžšαž‘αžΎαž„αžœαž·αž‰αž”αž“αŸ’αžαž·αž…αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ†αž±αŸ’αž™αž”αŸ’αžšαžΎαžαž˜αŸ’αž›αŸƒαž’αŸ†αž‘αŸ);
  • PGDATA - αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αžαžαžŠαŸ‚αž›αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ (αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αžŠαŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ pg_lsclusters);
  • PGHOST - αž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžœαžΆαžαžΆαž˜αžšαž™αŸˆαžšαž“αŸ’αž’ unix αžŠαžΌαž…αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡αŸ”

αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαŸ– 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_level - αžαžΎαž–αŸαžαŸŒαž˜αžΆαž“αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαžŸαžšαžŸαŸαžšαž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» WAL, "αž…αž˜αŸ’αž›αž„" - αžŸαžšαžŸαŸαžšαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„;
  • αžšαž”αŸ€αž”αž”αžŽαŸ’αžŽαžŸαžΆαžš - αž”αžΎαž€αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» WAL αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž–αžΈαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš archive_command;
  • archive_command - αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» WAL αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αŸ”
  • αž”αžŽαŸ’αžŽαžŸαžΆαžš_αž’αžŸαŸ‹αž–αŸαž› - αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžαŸ‚αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš / αž”αž“αŸ’αžαŸ‚αž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαž·αž…αžαž½αž…αž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αŸ„αŸ‡αžœαžΆαžŸαž˜αž αŸαžαž»αž•αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αžœαž·αž“αžΆαž‘αžΈ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αžŠαŸ„αž™αž”αž„αŸ’αžαŸ† (αžαŸ’αž‰αž»αŸ†αžŸαžšαžŸαŸαžšαž™αŸ‰αžΆαž„αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž‘αŸ…αž›αžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαžšαŸ€αž„αžšαžΆαž›αŸ‹αžœαž·αž“αžΆαž‘αžΈ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž˜αž·αž“αž€αŸ†αžŽαžαŸ‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜αž‘αŸαŸ”);
  • restore_command - αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžŠαžΆαžšαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» WAL αž–αžΈαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžŸαž·αž“αž”αžΎ "αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž–αŸαž‰αž›αŸαž‰" (αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“) αžαŸ’αžœαŸ‡αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αž―αž€αžŸαžΆαžšαž•αŸ’αž›αžΌαžœαž€αžΆαžšαŸ– https://postgrespro.ru/docs/postgresql/12/runtime-config-wal.

αžšαŸ€αž”αž…αŸ†αž€αžΆαž›αžœαž·αž—αžΆαž‚αž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€

αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αŸαž’αžΆαž…αž“αž·αž™αžΆαž™αž”αžΆαž“ αžœαž·αž’αžΈαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ†αž•αž»αžαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαž‚αžΊ cron αŸ” αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αŸ” αž…αžΌαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž–αŸαž‰αž›αŸαž‰: αž“αŸ…αž€αŸ’αž“αž»αž„ wal-g αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ - αžšαž»αž‰. αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαžŠαŸ†αž”αžΌαž„ αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αžŠαŸ„αž™αžŠαŸƒαž–αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ postgres αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαž›αŸ’αž’ (αž αžΎαž™αž˜αž·αž“αž˜αžΆαž“αž€αŸ†αž αž»αžŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž‘αŸ)αŸ–

#!/bin/bash

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

αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž“αŸƒαž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αž–αžΈαž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž‘αž·αž“αŸ’αž“αž“αŸαž™ - αžαŸ’αž‰αž»αŸ†αžšαŸ†αž›αžΉαž€αž’αŸ’αž“αž€αžαžΆαž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αžœαžΆαž”αžΆαž“αžŠαŸ„αž™αž€αžΆαžšαžšαžαŸ‹ pg_lsclusters.

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αŸ†αž αž»αžŸ αž αžΎαž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€αž‘αŸ…αž€αŸ’αž“αž»αž„ S3 storage αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαžΆαž˜αž€αžΆαž›αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ crontabαŸ–

#!/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 αž–αŸ’αžšαžΉαž€αŸ”

αž€αžΆαžšαž›αž»αž”αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž…αžΆαžŸαŸ‹

αž—αžΆαž‚αž…αŸ’αžšαžΎαž“ αž’αŸ’αž“αž€αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžšαž€αŸ’αžŸαžΆαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαžŸαž˜αŸαž™ Mesozoic αž“αŸ„αŸ‡αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαž“αžΉαž„αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž€αŸ’αž“αž»αž„αž€αžΆαžš "αžŸαž˜αŸ’αž’αžΆαž" αž€αžΆαžšαž•αŸ’αž‘αž»αž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‡αžΆαž‘αŸ€αž„αž‘αžΆαžαŸ‹ (αž‘αžΆαŸ†αž„ "αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž–αŸαž‰αž›αŸαž‰" αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» WAL) αŸ” αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αžαžΆαž˜αžšαž™αŸˆαž€αž·αž…αŸ’αž…αž€αžΆαžš cronαŸ–

#!/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 αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αŸαŸ‡αž‡αžΆαžšαŸ€αž„αžšαžΆαž›αŸ‹αžαŸ’αž„αŸƒαž“αŸ…αž˜αŸ‰αŸ„αž„ 6:30 αž–αŸ’αžšαžΉαž€ αžŠαŸ„αž™αž›αž»αž”αž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ (αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž–αŸαž‰αž›αŸαž‰ deltas αž“αž·αž„ WALs) αž›αžΎαž€αž›αŸ‚αž„αžαŸ‚αž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž™αŸˆαž–αŸαž› 10 αžαŸ’αž„αŸƒαž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‘αž»αž€αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž˜αž½αž™ αžšαž αžΌαžαžŠαž›αŸ‹αž‘αŸ… αž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž…αŸ†αžŽαž»αž…αžŽαžΆαž˜αž½αž™αŸ” послС αž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„ PITR αŸ”

αž€αžΆαžšαžŸαŸ’αžŠαžΆαžšαž‘αžΎαž„αžœαž·αž‰αž–αžΈαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€

αžœαžΆαž‚αŸ’αž˜αžΆαž“αž’αžΆαžαŸŒαž€αŸ†αž”αžΆαŸ†αž„αž‘αŸαžŠαŸ‚αž›αž‚αž“αŸ’αž›αžΉαŸ‡αž“αŸƒαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž»αžαž—αžΆαž–αž›αŸ’αž’αž‚αžΊαž€αžΆαžšαžŸαŸ’αžŠαžΆαžšαž‘αžΎαž„αžœαž·αž‰αžαžΆαž˜αž€αžΆαž›αž€αŸ†αžŽαžαŸ‹ αž“αž·αž„αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αŸ” αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž–αžΈαžšαž”αŸ€αž”αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžŠαžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎ WAL-G αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž“αŸαŸ‡ αž αžΎαž™αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ”

αžœαžΆαž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžŠαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαžŸαžΆαž€αž›αŸ’αž”αž„ (αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž€αžΆαžšαž•αž›αž·αž) αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎαž‚αžŽαž“αžΈ Read Only αž“αŸ…αž€αŸ’αž“αž»αž„ S3 αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αžŸαžšαžŸαŸαžšαž‡αžΆαž“αŸ‹αž›αžΎαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αžŠαŸ„αž™αž…αŸƒαžŠαž“αŸ’αž™αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈ WAL-G αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αžŸαž·αž‘αŸ’αž’αž·αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ S3 αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž€αŸ’αžšαž»αž˜ (αž”αŸ‚αž”αž•αŸ‚αž“αŸ– αž’αž“αž»αž‰αŸ’αž‰αžΆαž): s3: GetObject, s3: ListBucket, s3: GetBucketLocation. αž αžΎαž™αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž€αž»αŸ†αž—αŸ’αž›αŸαž…αž€αŸ†αžŽαžαŸ‹ archive_mode=αž”αž·αž‘ αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ 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

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŠαŸ‚αž›αž…αž„αŸ‹αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž„αžΎαž”αž‘αžΎαž„αžœαž·αž‰ αž”αŸ†αžŽαŸ‚αž€αžαžΌαž…αž˜αž½αž™αž“αŸƒαžœαŸαž‘αž˜αž“αŸ’αž bash αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž“αŸ…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡ αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž“αžΉαž„αž‚αžΆαŸ†αž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž›αŸαžαž€αžΌαžŠαž…αŸαž‰αžŠαŸ‚αž›αž˜αž·αž“αžŸαžΌαž“αŸ’αž™αŸ” αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡ αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž…αŸ†αž“αž½αž“ 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)αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž’αž”αŸ’αž”αž”αžšαž˜αžΆ αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„αž›αž·αž”αž·αž€αŸ’αžšαž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž”αŸ„αŸ‡αž…αŸ„αž› αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŠαŸ‚αž›αžαžΆαž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž’αŸ’αž“αž€αž”αžΆαž“αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš checksums (αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™):

#!/bin/bash

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

αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž›αž·αž”αž·αž€αŸ’αžšαž˜ - αž˜αžΆαž“ αž˜αŸ‰αžΌαžŒαž»αž› amcheckαž…αžΌαžšαž™αžΎαž„αž™αž€αžŸαŸ†αžŽαž½αžš sql αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαž–αžΈ αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž 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

αžŸαž„αŸ’αžαŸαž”

αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αžαŸ’αž›αŸ‚αž„αž’αŸ†αžŽαžšαž‚αž»αžŽαž…αŸ†αž–αŸ„αŸ‡ Andrey Borodin αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‡αŸ†αž“αž½αž™αžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™ αž“αž·αž„αž’αžšαž‚αž»αžŽαž‡αžΆαž–αž·αžŸαŸαžŸαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαžšαž½αž˜αž…αŸ†αžŽαŸ‚αž€αžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ WAL-G!

αž“αŸαŸ‡αž”αž‰αŸ’αž…αž”αŸ‹αž€αŸ†αžŽαžαŸ‹αž…αŸ†αžŽαžΆαŸ†αž“αŸαŸ‡αŸ” αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαžαŸ’αž‰αž»αŸ†αž’αžΆαž…αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αŸƒαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αžŸαž€αŸ’αžαžΆαž“αž»αž–αž›αžŠαŸαž’αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž§αž”αž€αžšαžŽαŸαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž›αžΊαž…αŸ’αžšαžΎαž“αž’αŸ†αž–αžΈ WAL-G αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αžŠαŸ‚αž›αž˜αžΆαž“αž–αŸαž›αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž’αž„αŸ’αž‚αž»αž™αž…αž»αŸ‡ αž αžΎαž™αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžœαžΆαž‘αŸαŸ” αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžœαžΆαž“αŸ…αž•αŸ’αž‘αŸ‡ αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž”αžΆαž“αž…αŸαž‰αž–αžΈαžαŸ’αž‰αž»αŸ†αŸ”

αžŠαŸ„αž™αž‘αŸ‚αž€αžœαžΆαž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆ WAL-G αž€αŸαž’αžΆαž…αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ DBMS αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž”αžΆαž“αžŠαŸ‚αžšαŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹