ααΆααααΌαααΆαααααααΆααααΆααΌαααα αΎαααΆααΆαααααΎα±ααααΆαααααα»ααα»αα αΌααα αααα»α SQL dumps (αααααααΎ pg_dump α¬ pg_dumpall) αα·ααααααΆαααα·αααα’ααα ααΎααααΈααααα»ααα»α PostgreSQL DBMS ααΆααΆααΆααααααΎααααα»αααΆαααααΎααΆααααααααΆ pg_basebackupααααααααΎαα αααΆααα αααααααααΈααααααααα ααα» WAL α ααα»αααααα ααααααα’αααα αΆααααααΎααα·ααααΆααααΎαααΆαααΆααααΌαααααΆααααααΎαα αααΆααα αααα αα·αααΆαααααΆαα‘αΎααα·α α’αααααΉααααααΆα’αααααααΌαααααααααΆαα αα ααΆααααΈαααααΈαααααΆααααααΎαααΆαααα αα·ααα·αααααΎα±ααα’αααααΊα αΆααααΆααααΆαααΎ αα·αααΆααααααα ααΎααααΈααΆαααααααααΆαααΊα αΆαα WAL-G ααααΌαααΆααααααΎαα‘αΎαα
α’ααααααααααααΌαααΆααααααααΆα
αααα ααΎααααΈαααα
αααΆααααααααααΌαα
ααααααΉααααααααα»α αααα»ααα·ααααααΆ DBA α αΎααααα»αα’αΆα
αααα αΆααααα½αα―αααΆααΆααΆααααα§ααΆαααα
ααααααααΆαα½α ααΌα
ααααααΆααααααααΌαααΆαα½αααααΌαααΆαααααΆαααα!
αααα‘ααααΈααααΆ αααα»αααααααααΆααααΆα’αααΈααααααααΆαααΆααααααααΊααΆααααααα αα·αααααΌαααΆαααΆααααααααααΆαα PostgreSQL 12.3 αα ααΎα’ααΌααα»αααΌ 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 αααα½αα―αα
ααΆαααα‘αΎα WAL-G
αααααΆααα§ααΆα αααααααΆααααααΆαα»αααΆαααααα»ααα»α Amazon S3 ααΉαααααΌαααΆαααααΎ (αααααααΆαα αα·ααααΆαααΈααααααααααα»α α αΎαααΆαααααΎααααΆααααααααΆαααααΆααα) ααΎααααΈααααΎααΆαααΆαα½αααΆ α’αααααααΌαααΆα "s3 bucket" αα·αααααΆααα α»α α αΌαα
α’ααααααα»αααΆααα’ααα’αααΈ WAL-G ααΆαααααΎααΆαααααααα
ααΆαααααααααααααααΎα’αααααα·ααααΆα ααα»ααααααΆαα½αααΉαααΆαα
ααααααΆαααα ααΆααααααα’αΆα
ααΆαααΈααΆαααα
#!/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 ααααα’ααααααααΆαααααα»ααα»αααΉαααααΌαααΆααααα»αα‘αΎα (α’αααα’αΆα αα root α¬αα αααα½α);
- AWS_ACCESS_KEY_ID - ααα αΌαααααΎαααα»α S3 (αα αααα»αααααΈααααΆαααΎαα‘αΎααα·ααα ααΎαααΆαααΈαααααΆααααα ααααΆαααααααααΌαααααΆααααααΆααα ReadOnly! αααααααΌαααΆααα·αααααΆαααα’α·αααααααααααα αααα»ααααααααααΈααΈααΆαααΎαα‘αΎααα·αα);
- AWS_SECRET_ACCESS_KEY - αααααααΆαααα αααα»αααΆααααα»α S3;
- WALG_COMPRESSION_METHOD - αα·ααΈααΆααααααααα αΆαα ααΆααΆααΆααααααΎααααα»αααΆαααααΎ Brotli (α αΆααααΆααααΈαααααΊααΆαααααααΆααααΆαααα αα α»αααααα αα·αααααΏααααα αΆαα/ααααα½α);
- WALG_DELTA_MAX_STEPS - α ααα½ααα "deltas" αα»αααααααααΎαααΆαααααα»ααα»ααααααα (αα½ααααααααααα ααααααααΆαα·αααα ααααα·αααααααααααΆαααΆαααααα»ααααα’αΆα αααααααααΎαααΆαααααΆαα‘αΎααα·αααααα·α ααΌα ααααααΆαα·αααααΌαααΆαααααΆαα±ααααααΎααααααααα);
- PGDATA - ααααΌααα ααΆαααααααααΆααα·ααααααααΌαααααΆααα·ααααααααααα’ααα (α’αααα’αΆα αααααααααααααααΎαααΆαααΆααααααααΆ pg_lsclusters);
- PGHOST - ααΆαααααΆαααα ααΌαααααΆααα·αααααα ααΆαα½αααΉαααΆαααααα»ααα»αααΌαααααΆα ααΆααΆααΆααααααΎααααα»αααΆαααααΎααΆααΆαααααααα unix ααΌα αααα»αα§ααΆα ααααααα
αααΆαααΆααααααααααααααα’αΆα
ααααΆααα
αααα»αα―αααΆαα
ααΆαααα‘αΎα PostgreSQL
ααΎααααΈα±ααααααααΆααα ααΆααααα»αααΌαααααΆααα·αααααααααα»αα‘αΎααααααα ααα» WAL αα αααα»αααα αα·αααααΆααα½αααΆααΈαα½αααΆ (ααΎα αΆαααΆα α) α’αααααααΌαααααααααΆαααΆααααααααΆα αααΎααα αααα»αα―αααΆαααααααα ααΆααααααααα /etc/postgresql/12/main/postgresql.conf. ααααΆαααααααααΆααα’αααα αΆααααααΎα α’αααααααΌαααααΆααααΆααΆβααααΆαβααΆαβαααααβααΆαβαααααβααααΌαβααΆαβαααααβαα βαααααβαααααβαααβαα ααΌα ααααβαααβααΆαβαααααβαα ααΆααααααααβααααΌαβααΆαβαααα»αβα‘αΎαβαα·α DBMS αα·αβααΆααα α’αααα’αΆα αααααααααΆαααΆααααααααΆααααααααααααΎα
#!/bin/bash
echo "wal_level=replica" >> /etc/postgresql/12/main/postgresql.conf
echo "archive_mode=on" >> /etc/postgresql/12/main/postgresql.conf
echo "archive_command='/usr/local/bin/wal-g wal-push "%p" >> /var/log/postgresql/archive_command.log 2>&1' " >> /etc/postgresql/12/main/postgresql.conf
echo βarchive_timeout=60β >> /etc/postgresql/12/main/postgresql.conf
echo "restore_command='/usr/local/bin/wal-g wal-fetch "%f" "%p" >> /var/log/postgresql/restore_command.log 2>&1' " >> /etc/postgresql/12/main/postgresql.conf
# ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ ΡΠ΅ΡΠ΅Π· ΠΎΡΠΏΡΠ°Π²ΠΊΡ SIGHUP ΡΠΈΠ³Π½Π°Π»Π° Π²ΡΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ ΠΠ
killall -s HUP postgres
ααΆααα·αααααΆα’αααΈαααΆαααΆαααααααααααααΌααααααα
- Wal_level - ααΎααααααΆαααα»ααααΆααααααααΌαααααααααα»ααααααα ααα» WAL, "α αααα" - αααααα’αααΈααααααααΆα;
- ααααααααααΆα - ααΎαααΆαααΆααααααααα ααα» WAL αααααααΎααΆααααααααΆααΈαααΆαααΆαααααα archive_command;
- archive_command - ααΆααααααααΆαααααΆααααΆααααααΆαα»ααααααα ααα» WAL αααααΆααααα ααα
- ααααααΆα_α’ααααα - ααΆααααααΆαα»ααααααα ααα»ααααΌαααΆαα’αα»αααααααα ααααααααΆααααΌαααΆααααα αα ααα»ααααααααα·αααΎαααΆαααΈαααααααα’αααααααΆααααααΌα / αααααααα·αααααααα·α αα½α αα αααα»αααΌαααααΆααα·αααααα αααααΆααα ααα»αααααα»αααΆαααααααααααααααα ααΈααααααα»αααααααααα»ααααΆααα·ααΆααΈ αααααΆααααΈαααααΆααααααααΆααΆααααααΆαα»αααΉαααααΌαααΆαα α αααααααα (αααα»αααααααααΆααααΈααααα αα ααΎααΌαααααΆααα·ααααααααΆαααααΆαααα·ααΆααΈ ααΌα αααααααα»αααΆααααααα α α·ααααα·αααααααααΆαααΆααααααααααα αααα»αααα·αααααααα);
- restore_command - ααΆααααααααΆααΎααααΈααααΆααααααα ααα» WAL ααΈααΆαααααα»ααα»αααΉαααααΌαααΆαααααΎααααα·αααΎ "ααΆαααααα»ααα»ααααααα" (ααΆαααααα»ααα»αααΌαααααΆα) ααααααΆαααααΆααααααΌαα α»αααααααααα»ααα αααα»αααΌαααααΆααα·ααααααα
α’αααα’αΆα
α’αΆαααααααα’αααΈαααΆαααΆααααααααΆααααααα
αααα»αααΆαααααααα―αααΆαααααΌαααΆαα
αααα αααΆααα·ααΆαααααα»ααα»α
α’αααΈαααααα’αΆα αα·ααΆαααΆα αα·ααΈααΆααααα½ααααα»αααΎααααΈααααΎαααΆαααΆααΊ cron α αααααΆα’αααΈαααααΎαααΉαααααααα ααΆααααααααααΎααααΈαααααΎαααΆαααααα»ααα»αα α αΌαα αΆααααααΎαααΆαα½αααΉαααΆααααααααΆααΎααααΈαααααΎαααΆαααααα»ααα»ααααααα: αα αααα»α wal-g αααααΊααΆα’αΆαα»αααααα αΆααααααΎα ααΆαααααα»ααα»α - αα»α. ααα»ααααααΆααααΌα ααΆααΆααΆααααααΎααααα»αααΆαααααΎαααΆαααΆααααααααΆααααααααααΈα’αααααααΎααααΆαα postgres ααΎααααΈααααΆααααΆα’αααΈαααΆααα’ααααΊααα’ (α αΎααα·αααΆαααα α»ααααα»αααΆαα αΌαααααΎαα)α
#!/bin/bash
su - postgres -c '/usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main'
α’αΆαα»αααααααααΆαααΎαααααΎαααΆααααα αΆαααΈααααΌααα ααΆαααααα·αααααα - αααα»αααααΉαα’αααααΆα’αααα’αΆα αααααααααΆααΆααααααΆαααα pg_lsclusters.
ααααα·αααΎα’αααΈαααααΎαααΆααααααααΆαααα α»α α αΎααα·ααααααααααΌαααΆααααα»ααα αααα»α S3 storage αααααΆααααα’αααα’αΆα ααααααα ααΆααααααααααΆαααΎαααααΎαααΆαααΆαααΆαααααααα αααα»α 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 ααααΉαα
ααΆααα»αααΆαααααα»ααα»αα αΆαα
ααΆαα αααΎα α’ααααα·αα αΆαααΆα ααααααΆααΆαααααα»ααα»αααΆααα’ααααΈαααα 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:30 ααααΉα ααααα»αα’αααΈαααΆααα’αα (ααΆαααααα»ααα»ααααααα deltas αα·α WALs) ααΎααααααα αααΆααα αααααααααΆαααααααα 10 ααααα α»αααααα ααα»αααααα»ααααΆαα αα ααΆααααΆαααααα»ααα»ααα½α αα αΌαααααα ααΆαααα·α αααααααααΆααααααΆααααΌα ααααα ααα»α ααΆαα½αα ΠΏΠΎΡΠ»Π΅ ααΆαααα·α ααααααααΌαααΆααα½ααααα αΌααααα»α PITR α
ααΆαααααΆαα‘αΎααα·αααΈααΆαααααα»ααα»α
ααΆααααΆαα’αΆααααααΆααααααααααααΉαααααΌαααααΆααα·αααααααααααΆααα»αααΆαααα’ααΊααΆαααααΆαα‘αΎααα·αααΆαααΆαααααα αα·αααΆααααααααααΆααααΆαααααΉαααααΌααααα·αααααααα ααΆααααα»αα αααα»αααΉαααααΆααα’αααααΈααααααΎααααΈααααΆααααααααΎ WAL-G αα αααα»ααααααααα α αΎαααΎαααΉααα·ααΆαα’αααΈααΆααααα½ααα·αα·ααααα ααααααααα
ααΆαα½αα±ααααααααααΆααααΆα ααααα‘αα ααΎααααΈααααΆααα αααα»αααα·ααΆααΆαααΆααααα (α’αααΈααααααααΆαααααα·ααααααΆααΆαααα·α) α’αααααααΌαααααΎααααΈ Read Only αα αααα»α S3 ααΎααααΈαα»αα±αααααααααΆααααΎααΆαααααα»ααα»ααααα αααααα αααα»αααααΈ WAL-G α’αααααααΌαααααααα·αααα·ααΆαααααααααααΆααα’αααααααΎααααΆαα S3 αα αααα»ααααααΆααααααα»α (ααααααα α’αα»ααααΆα): s3: GetObject, s3: ListBucket, s3: GetBucketLocation. α αΎαααΆααΆααα·αααΆαα αα»αααααα ααααα archive_mode=αα·α αα αααα»αα―αααΆαααΆαααααα postgresql.confααΌα ααααααΆααΌαααααΆααα·ααααααααΆαααααααααα’ααααα·αα ααααααΌαααΆαααααα»ααα»αααααααααααααΆααα
ααΆαααααΆαα‘αΎααα·αααααΌαααΆαα’αα»ααααααΆαα½αααΉαα αααΆααααα·α αααα ααΆααα»ααα·αααααα PostgreSQL ααΆααα’ααα (αα½αβααΆααβα’αααβααααΎβαα) ααΌα ααααβααΌαβαααα»αβααααααααβααΆβααααΆααβαααβα’αααβαααβααΆαααβαααααΆβααΌα βααΆαβαααααα
#!/bin/bash
# Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, pgbouncer), ΡΠΎ Π²Π½Π°ΡΠ°Π»Π΅ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌ Π΅Π³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ½ Π½Π΅ Π½Π°ΡΡΠ³Π°Π» ΠΎΡΠΈΠ±ΠΎΠΊ Π² Π»ΠΎΠ³
service pgbouncer stop
# Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π΄Π΅ΠΌΠΎΠ½, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΡΠΏΠ°Π²ΡΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, monit), ΡΠΎ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π² Π½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° Π±Π°Π·Ρ (Ρ ΠΌΠ΅Π½Ρ ΡΡΠΎ pgsql12)
monit stop pgsql12
# ΠΈΠ»ΠΈ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ
service monit stop
# ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ°ΠΌΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
service postgresql stop
# ΡΠ΄Π°Π»ΡΠ΅ΠΌ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π±Π°Π·Ρ (!!!); Π»ΡΡΡΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΡ
ΠΊΠΎΠΏΠΈΡ, Π΅ΡΠ»ΠΈ Π΅ΡΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠ΅
rm -rf /var/lib/postgresql/12/main
# ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΡΠ΅Π·Π΅ΡΠ²Π½ΡΡ ΠΊΠΎΠΏΠΈΡ ΠΈ ΡΠ°Π·Π°ΡΡ
ΠΈΠ²ΠΈΡΡΠ΅ΠΌ Π΅Ρ
su - postgres -c '/usr/local/bin/wal-g backup-fetch /var/lib/postgresql/12/main LATEST'
# ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ ΡΡΠ΄ΠΎΠΌ Ρ Π±Π°Π·ΠΎΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ»-ΡΠΈΠ³Π½Π°Π» Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ (ΡΠΌ. https://postgrespro.ru/docs/postgresql/12/runtime-config-wal#RUNTIME-CONFIG-WAL-ARCHIVE-RECOVERY ), ΠΎΠ½ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΎΠ·Π΄Π°Π½ ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ postgres
su - postgres -c 'touch /var/lib/postgresql/12/main/recovery.signal'
# Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°Π»Π° ΠΏΡΠΎΡΠ΅ΡΡ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ
service postgresql start
αααααΆααα’ααααααα αααα·αα·αααααΎαααααΎαααΆαααΎαα‘αΎααα·α αααααααΌα αα½αααααααααα bash ααααΌαααΆααααα ααα ααΆαααααα ααΌα αααααααα»αααααΈααΆααααα αΆαααα»αααΆααααααααα ααααααΈαααΉαααΆααααΆαα½αααΉααααααΌαα ααααααα·αααΌαααα αααα»αα§ααΆα αααααα ααΆααααα½ααα·αα·αααα ααα½α 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
ααΎααααΈαα·αα·αααααΎααα·αα·αααα - ααΆα
#!/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 ;ααΌααα·αα·ααΈαααΈ ;- α αΎαααΆααα·αα·α αααααααααΆαααααααααΆα α·ααα ααΆαααΆαααααΉααα»αααΆα αααΎαααα!
ααααα: www.habr.com