ááµá¬á áá° SQL áá£á (á áá áá pg_áá£á ááá pg_dumpall) á¥á© áá³á¥ á áá°áá. áš PostgreSQL DBMS ááµá¬ áááµááᥠáµáááá áá áá ášá°á»á ááᢠpg_basebackup, áá á ášWAL áááᥠááµá³áá»áᜠáááµá®áœ á á á«á°áááá. ááá áá á áá ášááá á á¥á áá°áá ášá áµ ášááááµ á á ááá áá°áµá áá¥ááµ á²ááá©, ááá áµá« áááµá«áµ á¢á«ááµ áááµ á£áá¶áµáµ á³ááá ááá á¥áá°áá«áµáááá á¥á ášáá á¥á ášá³áœ á áá á¥áá³áá°áááµ áášá±áá³á. áášá«á áááµá³ááµ WAL-G á°áá ášá¢
áá
áá£á¥á á ááááµ ášá°ááá á¥áááŽá áµáá³á áááµášá ááᢠá¥á DBA á áá°ááá á¥á á«áŽá á ááááá ááá áááᜠá¥áœáááᣠáµááá
ááááá á¥ááá¶áœ á á°áµá³ ááá áá!
áášá¥á»á£ ášáá á á³áœ á«áá ááá áá á°ááá á¥á á PostgreSQL 12.3 á á¡á¡áá± 18.04 áá ášá°áá°á áááá á áµá°áá«ááᣠááá áµáááᜠá¥áá° áá© á°á áá ááá á áá£ážáá¢
á áá¥á
áá
á áœáá á ááœáá áµ áá ášá°ášááá ášáá-á áµáªáµ ááá¢
#!/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 á£áá²" á¥á ášáá³ášá» áááᜠá«áµááááá³á.
áµá áá-á ášáá°ááµ ááá áá£á¥áᜠášá á«á£á¢ á°áááá®áœá á áá áá áá
ášáµá á°á á
áááᣠááá áá á áá
áááµ á
áá¥á®á¹ á ááµá¥ áááá
#!/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_ááá_áá³ááá« - á S3 ááµá¥ ášáá³ášá» áááá áášá« á áááá áá ááᶠášá°ááá° á¥ááá áááᜠReadOnly Policy ááá«ážá ááá£á! áá á áááá áá á£áá ááá ááµá¥ á á áá áááá ááµá¥ á°ááá¿á.);
- AWS_SECRET_ACCESS_ááá - á S3 áášáá» ááµá¥ ááµá¥á«á ááá;
- WALG_COMPRESSION_METHOD - ášáášááá« áᎠᣠBrotli á áá áá ášá°á»á áá (áá á áášášá»á áá á á¥á á áášáá / á áášááá áá¥ááµ áá«ášá á«áá áááá á áá«á áµááá)
- WALG_DELTA_MAX_STEPS - áá ááµá¬á ášááá áá á ááµ áš âáŽáá³áµâ á¥ááµ (ááá á¥á ášáášá°áá ááᥠáá á ááá¥á£á ᣠáá ášááᶠááá áá°á±á á áµáá¹ ááááµ ááœáá ᣠáµáááá áµáá á¥áŽá¶áœá áá áá á°áᢠá áá°áá);
- PGDATA - ášáášá ááµá áá áá° ááá«á ášáááµáµ ááááµ (áµáááá á áááµ ááá ááœáá pg_lsclusters);
- PGHOST - ášáášá áá± áá ááááᵠᣠášá á«á£á¢á«á ááµá¬ áá á áá áá³á ááµá¥ á¥áá°áá³ášá á á©áááµ-á¶á¬áµ á á©á ááµášá ášá°á»á ááá¢
ááᜠáááªá«áᜠá á°áá± ááµá¥ ááá ááœáá-
PostgreSQL á áááá áá
á áášá áá± ááµá¥ á«áá áááᥠá€áµ ášWAL áááᥠááµá³áá»ááœá áá° á°ááá á¥áá²á°á á á¥á á¥áá±á áá°áá ášá áµ á¥áá²áááµ (á áµááá ášáá) á ááááªá«á ááá ááµá¥ á¥á áááªá«ááœá áááááµ á«áµááááá³á /ááá°/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 áááᥠááµá³áá»áᜠááµá¥ áá á«á á áášá á¥áá°ááá, "á¥ááµ" - áááá ááá ááá;
- áá á°á_ááá³ - ášáááªá«á áµáááá á áá áá ášWAL áááᥠááµá³áá»ááœá ááášáµ á áá ášáá á°á_áµá¥áá;
- ášáá á°á_áµá¥áá - ášá°á ááááá ášWAL áá á áá á°á áááµááᥠáµá¥áá;
- ášáá á°á_áá áá¥áá« - ášáááᥠááµá³áá»ááœá ááµááᥠášáášáááá á²á ááá á¥á» áá, ááá áá á ááááá ášá°ááá / áá° ášááᥠáá³ áµáᜠááᥠá«ášá, á á°ášáá¶áœ ááµá¥ áá°á¥ áá áá± áááá«á³á áá, ášáá« á áá ášáá á°á áááᥠá áá³á áá£áá (á ášá°ášáá± áá° á³á³á€á á áááµá¬ á¥áœáááᣠáµááá áá áá áá€áµ á áááµ ááµá¥ áááááá áá°áá©áá¢);
- áá°áá ášá áµ_áµááá - "áá ááµá¬" (á€á áá á£á áá«) á áášá áá± ááµá¥ ášá áᥠáá áááŠáœ ášááá áš WAL áááᥠááµá³áá»á ášáá á£á áá« áá°áá ášá áµ áááááµ áµá¥áá á¥á á áá ááááá¢
á áááá á°ááµ áµááá ááµá¥ áµáá¥ááá
áá áááªá«áᜠášá áá ááá ᥠááœáá-
ášáá á£á áá« ááááá¥á á áááááµ áá
á ááµ á°á ášáááášá ááá ááá áá, á¥á±á áááµá¬áµ á á£á á ááºá ááááµ áá®á áá. ááµá¬ááœá áááá á ášáááá ášá áá ááᢠáá ááµá¬á áááá á á áµá¥áá á¥ááááá¡ á wal-g áá ášááµáááªá« áááá ááᢠááµá¬-áá. áá á ááááªá« ᣠááá ááá á°á á áááá ááášááᥠáá áá áµááá ášááµáµáá¬áµ á°á áá á á¥á áááµ áá»áá (á¥á ááá ášáá³ášá» áµá á°á¶áœ ášáá)
#!/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 am áá áááá«áá¢
ášáµá® ááµá¬ááœá á áá°ášá áá
áááá£áµáᣠášáá¶ááá ááá áááá áá á£á áá«áᜠáá á áá ááášáµ á á«áµáááááµáᣠáµááá áášáá»áá á ášááá âááœá³áµâ (ááá±á âáá áá á£á áá«ááœâ á¥á áš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
áá®á áá áá á°áá£á á ášáá ášá áá± 6á¡30 áá á«á«áá³áᣠááááµ 10 áááµ á ááᜠá«ááá á áµá°áá áááá ááá (áá ááµá¬ááœáᣠáŽáá³ááœá á¥á ááá³ááœá) áá°áááᣠááá áá á¢á«ááµ á ááµ ááµá¬ áá°áááᢠáá° ášá°áá°á áá áµááá ááááá áá¥á¥ пПÑле áááµ á PITR ááµá¥ á°á«áµá°ááá¢
ášáá á£á áá« áá°áá ášá áµ ááááµ
áá€áá á³á³á€á ááá á ášááá áá°áá ášá áµ ááááµ á¥á á ááµá¡ á«ááá áášá áµááááááµ áášááᥠááá ášááá ášá°á°ááš á áá°ááᢠá áá ááá ááµá¥ WAL-Gá á áá áá á¥ááŽáµ áááá á¥áá°ááœá á¥ááááá³áá, á¥á á áá áµá áŒá®áœ á¥ááááá«áá.
á á°áá á áᥠáá£á ášááá£á áá á áášá« á á«á£á¢ (á«áá°áášá° ááá áá) áá°áá ášá áµ áááááµ á S3 ááµá¥ ášáá á£á áá« á áááœá á áµáááµ ááááá ááá ᥠá¥á» á«áµááááá³áᢠá WAL-G áá³áᣠá S3 á°á áá á á¡áµá ááá² ááµá¥ ášáášá°ááµá áá¥á¶áœ áááááµ á«áµááááá³á (á°á ááá¡ áááµ): s3: ááá á«áá, 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
ášááᶠááá áá°á±á áááá°áœ ááááá, ášáá á á³áœ áµáᜠášá£áœ á áµááµ á°ááá á·á, áµááá á á áááá áá áœáá®áœ á«áá á, áµááªáá± ášáá® áá á áá ášááá« á®áµ áááµáá. á áá áá³á 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 ááµá¥ áŒá áá«ááµ ááœáá). ááá áá á¢á«ááµ á áášá áá± ááµá¥ á«ááá áášá á¥á á¢ááŽáá¶áœ ááá°áœ á áµááá áá.
ááá¡á áááá°áœ á áá»á» áá á«ááá« ááµá¥ ááµá¬áµ á á áá, ááá áá ášááᥠáá³áá á²áá¥á© áŒá®áœ á¥áá²á°á© ááµášá ášá°á»á áá (
#!/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 / ááªá« á² ;MongODB ;ááááŽáœá á²á¢ ;- á¥á á áµááá¶á¹ á áááá á¥á á°ášá᪠áá á áá!
ááá: hab.com