рд╡рд╛рд▓-рдЬреА: PostgreSQL DBMS рдХрд╛ рдмреИрдХрдЕрдк рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐

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

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

рд╡рд╛рд▓-рдЬреА: PostgreSQL DBMS рдХрд╛ рдмреИрдХрдЕрдк рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐

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

рдЕрд▓рдЧ рд╕реЗ, рдореИрдВ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдиреАрдЪреЗ рджреА рдЧрдИ рд╣рд░ рдЪреАрдЬ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдФрд░ Ubuntu 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 рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╡рд╛рд▓-рдЬреА рдХреА рд╕реНрдерд╛рдкрдирд╛

рдмреИрдХрдЕрдк рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдореЗрдЬрд╝реЕрди S3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд╕рд░реНрд╡рд░ рдХреЗ рдХрд░реАрдм рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд╕рд╕реНрддрд╛ рд╣реИ). рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ "s3 рдмрдХреЗрдЯ" рдФрд░ рдПрдХреНрд╕реЗрд╕ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

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

рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/wal-g/wal-g/blob/v0.2.15/PostgreSQL.md#configuration.

PostgreSQL рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛

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

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

рдмреИрдХрдЕрдк рд╢реЗрдбреНрдпреВрд▓ рд╕реЗрдЯ рдХрд░рдирд╛

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

#!/bin/bash

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

рд▓реЙрдиреНрдЪ рддрд░реНрдХ рдбреЗрдЯрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдкрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЪрд▓рд╛рдХрд░ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ pg_lsclusters.

рдпрджрд┐ рд╕рдм рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╣реБрдЖ рдФрд░ рдбреЗрдЯрд╛ S3 рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЖрдк 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 рдмрдЬреЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред

рдкреБрд░рд╛рдиреЗ рдмреИрдХрдЕрдк рд╣рдЯрд╛рдирд╛

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЖрдкрдХреЛ рдореЗрд╕реЛрдЬрд╝реЛрдЗрдХ рдпреБрдЧ рдХреЗ рд╕рднреА рдмреИрдХрдЕрдк рд░рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдордп-рд╕рдордп рдкрд░ рдЖрдкрдХреЗ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ "рд╕рд╛рдлрд╝" рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ (рджреЛрдиреЛрдВ "рдкреВрд░реНрдг рдмреИрдХрдЕрдк" рдФрд░ рд╡рд╛рд▓ рд▓реЙрдЧ)ред рд╣рдо рдпрд╣ рд╕рдм рдПрдХ рдХреНрд░реЙрди рдХрд╛рд░реНрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░реЗрдВрдЧреЗ:

#!/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 рджрд┐рдиреЛрдВ рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ (рдкреВрд░реНрдг рдмреИрдХрдЕрдк, рдбреЗрд▓реНрдЯрд╛ рдФрд░ рд╡рд╛рд▓) рд╣рдЯрд╛ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмреИрдХрдЕрдк рдЫреЛрдбрд╝ рджреЗрдЧрд╛ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рддрд┐рдерд┐ рддрд╛рдХрд┐ рдХреЛрдИ рднреА рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рдж рддрд╛рд░реАрдЦреЗрдВ PITR рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХреА рдЧрдИрдВред

рдмреИрдХрдЕрдк рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рд╕реНрд╡рд╕реНрде рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдХреБрдВрдЬреА рд╕рдордп-рд╕рдордп рдкрд░ рдбреЗрдЯрд╛ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреА рдмрд╣рд╛рд▓реА рдФрд░ рд╕рддреНрдпрд╛рдкрди рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд╛рд▓-рдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдКрдВрдЧрд╛, рдФрд░ рд╣рдо рдЪреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

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

рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛

рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ, рддрд╛рдХрд┐ рдЯреВрдЯреЗ/рдЯреЗрдврд╝реЗ рдмреИрдХрдЕрдк рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рди рд╣реЛред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрдирд╛рдП рдЧрдП рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╣рд╛рдВ рдФрд░ рдХреИрд╕реЗ рдпрд╣ рдХреЗрд╡рд▓ рдЖрдкрдХреА рдХрд▓реНрдкрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (рдЖрдк рдкреНрд░рддрд┐ рдШрдВрдЯреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд░реНрд╡рд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╕реАрдЖрдИ рдореЗрдВ рдЪреЗрдХ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдбрдВрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рддреЗ рд╕рдордп рдЖрдкрдХреЗ рдкрд╛рд╕ рдЪреЗрдХрд╕рдо рд╕рдХреНрд╖рдо рд╣реЛ (рдбреЗрдЯрд╛ рдЪреЗрдХрд╕рдо):

#!/bin/bash

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

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдореМрдЬреВрдж рд╣реИ рдПрдордЪреЗрдХ рдореЙрдбреНрдпреВрд▓рдЖрдЗрдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рд▓реЗрдВ рд╡рд╛рд▓-рдЬреА рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдереЛрдбрд╝рд╛ рддрд░реНрдХ рдмрдирд╛рдПрдВ:

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

рд╕рд╛рд░рд╛рдВрд╢

рдореИрдВ рдкреНрд░рдХрд╛рд╢рди рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░реА рдмреЛрд░реЛрдбрд┐рди рдХрд╛ рдЖрднрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рд╡рд╛рд▓-рдЬреА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЙрдирдХреЗ рдпреЛрдЧрджрд╛рди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ!

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

рдЕрд▓рдЧ рд╕реЗ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╡рд╛рд▓-рдЬреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреАрдмреАрдПрдордПрд╕ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ