WAL-G: PostgreSQL DBMS рдЪреЗ рдмреЕрдХрдЕрдк рдЖрдгрд┐ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддреА

рдПрд╕рдХреНрдпреВрдПрд▓ рдбрдВрдкрдордзреНрдпреЗ рдмреЕрдХрдЕрдк рдмрдирд╡рдгреЗ (рд╡рд╛рдкрд░реВрди pg_dump рдХрд┐рдВрд╡рд╛ pg_dumpall) рд╣реА рдЪрд╛рдВрдЧрд▓реА рдХрд▓реНрдкрдирд╛ рдирд╛рд╣реА. PostgreSQL DBMS рдЪрд╛ рдмреЕрдХрдЕрдк рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА, рдХрдорд╛рдВрдб рд╡рд╛рдкрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ pg_basebackup, рдЬреЗ WAL рд▓реЙрдЧрдЪреА рдмрд╛рдпрдирд░реА рдкреНрд░рдд рдмрдирд╡рддреЗ. рдкрд░рдВрддреБ рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рдкреНрд░рдд рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрдгрд┐ рдкреБрдирд░реНрд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдгреНрдпрд╛рд╕ рдкреНрд░рд╛рд░рдВрдн рдХрд░рд╛рд▓, рддреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рд╕рдордЬреЗрд▓ рдХреА рд╣реЗ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдХрдореАрддрдХрдореА рджреЛрди рдЯреНрд░рд╛рдпрд╕рд╛рдпрдХрд▓ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд░ рдЖрдгрд┐ рдЦрд╛рд▓реА рджреЛрдиреНрд╣реА рд╡реЗрджрдирд╛ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реАрдд. рджреБрдГрдЦ рдХрдореА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, WAL-G рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ.

WAL-G рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕рдЪрд╛ рдмреЕрдХрдЕрдк рдЖрдгрд┐ рдкреБрдирд░реНрд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЧреЛ рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдПрдХ рд╕рд╛рдзрди рдЖрд╣реЗ (рдЖрдгрд┐ рдЕрдЧрджреА рдЕрд▓реАрдХрдбреЗ MySQL/MariaDB, MongoDB рдЖрдгрд┐ FoundationDB). рд╣реЗ Amazon S3 рд╕реНрдЯреЛрд░реЗрдЬ (рдЖрдгрд┐ analogues, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, Yandex Object Storage), рддрд╕реЗрдЪ Google Cloud Storage, Azure Storage, Swift Object Storage рдЖрдгрд┐ рдлрдХреНрдд рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдорд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕ рд╕рдорд░реНрдерди рджреЗрддреЗ. рд╕рдВрдкреВрд░реНрдг рд╕реЗрдЯрдЕрдк рд╕реЛрдкреНрдпрд╛ рдЪрд░рдгрд╛рдВрд╡рд░ рдпреЗрддреЛ, рдкрд░рдВрддреБ рддреНрдпрд╛рдмрджреНрджрд▓рдЪреЗ рд▓реЗрдЦ рдЗрдВрдЯрд░рдиреЗрдЯрд╡рд░ рд╡рд┐рдЦреБрд░рд▓реЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рдореБрд│реЗ, рд╕реБрд░реБрд╡рд╛рддреАрдкрд╛рд╕реВрди рд╢реЗрд╡рдЯрдкрд░реНрдпрдВрддрдЪреНрдпрд╛ рд╕рд░реНрд╡ рдЪрд░рдгрд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЕрд╕рдгрд╛рд░реЗ рдХреЛрдгрддреЗрд╣реА рдкреВрд░реНрдг рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ рдореЕрдиреНрдпреБрдЕрд▓ рдирд╛рд╣реА (рд╣реЕрдмреНрд░реЗрд╡рд░ рдЕрдиреЗрдХ рдкреЛрд╕реНрдЯ рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рддреЗрдереЗ рдмрд░реЗрдЪ рдореБрджреНрджреЗ рдЪреБрдХрд▓реЗ рдЖрд╣реЗрдд).

WAL-G: PostgreSQL DBMS рдЪреЗ рдмреЕрдХрдЕрдк рдЖрдгрд┐ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддреА

рд╣рд╛ рд▓реЗрдЦ рдкреНрд░рд╛рдореБрдЦреНрдпрд╛рдиреЗ рдорд╛рдЭреЗ рдЬреНрдЮрд╛рди рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд▓рд┐рд╣рд┐рд▓рд╛ рдЧреЗрд▓рд╛ рдЖрд╣реЗ. рдореА рдбреАрдмреАрдП рдирд╛рд╣реА рдЖрдгрд┐ рдореА рдХреБрдареЗрддрд░реА рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдгрд╕рд╛рдЪреНрдпрд╛ рднрд╛рд╖реЗрдд рд╕реНрд╡рддрдГрд▓рд╛ рд╡реНрдпрдХреНрдд рдХрд░реВ рд╢рдХрддреЛ, рддреНрдпрд╛рдореБрд│реЗ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реБрдзрд╛рд░рдгрд╛рдВрдЪреЗ рд╕реНрд╡рд╛рдЧрдд рдЖрд╣реЗ!

рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ, рдореА рд▓рдХреНрд╖рд╛рдд рдШреЗрддреЛ рдХреА рдЦрд╛рд▓реА рджрд┐рд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ рдЖрдгрд┐ рдЙрдмрдВрдЯреВ 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_level тАУ WAL рд▓реЙрдЧрдордзреНрдпреЗ рдХрд┐рддреА рдорд╛рд╣рд┐рддреА рд▓рд┐рд╣рд╛рдпрдЪреА, тАЬрдкреНрд░рддрд┐рдХреГрддреАтАЭ тАУ рд╕рд░реНрд╡рдХрд╛рд╣реА рд▓рд┐рд╣рд╛;
  • рд╕рдВрдЧреНрд░рд╣рдг_рдореЛрдб - рдкреЕрд░рд╛рдореАрдЯрд░рдордзреАрд▓ рдХрдорд╛рдВрдб рд╡рд╛рдкрд░реВрди WAL рд▓реЙрдЧ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреЗ рд╕рдХреНрд╖рдо рдХрд░рд╛ archive_command;
  • archive_command - рдкреВрд░реНрдг рдХреЗрд▓реЗрд▓реЗ 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 рд╡рд╛рдЬрддрд╛ рд╕реБрд░реВ рд╣реЛрддреЗ.

рдЬреБрдиреЗ рдмреЕрдХрдЕрдк рд╣рдЯрд╡рдд рдЖрд╣реЗ

рдмрд╣реБрдзрд╛, рддреБрдореНрд╣рд╛рд▓рд╛ рдореЗрд╕реЛрдЭреЛрдЗрдХ рдХрд╛рд▓рдЦрдВрдбрд╛рддреАрд▓ рд╕рд░реНрд╡ рдмреЕрдХрдЕрдкреНрд╕ рдареЗрд╡рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА, рддреНрдпрд╛рдореБрд│реЗ рддреБрдордЪреЗ рд╕реНрдЯреЛрд░реЗрдЬ рд╡реЗрд│реЛрд╡реЗрд│реА "рд╕рд╛рдл рдХрд░рдгреЗ" ("рдкреВрд░реНрдг рдмреЕрдХрдЕрдк" рдЖрдгрд┐ 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: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

рдЬреНрдпрд╛рдВрдирд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдкрд╛рд╕рд╛рдпрдЪреА рдЖрд╣реЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА, рдмреЕрд╢ рдореЕрдЬрд┐рдХрдЪрд╛ рдПрдХ рдЫреЛрдЯрд╛ рддреБрдХрдбрд╛ рдЦрд╛рд▓реА рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ, рдЬреЗрдгреЗрдХрд░реВрди рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддреАрдордзреНрдпреЗ рд╕рдорд╕реНрдпрд╛ рдЖрд▓реНрдпрд╛рд╕, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢реВрдиреНрдп рдирд╕рд▓реЗрд▓реНрдпрд╛ рдирд┐рд░реНрдЧрдорди рдХреЛрдбрд╕рд╣ рдХреНрд░реЕрд╢ рд╣реЛрдИрд▓. рдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдд, рд╕рд┐рдЧреНрдирд▓ рдлрд╛рдЗрд▓ рд╣рдЯрд╡рд▓реА рдЧреЗрд▓реА рдХреА рдирд╛рд╣реА рд╣реЗ рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА 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 рдЦрд╛рд▓реАрд▓ DBMS рд╕рд╣ рджреЗрдЦреАрд▓ рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрддреЗ:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛