WAL-G: PostgreSQL DBMS рдХреЛ рдмреНрдпрд╛рдХрдЕрдк рд░ рд░рд┐рдХрднрд░реА

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

рд╡рд╛рд▓-рдЬреА PostgreSQL рдбрд╛рдЯрд╛рдмреЗрд╕рд╣рд░реВ рдмреНрдпрд╛рдХрдЕрдк рд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ Go рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдПрдЙрдЯрд╛ рдЙрдкрдХрд░рдг рд╣реЛ (рд░ рд╣рд╛рд▓рд╕рд╛рд▓реИ MySQL/MariaDB, MongoDB рд░ FoundationDB)ред рдпрд╕рд▓реЗ Amazon S3 рднрдгреНрдбрд╛рд░рдг (рд░ рдПрдирд╛рд▓рдЧрд╣рд░реВ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрд╛рдиреНрдбреЗрдХреНрд╕ рд╡рд╕реНрддреБ рднрдгреНрдбрд╛рд░рдг), рд╕рд╛рдереИ Google рдХреНрд▓рд╛рдЙрдб рднрдгреНрдбрд╛рд░рдг, Azure рднрдгреНрдбрд╛рд░рдг, рд╕реНрд╡рд┐рдлреНрдЯ рд╡рд╕реНрддреБ рднрдгреНрдбрд╛рд░рдг рд░ рдХреЗрд╡рд▓ рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реАрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред рд╕рдореНрдкреВрд░реНрдг рд╕реЗрдЯрдЕрдк рд╕рд╛рдзрд╛рд░рдг рдЪрд░рдгрд╣рд░реВрдорд╛ рддрд▓ рдЖрдЙрдБрдЫ, рддрд░ рдпрд╕ рддрдереНрдпрдХреЛ рдХрд╛рд░рдгрд▓реЗ рдЧрд░реНрджрд╛ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рд▓реЗрдЦрд╣рд░реВ рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рдЫрд░рд┐рдПрдХрд╛ рдЫрдиреН, рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдкреВрд░реНрдг рдХрд╕рд░реА рдЧрд░реНрдиреЗ рдореНрдпрд╛рдиреБрдЕрд▓ рдЫреИрди рдЬрд╕рдорд╛ рд╕реБрд░реБрджреЗрдЦрд┐ рдЕрдиреНрддреНрдпрд╕рдореНрдо рд╕рдмреИ рдЪрд░рдгрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдиреНрдЫрдиреН (рд╣рдмреНрд░реЗрдорд╛ рдзреЗрд░реИ рдкреЛрд╖реНрдЯрд╣рд░реВ рдЫрдиреН, рддрд░ рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдмрд┐рдиреНрджреБрд╣рд░реВ рдЫреБрдЯреЗрдХрд╛ рдЫрдиреН)ред

WAL-G: PostgreSQL DBMS рдХреЛ рдмреНрдпрд╛рдХрдЕрдк рд░ рд░рд┐рдХрднрд░реА

рдпреЛ рд▓реЗрдЦ рдореБрдЦреНрдпрддрдпрд╛ рдореЗрд░реЛ рдЬреНрдЮрд╛рди рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рд▓реЗрдЦрд┐рдПрдХреЛ рдерд┐рдпреЛред рдо DBA рд╣реЛрдЗрди рд░ рдо рдХрддреИ рдЖрдо рдорд╛рдирд┐рд╕рдХреЛ рднрд╛рд╖рд╛рдорд╛ рд╡реНрдпрдХреНрдд рдЧрд░реНрди рд╕рдХреНрдЫреБ, рддреНрдпрд╕реИрд▓реЗ рдХреБрдиреИ рдкрдирд┐ рд╕реБрдзрд╛рд░ рд╕реНрд╡рд╛рдЧрдд рдЫ!

рдЕрд▓рдЧ рд░реВрдкрдорд╛, рдо рдиреЛрдЯ рдЧрд░реНрдЫреБ рдХрд┐ рддрд▓рдХрд╛ рд╕рдмреИ рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ рдЫрдиреН рд░ Ubuntu 12.3 рдорд╛ PostgreSQL 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 рдмрд╛рд▓реНрдЯреА" рд░ рдкрд╣реБрдБрдЪ рдХреБрдЮреНрдЬреАрд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫред

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 рдмрд╛рд▓реНрдЯреАрдорд╛ рдЬрд╛рдиреЗ рдмрд╛рдЯреЛ рдЬрд╣рд╛рдБ рдмреНрдпрд╛рдХрдЕрдкрд╣рд░реВ рдЕрдкрд▓реЛрдб рд╣реБрдиреЗрдЫрдиреН (рддрдкрд╛рдИрд▓реЗ рд░реВрдЯ рд╡рд╛ рдлреЛрд▓реНрдбрд░рдорд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ);
  • 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 рд▓рдЧ рд╕рдВрдЧреНрд░рд╣ рдЧрд░реНрди рдЖрджреЗрд╢;
  • archive_timeout - рд▓рдЧрд╣рд░реВрдХреЛ рдЕрднрд┐рд▓реЗрдЦ рдкреВрд░рд╛ рднрдПрдкрдЫрд┐ рдорд╛рддреНрд░ рдкреНрд░рджрд░реНрд╢рди рдЧрд░рд┐рдиреНрдЫ, рддрд░ рдпрджрд┐ рддрдкрд╛рдЗрдБрдХреЛ рд╕рд░реНрднрд░рд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдереЛрд░реИ рдбрд╛рдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджрдЫ/рдердкреНрдЫ рднрдиреЗ, рд╕реЗрдХреЗрдиреНрдбрдорд╛ рдпрд╣рд╛рдБ рд╕реАрдорд╛ рд╕реЗрдЯ рдЧрд░реНрдиреБрдХреЛ рдЕрд░реНрде рд╣реБрдиреНрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдЕрднрд┐рд▓реЗрдЦ рдЖрджреЗрд╢ рдЬрдмрд░рдЬрд╕реНрддреА рдмреЛрд▓рд╛рдЗрдиреЗрдЫ (рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдХреЗрдиреНрдб рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдЧрд╣рди рд░реВрдкрдорд╛ рд▓реЗрдЦреНрдЫреБ, рддреНрдпрд╕реИрд▓реЗ рдореИрд▓реЗ рдЙрддреНрдкрд╛рджрдирдорд╛ рдпреЛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд╕реЗрдЯ рдирдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ);
  • restore_command - рдпрджрд┐ "рдкреВрд░реНрдг рдмреНрдпрд╛рдХрдЕрдк" (рдЖрдзрд╛рд░ рдмреНрдпрд╛рдХрдЕрдк) рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рднрд░реНрдЦрд░рдХреЛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдирднрдПрдХреЛ рдЦрдгреНрдбрдорд╛ рдмреНрдпрд╛рдХрдЕрдкрдмрд╛рдЯ WAL рд▓рдЧ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗ рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреЗрдЫред

рддрдкрд╛рдИрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХрд╛рдЧрдЬрд╛рддрдХреЛ рдЕрдиреБрд╡рд╛рджрдорд╛ рдпреА рд╕рдмреИ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдердк рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ: https://postgrespro.ru/docs/postgresql/12/runtime-config-wal.

рдмреНрдпрд╛рдХрдЕрдк рддрд╛рд▓рд┐рдХрд╛ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрджреИ

рдЬреЗ рд╣реЛрд╕реН, рдпрд╕рд▓рд╛рдИ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИрднрдиреНрджрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░рд┐рдХрд╛ рдХреНрд░реЛрди рд╣реЛред рдпреЛ рд╣рд╛рдореА рдмреНрдпрд╛рдХрдЕрдкрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреЗрдЫреМрдВред рдкреВрд░реНрдг рдмреНрдпрд╛рдХрдЕрдк рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрджреЗрд╢рдХреЛ рд╕рд╛рде рд╕реБрд░реВ рдЧрд░реМрдВ: wal-g рдорд╛ рдпреЛ рд╕реБрд░реБрд╡рд╛рдд рддрд░реНрдХ рд╣реЛ рдмреНрдпрд╛рдХрдЕрдк-рдкреБрд╢ред рддрд░ рдкрд╣рд┐рд▓реЗ, рдпреЛ рдЖрджреЗрд╢ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдЪрд▓рд╛рдЙрди рд░рд╛рдореНрд░реЛ рдЫ postgres рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдмрд╛рдЯ рд╕рдмреИ рдХреБрд░рд╛ рдареАрдХ рдЫ рднрдиреЗрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди (рд░ рддреНрдпрд╣рд╛рдБ рдкрд╣реБрдБрдЪ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдЫреИрдирдиреН):

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

рдпрд╕ рдЙрджрд╛рд╣рд░рдгрдорд╛, рдмреНрдпрд╛рдХрдЕрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣рд░реЗрдХ рджрд┐рди рдмрд┐рд╣рд╛рди рек:резрел рдмрдЬреЗ рд╕реБрд░реБ рд╣реБрдиреНрдЫред

рдкреБрд░рд╛рдирд╛ рдмреНрдпрд╛рдХрдЕрдкрд╣рд░реВ рдореЗрдЯрд╛рдЙрдБрджреИ

рд╕рдореНрднрд╡рддрдГ, рддрдкрд╛рдИрдВрд▓реЗ Mesozoic рдпреБрдЧрдХрд╛ рд╕рдмреИ рдмреНрдпрд╛рдХрдЕрдкрд╣рд░реВ рд░рд╛рдЦреНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрди, рддреНрдпрд╕реИрд▓реЗ рдпреЛ рдЖрд╡рдзрд┐рдХ рд░реВрдкрдорд╛ рддрдкрд╛рдИрдВрдХреЛ рднрдгреНрдбрд╛рд░рдг (рджреБрд╡реИ "рдкреВрд░реНрдг рдмреНрдпрд╛рдХрдЕрдк" рд░ 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 рджрд┐рдирдХрд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐рд╣рд░реВ рдмрд╛рд╣реЗрдХ рд╕рдмреИ (рдкреВрд░реНрдг рдмреНрдпрд╛рдХрдЕрдк, рдбреЗрд▓реНрдЯрд╛ рд░ WALs) рдореЗрдЯрд╛рдЙрдиреЗ, рддрд░ рдХрдореНрддрд┐рдорд╛ рдПрдЙрдЯрд╛ рдмреНрдпрд╛рдХрдЕрдк рдЫреЛрдбреЗрд░ред рдЧрд░реНрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд┐рддрд┐ рддрд╛рдХрд┐ рдХреБрдиреИ рдкрдирд┐ рдмрд┐рдиреНрджреБ ╨┐╨╛╤Б╨╗╨╡ рдорд┐рддрд┐рд╣рд░реВ PITR рдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред

рдмреНрдпрд╛рдХрдЕрдкрдмрд╛рдЯ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ

рдпреЛ рдХреБрдиреИ рдЧреЛрдкреНрдп рдХреБрд░рд╛ рдЫреИрди рдХрд┐ рд╕реНрд╡рд╕реНрде рдбрд╛рдЯрд╛рдмреЗрд╕рдХреЛ рдХреБрдЮреНрдЬреА рдЖрд╡рдзрд┐рдХ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд░ рднрд┐рддреНрд░рдХреЛ рдбрд╛рдЯрд╛рдХреЛ рдЕрдЦрдгреНрдбрддрд╛рдХреЛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╣реЛред рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдпрд╕ рдЦрдгреНрдбрдорд╛ WAL-G рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрд╕рд░реА рдкреБрди: рдкреНрд░рд╛рдкреНрддрд┐ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдмрддрд╛рдЙрдиреЗрдЫреБ, рд░ рд╣рд╛рдореА рдЬрд╛рдБрдЪрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдкрдЫрд┐ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВред

рдпреЛ рдЫреБрдЯреНрдЯреИ рдзреНрдпрд╛рди рджрд┐рди рд▓рд╛рдпрдХ рдЫ рдЬреБрди рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди (рдЙрддреНрдкрд╛рджрди рдирднрдПрдХреЛ рд╕рдмреИ рдХреБрд░рд╛) рддрдкрд╛рдИрдВрд▓реЗ S3 рдорд╛ рдкрдвреНрдиреЗ рдорд╛рддреНрд░реИ рдЦрд╛рддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рддрд╛рдХрд┐ рдЧрд▓реНрддрд┐рд▓реЗ рдмреНрдпрд╛рдХрдЕрдкрд╣рд░реВ рдЕрдзрд┐рд▓реЗрдЦрди рдирдЧрд░реНрдиреБрд╣реЛрд╕реНред WAL-G рдХреЛ рдорд╛рдорд▓рд╛рдорд╛, рддрдкрд╛рдИрдВрд▓реЗ рд╕рдореВрд╣ рдиреАрддрд┐рдорд╛ S3 рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХрд╛ рд▓рд╛рдЧрд┐ рдирд┐рдореНрди рдЕрдзрд┐рдХрд╛рд░рд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ (рдкреНрд░рднрд╛рд╡: рдЕрдиреБрдорддрд┐ рджрд┐рдиреБрд╣реЛрд╕реН): s3: GetObject, s3: ListBucket, s3: GetBucketLocationред рд░, рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рд╕реЗрдЯ рдЧрд░реНрди рдирдмрд┐рд░реНрд╕рдиреБрд╣реЛрд╕реН archive_mode=off рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╛рдЗрд▓ рдорд╛ 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 рдорд╛ рдЪреЗрдХ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ)ред рддрд░ рдиреНрдпреВрдирддрдордорд╛, рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдбрд╛рдЯрд╛ рд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдбрд╛рдЯрд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрди, рдпреЛ рдбрдореНрдк рдорд╛рд░реНрдлрдд рдЪрд▓рд╛рдЙрди рдкрд░реНрдпрд╛рдкреНрдд рдЫ, рддрд░ рдпреЛ рд░рд╛рдореНрд░реЛ рдЫ рдХрд┐ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛ рддрдкрд╛рдИрдВрд▓реЗ 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

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЧрд░реНрди

рдо рдЖрдиреНрджреНрд░реЗ рдмреЛрд░реЛрдбрд┐рдирд▓рд╛рдИ рдкреНрд░рдХрд╛рд╢рдирдХреЛ рддрдпрд╛рд░реАрдорд╛ рд╕рд╣рдпреЛрдЧ рдЧрд░реЗрдХреЛрдорд╛ рд░ WAL-G рдХреЛ рд╡рд┐рдХрд╛рд╕рдорд╛ рдЙрд╣рд╛рдБрдХреЛ рдпреЛрдЧрджрд╛рдирдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж рд╡реНрдпрдХреНрдд рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ!

рдпрд╕рд▓реЗ рдпреЛ рдиреЛрдЯрдХреЛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реНрдЫред рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рдореИрд▓реЗ рд╕реЗрдЯрдЕрдкрдХреЛ рд╕рд╣рдЬрддрд╛ рд░ рддрдкрд╛рдИрдВрдХреЛ рдХрдореНрдкрдиреАрдорд╛ рдпреЛ рдЙрдкрдХрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдареВрд▓реЛ рд╕рдореНрднрд╛рд╡рдирд╛ рд╡реНрдпрдХреНрдд рдЧрд░реНрди рд╕рдХреНрд╖рдо рднрдПрдХреЛ рдЫреБред рдореИрд▓реЗ WAL-G рдХреЛ рдмрд╛рд░реЗрдорд╛ рдзреЗрд░реИ рд╕реБрдиреЗрдХреЛ рдЫреБ, рддрд░ рдмрд╕реНрди рд░ рдпреЛ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдерд┐рдПрдиред рд░ рдореИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдШрд░рдорд╛ рд▓рд╛рдЧреВ рдЧрд░реЗрдкрдЫрд┐, рдпреЛ рд▓реЗрдЦ рдордмрд╛рдЯ рдмрд╛рд╣рд┐рд░ рдЖрдпреЛред

рдЕрд▓рдЧ рд░реВрдкрдорд╛, рдпреЛ рдзреНрдпрд╛рди рджрд┐рди рд▓рд╛рдпрдХ рдЫ рдХрд┐ WAL-G рд▓реЗ рдирд┐рдореНрди DBMS рд╕рдБрдЧ рдкрдирд┐ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрдЫ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди