рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ SQL рдбрдВрдк рдореЗрдВ рдмреИрдХрдЕрдк рдмрдирд╛рдирд╛ (рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛)ред рдкреАрдЬреА_рдбрдВрдк рдпрд╛ pg_dumpall) рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ. PostgreSQL DBMS рдХрд╛ рдмреИрдХрдЕрдк рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ pg_basebackup, рдЬреЛ рд╡рд╛рд▓ рд▓реЙрдЧ рдХреА рдПрдХ рдмрд╛рдЗрдирд░реА рдХреЙрдкреА рдмрдирд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдПрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЯреНрд░рд╛рдЗрд╕рд╛рдЗрдХрд┐рд▓ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рджреЛрдиреЛрдВ рдЬрдЧрд╣ рджрд░реНрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдкреАрдбрд╝рд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╛рд▓-рдЬреА рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдпрд╣ рд▓реЗрдЦ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдЬреНрдЮрд╛рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рдбреАрдмреАрдП рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рдореИрдВ рдЦреБрдж рдХреЛ рдЖрдо рдЖрджрдореА рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕реБрдзрд╛рд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рдЕрд▓рдЧ рд╕реЗ, рдореИрдВ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдиреАрдЪреЗ рджреА рдЧрдИ рд╣рд░ рдЪреАрдЬ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдФрд░ Ubuntu 12.3 рдкрд░ PostgreSQL 18.04 рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреА рдЧрдИ рд╣реИ, рд╕рднреА рдХрдорд╛рдВрдб рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕реНрдерд╛рдкрдирд╛
рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп, WAL-G рдХрд╛ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ
#!/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 рдмрдХреЗрдЯ" рдФрд░ рдПрдХреНрд╕реЗрд╕ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рд╡рд╛рд▓-рдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд╕рднреА рд▓реЗрдЦреЛрдВ рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
#!/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);
- рдкреАрдЬреАрд╣реЛрд╕реНрдЯ - рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛, рд╕реНрдерд╛рдиреАрдп рдмреИрдХрдЕрдк рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдХреНрд╕-рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИред
рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
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 - рд▓реЙрдЧ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХрд╛ рд╕рд░реНрд╡рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдереЛрдбрд╝рд╛ рдбреЗрдЯрд╛ рдмрджрд▓рддрд╛/рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕рдВрдЧреНрд░рд╣ рдХрдорд╛рдВрдб рдХреЛ рдЬрдмрд░рди рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдореИрдВ рд╣рд░ рд╕реЗрдХрдВрдб рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдЧрд╣рдирддрд╛ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛);
- рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛_рдХрдорд╛рдВрдб - рдпрджрд┐ "рдкреВрд░реНрдг рдмреИрдХрдЕрдк" (рдмреЗрд╕ рдмреИрдХрдЕрдк) рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирд╡реАрдирддрдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ, рддреЛ рдмреИрдХрдЕрдк рд╕реЗ рд╡рд╛рд▓ рд▓реЙрдЧ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рдЗрди рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:
рдмреИрдХрдЕрдк рд╢реЗрдбреНрдпреВрд▓ рд╕реЗрдЯ рдХрд░рдирд╛
рдХреЛрдИ рдХреБрдЫ рднреА рдХрд╣реЗ, рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдХреНрд░реЙрди рд╣реИред рдмреИрдХрдЕрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рдкреВрд░реНрдг рдмреИрдХрдЕрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ: рд╡реЙрд▓-рдЬреА рдореЗрдВ рдпрд╣ рд▓реЙрдиреНрдЪ рддрд░реНрдХ рд╣реИ рдмреИрдХрдЕрдк-рдкреБрд╢. рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ (рдФрд░ рдХреЛрдИ рдПрдХреНрд╕реЗрд╕ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ) рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:
#!/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
рд╕рд╛рд░рд╛рдВрд╢
рдореИрдВ рдкреНрд░рдХрд╛рд╢рди рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░реА рдмреЛрд░реЛрдбрд┐рди рдХрд╛ рдЖрднрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рд╡рд╛рд▓-рдЬреА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЙрдирдХреЗ рдпреЛрдЧрджрд╛рди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ!
рдЗрд╕рд╕реЗ рдпрд╣ рдиреЛрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕реЗрдЯрдЕрдк рдореЗрдВ рдЖрд╕рд╛рдиреА рдФрд░ рдЖрдкрдХреА рдХрдВрдкрдиреА рдореЗрдВ рдЗрд╕ рдЯреВрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╡рд┐рд╢рд╛рд▓ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдореИрдВрдиреЗ рд╡рд╛рд▓-рдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╕реБрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдХрднреА рдмреИрдардХрд░ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рдерд╛ред рдФрд░ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рдШрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рд▓реЗрдЦ рдореЗрд░реЗ рд╕рд╛рдордиреЗ рдЖрдпрд╛ред
рдЕрд▓рдЧ рд╕реЗ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╡рд╛рд▓-рдЬреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреАрдмреАрдПрдордПрд╕ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
MySQL / MariaDB ;MongoDB ;рдлрд╛рдЙрдВрдбреЗрд╢рдирдбреАрдмреА ;- рдФрд░ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХрдИ рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛рдПрдБ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВ!
рд╕реНрд░реЛрдд: www.habr.com