WAL-G: เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชกเซ€เชฌเซ€เชเชฎเชเชธเชจเซเช‚ เชฌเซ‡เช•เช…เชช เช…เชจเซ‡ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชคเชฟ

เชคเซ‡ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏเชฅเซ€ เชœเชพเชฃเซ€เชคเซเช‚ เช›เซ‡ เช•เซ‡ SQL เชกเชฎเซเชชเชฎเชพเช‚ เชฌเซ‡เช•เช…เชช เชฌเชจเชพเชตเชตเซเช‚ (เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ pg_dump เช…เชฅเชตเชพ pg_dumpall) เช เชธเชพเชฐเซ‹ เชตเชฟเชšเชพเชฐ เชจเชฅเซ€. PostgreSQL DBMS เชจเซ‹ เชฌเซ‡เช•เช…เชช เชฒเซ‡เชตเชพ เชฎเชพเชŸเซ‡, เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชตเชงเซ เชธเชพเชฐเซเช‚ เช›เซ‡ pg_basebackup, เชœเซ‡ WAL เชฒเซ‹เช—เชจเซ€ เชฌเชพเชˆเชจเชฐเซ€ เช•เซ‹เชชเซ€ เชฌเชจเชพเชตเซ‡ เช›เซ‡. เชชเชฐเช‚เชคเซ เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชจเช•เชฒ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชธเชฎเช—เซเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ‹ เช›เซ‹, เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชธเชฎเชœเซ€ เชถเช•เชถเซ‹ เช•เซ‡ เช† เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ เชฌเซ‡ เชŸเซเชฐเชพเช‡เชธเชพเช‡เช•เชฒ เชฒเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเชจเซ‡ เช‰เชชเชฐ เช…เชจเซ‡ เชจเซ€เชšเซ‡ เชฌเช‚เชจเซ‡ เชฐเซ€เชคเซ‡ เชชเซ€เชกเชพ เชจ เชฅเชพเชฏ. เชฆเซเชƒเช– เชฆเซ‚เชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, WAL-G เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€.

WAL-G เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชกเซ‡เชŸเชพเชฌเซ‡เชธเซ‡เชธเชจเซ‹ เชฌเซ‡เช•เช…เชช เชฒเซ‡เชตเชพ เช…เชจเซ‡ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช—เซ‹เชฎเชพเช‚ เชฒเช–เชพเชฏเซ‡เชฒเซเช‚ เชธเชพเชงเชจ เช›เซ‡ (เช…เชจเซ‡ เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ MySQL/MariaDB, MongoDB เช…เชจเซ‡ FoundationDB). เชคเซ‡ เชเชฎเซ‡เชเซ‹เชจ เชเชธ3 เชธเซเชŸเซ‹เชฐเซ‡เชœ (เช…เชจเซ‡ เชเชจเชพเชฒเซ‹เช—เซเชธ, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฏเชพเชจเซเชกเซ‡เช•เซเชท เช“เชฌเซเชœเซ‡เช•เซเชŸ เชธเซเชŸเซ‹เชฐเซ‡เชœ), เชคเซ‡เชฎเชœ เช—เซ‚เช—เชฒ เช•เซเชฒเชพเช‰เชก เชธเซเชŸเซ‹เชฐเซ‡เชœ, เชเชเซเชฏเซเชฐ เชธเซเชŸเซ‹เชฐเซ‡เชœ, เชธเซเชตเชฟเชซเซเชŸ เช“เชฌเซเชœเซ‡เช•เซเชŸ เชธเซเชŸเซ‹เชฐเซ‡เชœ เช…เชจเซ‡ เชซเช•เซเชค เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซเช‚ เชธเชฎเชฐเซเชฅเชจ เช•เชฐเซ‡ เช›เซ‡. เช†เช–เซเช‚ เชธเซ‡เชŸเช…เชช เชธเชฐเชณ เชชเช—เชฒเชพเช‚เช“ เชชเชฐ เช†เชตเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เชนเช•เซ€เช•เชคเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช•เซ‡ เชคเซ‡เชจเชพ เชตเชฟเชถเซ‡เชจเชพ เชฒเซ‡เช–เซ‹ เชธเชฎเช—เซเชฐ เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชชเชฐ เชซเซ‡เชฒเชพเชฏเซ‡เชฒเชพ เช›เซ‡, เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชธเช‚เชชเซ‚เชฐเซเชฃ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚ เชคเซ‡ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ เชจเชฅเซ€ เชœเซ‡เชฎเชพเช‚ เชถเชฐเซ‚เช†เชคเชฅเซ€ เชธเชฎเชพเชชเซเชคเชฟ เชธเซเชงเซ€เชจเชพ เชคเชฎเชพเชฎ เชชเช—เชฒเชพเช‚ เชถเชพเชฎเซ‡เชฒ เชนเซ‹เชฏ (เชนเซ‡เชฌเซเชฐเซ‡ เชชเชฐ เช˜เชฃเซ€ เชชเซ‹เชธเซเชŸเซเชธ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซเชฏเชพเช‚ เช˜เชฃเชพ เชฎเซเชฆเซเชฆเชพเช“ เชšเซ‚เช•เซ€ เช—เชฏเชพ เช›เซ‡).

WAL-G: เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชกเซ€เชฌเซ€เชเชฎเชเชธเชจเซเช‚ เชฌเซ‡เช•เช…เชช เช…เชจเซ‡ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชคเชฟ

เช† เชฒเซ‡เช– เชฎเซเช–เซเชฏเชคเซเชตเซ‡ เชฎเชพเชฐเชพ เชœเซเชžเชพเชจเชจเซ‡ เชตเซเชฏเชตเชธเซเชฅเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹. เชนเซเช‚ 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 เชซเชพเช‡เชฒ เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชธ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ€ เชนเซ‹เชฎ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚. เชคเซ‡เชจเซ‡ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชจเซ€เชšเซ‡เชจเซ€ 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 เชฌเช•เซ‡เชŸเชจเซ‹ เชฎเชพเชฐเซเช— เชœเซเชฏเชพเช‚ เชฌเซ‡เช•เช…เชช เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ (เชคเชฎเซ‡ เช•เชพเช‚ เชคเซ‹ เชฐเซ‚เชŸ เชชเชฐ เช…เชฅเชตเชพ เชซเซ‹เชฒเซเชกเชฐเชฎเชพเช‚ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹);
  • 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_level โ€“ WAL เชฒเซ‹เช—เชฎเชพเช‚ เช•เซ‡เชŸเชฒเซ€ เชฎเชพเชนเชฟเชคเซ€ เชฒเช–เชตเซ€, โ€œเชชเซเชฐเชคเชฟเช•เซƒเชคเชฟโ€ โ€“ เชฌเชงเซเช‚ เชฒเช–เซ‹;
  • เช†เชฐเซเช•เชพเช‡เชต_เชฎเซ‹เชก - เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐเชฎเชพเช‚เชฅเซ€ เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ WAL เชฒเซ‹เช— เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพเชจเซเช‚ เชธเช•เซเชทเชฎ เช•เชฐเซ‹ เช†เชฐเซเช•เชพเช‡เชต_เช•เชฎเชพเชจเซเชก;
  • เช†เชฐเซเช•เชพเช‡เชต_เช•เชฎเชพเชจเซเชก - เชชเซ‚เชฐเซเชฃ เชฅเชฏเซ‡เชฒ WAL เชฒเซ‹เช—เชจเซ‡ เช†เชฐเซเช•เชพเช‡เชต เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชฆเซ‡เชถ;
  • เช†เชฐเซเช•เชพเช‡เชต_เชธเชฎเชฏเชธเชฎเชพเชชเซเชค - เชฒเซ‹เช—เชจเซเช‚ เช†เชฐเซเช•เชพเช‡เชตเชฟเช‚เช— เชฎเชพเชคเซเชฐ เชคเซเชฏเชพเชฐเซ‡ เชœ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชชเซ‚เชฐเซเชฃ เชฅเชพเชฏ, เชชเชฐเช‚เชคเซ เชœเซ‹ เชคเชฎเชพเชฐเซเช‚ เชธเชฐเซเชตเชฐ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชฅเซ‹เชกเซ‹ เชกเซ‡เชŸเชพ เชฌเชฆเชฒเซ‡ เช›เซ‡/ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡, เชคเซ‹ เชคเซ‡ เชธเซ‡เช•เช‚เชกเชฎเชพเช‚ เช…เชนเซ€เช‚ เชเช• เชฎเชฐเซเชฏเชพเชฆเชพ เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ‹ เช…เชฐเซเชฅเชชเซ‚เชฐเซเชฃ เช›เซ‡, เชœเซ‡ เชชเช›เซ€ เช†เชฐเซเช•เชพเช‡เชตเชฟเช‚เช— เช†เชฆเซ‡เชถเชจเซ‡ เชฌเชณเชœเชฌเชฐเซ€เชฅเซ€ เชฌเซ‹เชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ (เชนเซเช‚ เชฆเชฐ เชธเซ‡เช•เชจเซเชกเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เช เชชเชฐ เชธเช˜เชจ เชฐเซ€เชคเซ‡ เชฒเช–เซเช‚ เช›เซเช‚, เชคเซ‡เชฅเซ€ เชฎเซ‡เช‚ เช† เชชเชฐเชฟเชฎเชพเชฃเชจเซ‡ เช‰เชคเซเชชเชพเชฆเชจเชฎเชพเช‚ เชธเซ‡เชŸ เชจ เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚);
  • เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค_เช†เชฆเซ‡เชถ - เชœเซ‹ "เชธเช‚เชชเซ‚เชฐเซเชฃ เชฌเซ‡เช•เช…เชช" (เชฌเซ‡เช เชฌเซ‡เช•เช…เชช) เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชจเชตเซ€เชจเชคเชฎ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‹ เช…เชญเชพเชต เชนเซ‹เชฏ เชคเซ‹ เชฌเซ‡เช•เช…เชชเชฎเชพเช‚เชฅเซ€ 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 เชตเชพเช—เซเชฏเซ‡ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡.

เชœเซ‚เชจเชพ เชฌเซ‡เช•เช…เชช เช•เชพเชขเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เชฎเซ‹เชŸเซ‡ เชญเชพเช—เซ‡, เชคเชฎเชพเชฐเซ‡ เชฎเซ‡เชธเซ‹เชเซ‹เช‡เช• เชฏเซเช—เชจเชพ เชคเชฎเชพเชฎ เชฌเซ‡เช•เช…เชชเซเชธ เชฐเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€, เชคเซ‡เชฅเซ€ เชคเซ‡ เชธเชฎเชฏเชพเช‚เชคเชฐเซ‡ เชคเชฎเชพเชฐเชพ เชธเซเชŸเซ‹เชฐเซ‡เชœเชจเซ‡ "เชธเชพเชซ" เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชถเซ‡ (เชฌเช‚เชจเซ‡ "เชธเช‚เชชเซ‚เชฐเซเชฃ เชฌเซ‡เช•เช…เชช" เช…เชจเซ‡ WAL เชฒเซ‹เช—). เช…เชฎเซ‡ เช† เชฌเชงเซเช‚ เช•เซเชฐเซ‹เชจ เช•เชพเชฐเซเชฏ เชฆเซเชตเชพเชฐเชพ เช•เชฐเซ€เชถเซเช‚:

#!/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) เช•เชพเชขเซ€ เชจเชพเช–เชถเซ‡, เชชเชฐเช‚เชคเซ เช“เช›เชพเชฎเชพเช‚ เช“เช›เซเช‚ เชเช• เชฌเซ‡เช•เช…เชช เช›เซ‹เชกเซ€ เชฆเซ‡เชถเซ‡. เชฎเชพเชŸเซ‡ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชคเชพเชฐเซ€เช– เชœเซ‡เชฅเซ€ เช•เซ‹เชˆเชชเชฃ เชฌเชฟเช‚เชฆเซ ะฟะพัะปะต PITR เชฎเชพเช‚ เชคเชพเชฐเซ€เช–เซ‹เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹.

เชฌเซ‡เช•เช…เชชเชฎเชพเช‚เชฅเซ€ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชคเซ‡ เช•เซ‹เชˆ เชฐเชนเชธเซเชฏ เชจเชฅเซ€ เช•เซ‡ เชคเช‚เชฆเซเชฐเชธเซเชค เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเซ€ เชšเชพเชตเซ€ เช เชธเชฎเชฏเชพเช‚เชคเชฐเซ‡ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชจ เช…เชจเซ‡ เช…เช‚เชฆเชฐเชจเชพ เชกเซ‡เชŸเชพเชจเซ€ เช…เช–เช‚เชกเชฟเชคเชคเชพเชจเซ€ เชšเช•เชพเชธเชฃเซ€ เช›เซ‡. เชนเซเช‚ เชคเชฎเชจเซ‡ เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚ 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 เชฎเซ‹เชกเซเชฏเซเชฒ, เชšเชพเชฒเซ‹ เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ 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

เชธเชพเชฐเชพเช‚เชถ เชฎเชพเชŸเซ‡

เชนเซเช‚ เช†เชจเซเชฆเซเชฐเซ‡ เชฌเซ‹เชฐเซ‹เชฆเชฟเชจเชจเซ‡ เชชเซเชฐเช•เชพเชถเชจ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชตเชพ เชฌเชฆเชฒ เชคเซ‡เชฎเชจเซ‹ เช†เชญเชพเชฐ เชตเซเชฏเช•เซเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช…เชจเซ‡ WAL-G เชจเชพ เชตเชฟเช•เชพเชธเชฎเชพเช‚ เชคเซ‡เชฎเชจเชพ เชฏเซ‹เช—เชฆเชพเชจ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซ‡เชท เช†เชญเชพเชฐ!

เช† เช† เชจเซ‹เช‚เชงเชจเซ‡ เชชเซ‚เชฐเซเชฃ เช•เชฐเซ‡ เช›เซ‡. เชนเซเช‚ เช†เชถเชพ เชฐเชพเช–เซเช‚ เช›เซเช‚ เช•เซ‡ เชนเซเช‚ เชธเซ‡เชŸเช…เชชเชจเซ€ เชธเชฐเชณเชคเชพ เช…เชจเซ‡ เชคเชฎเชพเชฐเซ€ เช•เช‚เชชเชจเซ€เชฎเชพเช‚ เช† เชŸเซ‚เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชตเชฟเชถเชพเชณ เชธเช‚เชญเชพเชตเชจเชพ เชตเซเชฏเช•เซเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เชนเชคเซ‹. เชฎเซ‡เช‚ WAL-G เชตเชฟเชถเซ‡ เช˜เชฃเซเช‚ เชธเชพเช‚เชญเชณเซเชฏเซเช‚ เช›เซ‡, เชชเชฐเช‚เชคเซ เช•เซเชฏเชพเชฐเซ‡เชฏ เชฌเซ‡เชธเซ€เชจเซ‡ เชคเซ‡เชจเซ‡ เชธเชฎเชœเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซ‹ เชธเชฎเชฏ เชฎเชณเซเชฏเซ‹ เชจเชฅเซ€. เช…เชจเซ‡ เชฎเซ‡เช‚ เชคเซ‡เชจเซ‡ เช˜เชฐเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซเชฏเชพ เชชเช›เซ€, เช† เชฒเซ‡เช– เชฎเชพเชฐเชพเชฎเชพเช‚เชฅเซ€ เชฌเชนเชพเชฐ เช†เชตเซเชฏเซ‹.

เช…เชฒเช—เชฅเซ€, เช เชจเซ‹เช‚เชงเชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ WAL-G เชจเซ€เชšเซ‡เชจเชพ DBMS เชธเชพเชฅเซ‡ เชชเชฃ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹