SQL dumps (á¡áá¯á¶ážááŒá¯á) á¡áááºáá°ážáá°ááŒááºážááᯠááŒá¯áá¯ááºááŒááºážááŒá áºáááºááᯠááŒá¬ááŒáá·áºá áœá¬ááááºážá áááá¬ážááŒá®ážááŒá áºáááºá pg_dump ááá¯á·ááá¯áẠpg_dumpall) á¡ááŒá¶áá±á¬ááºážáá±á¬á· ááá¯ááºáá°ážá PostgreSQL DBMS ááá¯á¡áááºáá°ážáááºá áááºážááẠcommand ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážáááºááá¯ááá¯áá±á¬ááºážááœááºáááºá pg_basebackupWAL ááŸááºáááºážáá»á¬ážá ááœáá á¯á¶áááá¹áá°ááᯠááŒá¯áá¯ááºáá±ážáááºá ááá¯á·áá±á¬áº áá±á¬áºáá®áááºáá®ážááŒááºážááŸáá·áº ááŒááºáááºááá°ááŒááºáž áá¯ááºáááºážá ááºáá áºáá¯áá¯á¶ážááᯠá áááºáá±á·áá¬áá±á¬á¡áá«ááœáẠá€áá¯ááºáááºážáá±á¬ááºááœááºáááºá¡ááœáẠá¡áááºážáá¯á¶áž áá¯á¶ážáá®ážááá¯ááºáááºááŸá áºá á®ážááᯠáá±ážáá¬ážááẠááá¯á¡ááºááŒá®áž á¡áá±á«áºááŸáá·áºá¡á±á¬áẠáá¬áá»ááºááŸá¯ááᯠáááŒá áºá á±ááŒá±á¬ááºáž áááºáá¬ážáááºáá«áááá·áºáááºá áá±ááá¬áá»á¬áž áááºáá¬á á±ááẠWAL-G ááᯠáá®ááœááºáá²á·áááºá
á€áá±á¬ááºážáá«ážááẠáá»áœááºá¯ááºá á¡ááááá¬ááᯠá
áá
áºááá»ááŒá
áºá
á±ááẠá¡ááááá±ážáá¬ážáá¬ážááŒááºážááŒá
áºáá«áááºá áá»áœááºá¯ááºááẠDBA ááá¯ááºáá«á áá
áºáá±áá¬áá¬ááœáẠáá°ááŒáááºážáá¬áá¬á
áá¬ážááŒáá·áº ááááááá¯ááºááᯠáá±á¬áºááŒááá¯ááºáá±á¬ááŒá±á¬áá·áº ááŒá¯ááŒááºááŸá¯áá»á¬ážááᯠááŒáá¯ááá¯áá«áááºá
áá®ážááŒá¬ážá¡á¬ážááŒáá·áºá á¡á±á¬ááºáá±á¬áºááŒáá«á¡áá¬á¡á¬ážáá¯á¶ážááẠUbuntu 12.3 ááŸá PostgreSQL 18.04 á¡ááœáẠáááºááá¯ááºáá¬ááŸáá·áº á ááºážáááºáá¬ážááŒá®ážá á¡áááá·áºá¡á¬ážáá¯á¶ážááᯠá¡ááœáá·áºáá°ážáá¶á¡áá¯á¶ážááŒá¯áá°á¡ááŒá Ạáá¯ááºáá±á¬ááºááááºáᯠáá®ážááŒá¬ážá á® áááááŒá¯áááá«áááºá
ustanovka
á€áá±á¬ááºážáá«ážááá¯áá±ážáá¬ážá
ááºááœááºá 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 ááᯠconfigure áá¯ááºááẠááá¯á¡ááºááŒá®áž áááºážáá±á¬áẠPostgreSQL ááá¯ááºááá¯ááºá
WAL-G á áá áºááá·áºááœááºážááŒááºážá
á¡áááºááááºážáááºážááŒááºážá á¥ááá¬áá áºáá¯á¡ááœááºá Amazon S3 ááᯠá¡áá¯á¶ážááŒá¯ááẠ(áá¬ááŒá±á¬áá·áºáá²ááá¯áá±á¬á· áááºážááẠáá»áœááºá¯ááºááá¬áá¬áá»á¬ážááŸáá·áº ááá¯ááá¯áá®ážáááºáá±ááŒá®áž áááºážáá¡áá¯á¶ážááŒá¯ááŸá¯ááẠá¡ááœááºá á»á±ážáááºáá¬áá±á¬ááŒá±á¬áá·áºááŒá áºáááºá) áááºážááŸáá·áºá¡áá¯ááºáá¯ááºáááºá áááºááẠ"s3 áá¯á¶áž" ááŸáá·áº áááºáá±á¬ááºáá¯á¶ážáá±á¬á·áá»á¬áž ááá¯á¡ááºáááºá
WAL-G ááŸáá·áºáááºáááºááá·áº ááááºáá±á¬ááºážáá«ážáá»á¬ážá¡á¬ážáá¯á¶ážááẠáááºáááºážáá»áẠvariables áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ configuration ááá¯á¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯á·áá±á¬áº á€áá¯ááºáá±ááŸá¯ááŸáá·áºá¡áá° áááºáááºáá»á¬ážááẠáááºááŸáááá¯ááºáááº
#!/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
Parameter ááœá±á¡á¬ážáá¯á¶ážááᯠáááºážáááºážááŸááºážááŒáá«áá á±á
- WALG_S3_PREFIX - áááá¹áá°áá°ážáá°ááŒááºážááᯠá¡ááºáá¯ááºáá¯ááºááá·áº áááºá S3 áá¯á¶ážááá¯á· áááºážááŒá±á¬ááºáž (ááẠroot ááá¯á·ááŒá áºá á± ááá¯ááºááœá²áá áºáá¯ááá¯á·ááŒá áºá á±)
- AWS_ACCESS_KEY_ID - S3 ááœááºáááºáá±á¬ááºááœáá·áºáá±á¬á·á ááºážáááºáá¬áá¬áá áºáá¯ááœáẠááŒááºáááºááá°ááá·áºá¡áá«á á€áá±á¬á·áá»á¬ážááẠReadOnly Policy ááŸáááá«áááºá áááºážááᯠááŒááºáááºááá°ááŒááºážááá¯ááºáᬠááá¹áááœáẠá¡áá±ážá áááºáá±á¬áºááŒáá¬ážáááºá);
- AWS_SECRET_ACCESS_KEY - S3 ááá¯ááŸá±á¬ááºááŸá¯ááœáẠáá»áŸáá¯á·ááŸááºáá±á¬á·á
- WALG_COMPRESSION_METHOD - ááááááºááŸá¯áááºážáááºážá Brotli ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááẠááá¯áá±á¬ááºážááẠ(áááºážááẠáá±á¬ááºáá¯á¶ážá¡ááœááºá¡á á¬ážááŸáá·áº ááááááºááŸá¯/ááŸááá·áºáá»ááŸá¯á¡ááŒááºááŸá¯ááºážááŒá¬áž ááœáŸá±ááá¯ááá¯áá»ááºááŒá áºáá±á¬ááŒá±á¬áá·áº)á
- WALG_DELTA_MAX_STEPS - á¡áááºáá°ážáá°ááŸá¯ á¡ááŒáá·áºá¡á á¯á¶ááᯠááááºáá®ážáá® âdeltasâ á¡áá±á¡ááœáẠ(áááºážááá¯á·ááẠá¡áá»áááºááŸáá·áº áá±á«ááºážáá¯ááºáá¯ááºáá¬ážáá±á¬ áá±áá¬á¡ááœááºá¡á á¬ážááᯠáááºáá¬á á±áá±á¬áºáááºáž ááŒááºáááºááá°ááŒááºážáá¯ááºáááºážá ááºááᯠá¡áááºážáááºááŸá±ážááœá±ážá á±áá±á¬ááŒá±á¬áá·áº ááŒá®ážáá¬ážáá±á¬áááºááá¯ážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠáá¡ááŒá¶ááŒá¯ááá¯áá«)á
- PGDATA - ááá·áºáá±áá¬áá±á·á áºáá±áá¬ááŒáá·áº áááºážááœáŸááºááá¯á· áááºážááŒá±á¬ááºáž (command ááᯠrun ááŒááºážááŒáá·áºááŸá¬ááœá±ááá¯ááºáááºá pg_lsclusters);
- PGHOST - áá±áá¬áá±á·á áºááá¯á·áá»áááºáááºááŒááºážá áá±áááá¯ááºáá¬á¡áááºáá°ážáá°ááŒááºážááŒáá·áºáááºážáááºá€á¥ááá¬ááœááºááŸáááá²á·ááá¯á· unix-socket ááŸáááá·áºáááºážááá¯áá¯ááºáá±á¬ááºááŒááºážáááºááá¯ááá¯áá±á¬ááºážááœááºáááºá
á¡ááŒá¬ážáá±á¬ ááá·áºáááºáá»ááºáá»á¬ážááᯠá
á¬ááœááºá
á¬áááºážáá»á¬ážááœáẠááœá±á·ááá¯ááºáááº-
PostgreSQL ááᯠá áá áºááá·áºááœááºážááŒááºážá
áá±áá¬áá±á·á áºá¡ááœááºážááŸá archiver ááẠWAL ááŸááºáááºážáá»á¬ážááᯠcloud ááœáẠá¡ááºáá¯ááºáá¯ááºááŒá®áž áááºážááá¯á·áá¶á០ááŒááºáááºááá°áááºá¡ááœáẠ(ááá¯á¡ááºáá«á)á configuration file ááœáẠáá±á¬ááºáá»á¬ážá áœá¬ááᯠáááºááŸááºááẠááá¯á¡ááºáá«áááºá /etc/postgresql/12/main/postgresql.conf. á áááºáá°áá»á¬ážá¡ááœááºáᬠáá±áá»á¬á¡á±á¬ááºáá¯ááºááá¯á·ááá¯áááºáá¡á±á¬ááºáá±á¬áºááŒáá« áááºáááºáá»á¬ážáá²á០á¡ááŒá¬ážáááºááá¯ážáá»á¬ážááᯠááááºááŸááºáá¬ážáá±á¬ááŒá±á¬áá·áº configuration ááᯠááŒááºáááºá áááºáá±á¬á¡áá«á 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 ááŸááºáááºážáá»á¬ážá "áá¯á¶áá°" ááœááºáá±ážáááºá¡áá»ááºá¡áááºáááºáá»áŸááŸáááẠ- á¡áá¬á¡á¬ážáá¯á¶ážááá¯áá±ážáá«á
- ááŸááºáááºáž_áá¯áẠ- ááá·áºáááºáá±á¬ááºá០command ááá¯á¡áá¯á¶ážááŒá¯á WAL ááŸááºáááºážáá»á¬ážááá¯áá±á«ááºážáá¯ááºáá¯ááºáá«á archive_command;
- archive_command - ááŒá®ážááŒáá·áºá á¯á¶áá±á¬ WAL ááŸááºáááºážááᯠááááºážáááºážáááºá¡ááœáẠá¡áááá·áºáá±ážááŒááºážá
- archive_timeout - ááŸááºáááºážáá»á¬áž ááááºážáááºážááŒááºážá¡á¬áž ááŒá®ážááŒá±á¬ááºáá±á¬á¡áá«ááŸáᬠáá¯ááºáá±á¬ááºáááºá ááá¯á·áá±á¬áº áááºááá¬áá¬ááẠáá±áá¬áá±á·á áºááá¯á· áá±áá¬á¡áááºážáááºááᯠááŒá±á¬ááºážáá²ááŒááºáž/áááºááá·áºáá«áá á€áá±áá¬ááœáẠááá·áºáááºáá»ááºááᯠá áá¹ááá·áºááá¯ááºážá¡ááœááºáž áááºááŸááºááẠááá·áºáá»á±á¬áºáááºá ááá¯á·áá±á¬ááºááœáẠarchiving command ááᯠá¡áááºážá¡áá»ááºáá±á«áºááẠ(á áá¹ááá·áºááá¯ááºáž áá±áá¬áá±á·á áºááŸá¬ á¡ááŒááºážá¡ááẠáá±ážáá±áá±á¬á· áá®áááºááŸááºáá»ááºááᯠáá¯ááºáá¯ááºááŸá¯ááŸá¬ ááááºááŸááºááá¯á· áá¯á¶ážááŒááºáá²á·áááºá);
- restore_command - á¡áááºááááºážáááºážááŸá¯á០WAL ááŸááºáááºážááᯠááŒááºáááºááá°ááẠ"á¡ááŒáá·áºá¡áá¡áááºáá°ážááŒááºáž" (áá±á·á áºá¡áááºáá°ážááŒááºáž) áá±áá¬áá±á·á áºááŸá áá±á¬ááºáá¯á¶ážááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá»áá¯á·áá²á·áá«á á¡áá¯á¶ážááŒá¯áá«áááºá
ááá¬ážáááºá
á¬ááœááºá
á¬áááºážááá¬áá¬ááŒááºáá»ááºááœáẠá€ááá·áºáááºáá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠáááºááá¯ááá¯áááºááŸá¯ááá¯ááºáááº-
á¡áááºá¡áá»áááºááá¬ážááᯠáááºááŸááºááŒááºážá
áá¬áá²ááŒá±á¬ááŒá±á¬ á¡á²áá«ááᯠrun ááá¯á· á¡áááºááŒá±áá¯á¶ážáááºážáááºážá cron áá«á á€á¡áá¬ááẠá¡áááºááááºážáááºážááŸá¯áá»á¬ážááᯠáááºáá®ážááẠáá»áœááºá¯ááºááá¯á· á á®á ááºáá±ážááá·áºá¡áá¬ááŒá áºáááºá á¡áááºáá°ážáá°ááŸá¯ á¡ááŒáá·áºá¡á á¯á¶ áááºáá®ážááẠááœáŸááºááŒá¬ážáá»ááºááŒáá·áº á áááºááŒáá«á áá¯á·á wal-g ááœáẠáááºážááẠá áááºááá·áº á¡ááŒá±á¬ááºážááŒáá»ááºááŒá áºáááºá backup-push. ááá¯á·áá±á¬áº ááááŠážá áœá¬á á¡áá¬á¡á¬ážáá¯á¶áž á¡áááºááŒá±ááŒá±á¬ááºáž áá±áá»á¬á á±ááẠpostgres á¡áá¯á¶ážááŒá¯áá°áá¶á០ဠcommand ááᯠááá¯ááºááá¯áẠrun ááŒááºážááẠááá¯áá±á¬ááºážááẠ(ááŸáá·áº access errors áá»á¬áž áááŸááá«)á
#!/bin/bash
su - postgres -c '/usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main'
áá áºááœáŸááºááŒááºážááá¯ááºáᬠá¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážááẠáá±áá¬áááºážááœáŸááºááá¯á· ááœá¬ážáá¬áááºážááŒá±á¬ááºážááᯠááœáŸááºááŒááẠ- ááŒá±ážááŒááºážááŒáá·áº áááºážááᯠáááºááŸá¬ááœá±ááœá±á·ááŸáááá¯ááºááŒá±á¬ááºáž áá»áœááºá¯ááºááááá±ážáá«áááºá pg_lsclusters.
á¡áá¬á¡á¬ážáá¯á¶áž error áááºážá ááºááœá¬ážáᬠáá±áá¬ááᯠS3 ááá¯ááŸá±á¬ááºááŸá¯ááá¯á· áááºáá±ážáá«áá ááá¯á·áá±á¬áẠcrontab ááœáẠá¡áá»áááºá¡ááá¯ááºážá¡ááŒá¬ážá¡ááá¯áẠá áááºááŒááºážááᯠááẠconfigure áá¯ááºááá¯ááºáá«áááºá
#!/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 ááŸááºáááºážáá»á¬áž ááŸá áºáá¯áá¯á¶ážá¡ááœáẠá¡áá¯á¶ážáááºáá«áááá·áºáááºá cron á¡áá¯ááºáá áºáá¯á¡á¬ážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠá€á¡áá¬á¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬ááºáá«áááºá
#!/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
Cron ááẠááŒá®ážáá²á·áá±á¬ 6 áááºá¡ááœáẠáááá¹áá°áá»á¬ážááŸááœá²á á¡áá¬á¡á¬ážáá¯á¶áž (á¡áááºáá°ážáá»á¬áž á¡ááŒáá·áºá¡á á¯á¶á deltas ááŸáá·áº WALs) ááᯠáá±á·ááá¯ááºáž áá¶ááẠ30:10 ááœáẠáá¯ááºáá±á¬ááºáááºááŒá áºááŒá®ážá á¡áááºážáá¯á¶áž á¡áááºáá áºáá¯áá»ááºáá¬ážáá«áááºá ááá¯á· áááºááŸááºáá¬ážáá²á·áááºá áœá²ááœá±ááá¯áá±á¬á· á¡ááŸááºááá¬áá»áá¯ážáá±á«á·á пПÑле áááºá áœá²áá»á¬ážááᯠPITR ááœáẠááá·áºááœááºážáá¬ážáááºá
á¡áááºááááºážááŒááºážá០ááŒááºáááºááá°ááŒááºážá
áá»ááºážáá¬áá±á¬áá±áá¬áá±á·á áºáá áºáá¯ááá±á¬á·áá»ááºááŸá¬ á¡ááœááºážáá±áá¬áááŸááºáááºááŸá¯ááᯠá¡áá»áááºá¡áá«á¡ááá¯áẠááŒááºáááºááá°ááŒááºážááŸáá·áº á¡áááºááŒá¯ááŒááºážááŒá áºáááºáá°áá±á¬ áá»áŸáá¯á·ááŸááºáá»ááºááá¯ááºáá«á á€ááá¹áááœáẠWAL-G á¡áá¯á¶ážááŒá¯á ááŒááºáááºááá°áááºážááᯠáá»áœááºá¯ááºááŒá±á¬ááŒáááºááŒá áºááŒá®ážá á á áºáá±ážááŸá¯áá»á¬ážá¡ááŒá±á¬ááºáž áá±á¬ááºááŸááŒá±á¬áá«áááºá
áááºážááá¯áá®ážááŒá¬ážááŸááºáá¬ážáá¬ážááá·áºááẠá ááºážáááºááŸá¯áááºáááºážáá»ááºááœáẠ(áá¯ááºáá¯ááºááŒááºážááá¯ááºááá·áºá¡áá¬á¡á¬ážáá¯á¶áž) ááᯠááŒááºáááºááá°áááºá¡ááœáẠáááºááẠá¡áááºáá°ážáá°ááŸá¯áá»á¬ážááᯠááá±á¬áºáá overwrite áááŒá áºá á±ááẠS3 ááŸá Read Only á¡áá±á¬áá·áºááᯠá¡áá¯á¶ážááŒá¯áááºááá¯á¡ááºáá«áááºá WAL-G ááá á¹á ááœááºá Group Policy ááŸá S3 á¡áá¯á¶ážááŒá¯áá°á¡ááœáẠá¡á±á¬ááºáá«á¡ááœáá·áºá¡áá±ážáá»á¬áž áááºááŸááºááẠááá¯á¡ááºááẠ(á¡áá»áá¯ážáááºáá±á¬ááºááŸá¯- ááœáá·áºááŒá¯áá«á): s3:GetObject, s3:ListBucket, s3:GetBucketLocation. ááŸáá·áºá áááºááŸááºáááºááá±á·áá«ááŸáá·áº archive_mode=ááááºáááºá settings ááá¯ááºáá²ááŸá¬ postgresql.confááá¯á·ááŒá±á¬áá·áº áááºáá ááºážáááºáá±áá¬áá±á·á áºááᯠááááºááááẠá¡áááºááááºážáááºážáá¬ážááẠáááá¯áá¬ážáá«á
áááºááᯠá¡áááºážááẠááœá±á·áá»á¬ážááŸá¯ááŒáá·áº ááŒááºááẠááŒá¯ááŒááºáááºá PostgreSQL áá±áá¬á¡á¬ážáá¯á¶ážááᯠáá»ááºááŒááºážá (á¡áá¯á¶ážááŒá¯áá°áá»á¬áž á¡áá«á¡áááº) ááá¯á·ááŒá±á¬áá·áº á¡á±á¬ááºáá« command áá»á¬ážááᯠáááºáá¯ááºáá±á¬ááºááá·áºá¡áá« á¡ááœááºááááá¬ážáá«á
#!/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
ááŒááºáááºááá°ááŒááºážáá¯ááºáááºážá ááºááᯠá á áºáá±ážááá¯áá°áá»á¬ážá¡ááœááºá á¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ bash magic á¡ááá¯ááºážáá±ážááᯠááŒááºáááºáá¬ážááŒá®ážá ááá¯á·ááŸáᬠááŒááºáááºááá°ááŒááºážááœáẠááŒá¿áá¬ááŸááá«á script ááẠáá¯áááá¯ááºáá±á¬ ááœááºáá±á«ááºáá¯ááºááŒáá·áº áá»ááºá á®ážááœá¬ážáááºááŒá áºáááºá á€á¥ááá¬ááœááºá á¡áá»ááºááŒááá¯ááºááᯠáá»ááºááá¯ááºááŒááºáž ááŸáá áááŸá ááááŸáááẠ120 á áá¹ááá·áº á¡áá»áááºáá¯ááºá á á áºáá±ážááŸá¯ 5 ááᯠááŒá¯áá¯ááºááẠ(áááºážááẠááŒááºáááºááá°ááŒááºáž á¡á±á¬ááºááŒááºáááºáᯠááá¯ááá¯áááº)á
#!/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 á áááºááŒáá·áº)á
ááŒááºáááºááá°ááŒá®ážáá±á¬áẠáá±áá¬ááᯠá á áºáá±ážááŒááºážá
ááŒááºáááºáá°áá±á¬ááºááŒá®ážáá±á¬áẠáá±áá¬áá±á·á áºá ááá¯ááºáá¬ááŸá¯ááᯠá á áºáá±ážááẠááá¯á¡ááºááŒá®áž áá»áá¯áž/áá±á¬ááºáá±áá±á¬ á¡áááºááááºážáááºážááŸá¯ á¡ááŒá±á¡áá±áá»áá¯áž ááá±á«áºáá±á«ááºá á±ááẠááá¯á¡ááºáá«áááºá áááºáá®ážáá¬ážáá±á¬ archive áá áºáá¯á á®ááœáẠáááºážááá¯áá¯ááºáá±á¬ááºááŒááºážá ááá¯áá±á¬ááºážáááºá ááá¯á·áá±á¬áº áááºááá·áºáá±áá¬ááŸáá·áºáááºááá¯á· ááá·áºá áááºáá°ážá áááºáááºážáá±á«áºááœááºáᬠáá°áááºááẠ(áááºááẠáá¬áá¬áá áºáá¯áá»ááºážá á®ááᯠáá¬áá®á¡ááá¯áẠááŒáŸáá·áºáááºááá¯ááºááẠááá¯á·ááá¯áẠCI ááœáẠá á áºáá±ážááŸá¯áá áºáᯠáá¯ááºáá±á¬ááºááá¯ááºáááº)á áá«áá±ááá·áº á¡áááºážáá¯á¶ážáá±á¬á· database áá²á data áá²á· indexes ááœá±ááᯠá á áºáá±ážááá¯á· ááá¯á¡ááºáá«áááºá
áá±áá¬ááá¯á
á
áºáá±ážáááºá áááºážááá¯á¡ááŸáá¯ááºáá¯á¶ááŒá®ážáá
áºáá¯ááŸáááá·áº run áááºáá¯á¶áá±á¬ááºáááºá ááá¯á·áá±á¬áº database ááá¯áááºáá®ážáá±á¬á¡áá«ááœááºááẠchecksums ááá¯ááœáá·áºáá¬ážáááºááŸá¬ááá¯áá±á¬ááºážááẠ(
#!/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
á¡ááŸá áºáá»á¯ááºáááº
áá¯ááºáá±ááŸá¯ááŒááºáááºáá¬ááœáẠáá°áá®áá±ážááá·áºá¡ááœáẠAndrey Borodin á¡á¬áž áá»á±ážáá°ážáááºááŒá±á¬ááºážááŸáá·áº WAL-G ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœáẠáá¶á·ááá¯ážáá°áá®ááŸá¯á¡ááœáẠá¡áá°ážáá»á±ážáá°ážáááºááŸááá«áááºá
áá«á áá®ááŸááºá á¯ááᯠáááá¯á¶ážáá»á¯ááºáá«áááºá áááºáááºáááœááºáá°ááŒááºážááŸáá·áº ááá·áºáá¯áá¹ááá®ááœáẠá€áááááá¬ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá¡ááœáẠááŒá®ážáá¬ážáá±á¬á¡áá¬ážá¡áá¬áá»á¬ážááᯠáá»áœááºá¯ááºáááºááŒááá¯ááºáááºáᯠáá»áŸá±á¬áºááá·áºáá«áááºá WAL-G á¡ááŒá±á¬ááºáž á¡áá»á¬ážááŒá®ážááŒá¬ážáá²á·ááá±ááá·áº ááá¯ááºááŒá®áž á¡ááŒá±ááŸá¬ááá¯á· á¡áá»áááºááá¯á¶áá±á¬ááºáá²á·áá°ážá á¡áááºááŸá¬ á¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®ážááẠáá®áá±á¬ááºážáá«ážá áá»áœááºáá±á¬á·áºáá®ááá± ááœááºáá¬áááºá
áá®ážááŒá¬ážá¡á¬ážááŒáá·áºá WAL-G ááẠá¡á±á¬ááºáá« DBMS ááŸáá·áºáááºáž áá¯ááºáá±á¬ááºááá¯ááºáááºááᯠáááááŒá¯ááá·áºáá«áááºá
MySQL / MariaDB ;MongoDB ;FoundationDB ;- áááááááºáá»á¬ážááŒáá·áº á¡áá²ááŒááºááŒááºážááŸá¬ áá±á¬ááºáááºáá»á¬ážá áœá¬ áá»áŸá±á¬áºááá·áºáá«áááºá
source: www.habr.com