Monitorings

PostgreSQL veselības pārbaude (health check): DBA kontrolsaraksts ar vaicājumiem

PostgreSQL veselības pārbaude nav paneļa ekrānuzņēmums. Tas ir īss jautājumu saraksts, kas paredz nākamo avāriju. Šeit ir jautājumi, ar kuriem sākam, precīzi vaicājumi aiz tiem un kā lasīt atbildes lielā produkcijas datubāzē.

· 13 min lasīšanai · AG Data komanda

PostgreSQL veselības pārbaude (health check) atbild uz vienu jautājumu: kas visticamāk apturēs šo datubāzi, un cik drīz? Lielākā daļa problēmu, ko atrodam produkcijā, bija redzamas statistikas skatos jau nedēļām iepriekš. Tos vienkārši neviens neskatījās. Šis kontrolsaraksts ir secība, kādā ejam cauri jaunai sistēmai, ar vaicājumiem, kas darbojas jebkurā mūsdienīgā PostgreSQL, un piezīmēm par to, ko uzskatīt par steidzamu.

1. Versija, darbības laiks un wraparound risks

SELECT version(), pg_postmaster_start_time(), now() - pg_postmaster_start_time() AS uptime;

-- transakciju ID vecums katrai datubāzei (piespiedu vacuum sākas pie autovacuum_freeze_max_age)
SELECT datname, age(datfrozenxid) AS xid_age,
       current_setting('autovacuum_freeze_max_age') AS freeze_max_age
FROM pg_database ORDER BY 2 DESC;

2. Savienojumi un garas transakcijas

SELECT state, count(*) FROM pg_stat_activity GROUP BY state;

SELECT pid, usename, state, now() - xact_start AS xact_age, left(query, 60)
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
ORDER BY xact_start LIMIT 10;

Skatieties uz divām lietām. Pirmkārt, cik sesiju ir stāvoklī idle in transaction. Otrkārt, vecākās atvērtās transakcijas vecumu. Transakcija, kas atvērta stundām, aiztur vacuum: rindas, kas kļuvušas mirušas pēc tās momentuzņēmuma, nevar izņemt, kamēr tā nav beigusies. Noslogotā datubāzē tas vien rada bloat un lēnākus vaicājumus. Atrodiet lietotni, kas to izraisa, un kā drošības tīklu iestatiet idle_in_transaction_session_timeout.

3. Replikācija, sloti un WAL arhivēšana

SELECT application_name, state, sync_state, replay_lag FROM pg_stat_replication;

SELECT slot_name, slot_type, active, wal_status, safe_wal_size
FROM pg_replication_slots;

SELECT archived_count, failed_count, last_failed_wal, last_failed_time
FROM pg_stat_archiver;

4. Datubāzes līmeņa skaitītāji

SELECT datname,
       round(100.0 * blks_hit / nullif(blks_hit + blks_read, 0), 2) AS cache_hit_pct,
       temp_files, pg_size_pretty(temp_bytes) AS temp_size,
       deadlocks, checksum_failures, stats_reset
FROM pg_stat_database WHERE datname IS NOT NULL;

5. Tabulas un indeksi

-- mirušās rindas un autovacuum aktivitāte
SELECT relname, n_live_tup, n_dead_tup, last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables ORDER BY n_dead_tup DESC LIMIT 10;

-- lieli indeksi, kas nav izmantoti kopš pēdējās statistikas atiestatīšanas (bez unikālajiem)
SELECT s.relname, s.indexrelname, pg_size_pretty(pg_relation_size(s.indexrelid)) AS size
FROM pg_stat_user_indexes s JOIN pg_index i ON i.indexrelid = s.indexrelid
WHERE s.idx_scan = 0 AND NOT i.indisunique
ORDER BY pg_relation_size(s.indexrelid) DESC LIMIT 10;

-- nederīgi indeksi, piemēram, pēc neizdevušās CREATE INDEX CONCURRENTLY
SELECT indexrelid::regclass FROM pg_index WHERE NOT indisvalid;

6. Kontrolpunkti un top vaicājumi

-- PostgreSQL 17+: kontrolpunkti pēc iemesla
SELECT num_timed, num_requested, num_done FROM pg_stat_checkpointer;
-- PostgreSQL 16 un vecākas: checkpoints_timed, checkpoints_req skatā pg_stat_bgwriter

-- vaicājumi ar lielāko kopējo laiku (paplašinājums pg_stat_statements; kolonnu nosaukumi kopš PostgreSQL 13)
SELECT calls, round(total_exec_time) AS total_ms, round(mean_exec_time, 1) AS mean_ms,
       left(query, 60)
FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10;

Ja pieprasīto kontrolpunktu ir skaidri vairāk nekā plānoto, WAL piepilda max_wal_size, pirms beidzas checkpoint_timeout, un tas nozīmē vairāk I/O un vairāk pilnu lapu ierakstu. Skats pg_stat_checkpointer pastāv kopš PostgreSQL 17. Vecākās versijās tie paši skaitītāji ir skatā pg_stat_bgwriter. Vaicājumiem kārtojiet pg_stat_statements pēc kopējā, nevis vidējā laika: 5 ms vaicājums, kas izsaukts piecdesmit miljonus reižu dienā, parasti ir svarīgāks par vienu lēnu atskaiti.

7. Drošības pamati

SHOW password_encryption;      -- scram-sha-256 ir noklusējums kopš PostgreSQL 14
SHOW data_checksums;
SHOW ssl;
SELECT rolname FROM pg_roles WHERE rolsuper;
SELECT rolname FROM pg_authid WHERE rolpassword LIKE 'md5%';
Viens momentuzņēmums nav veselības pārbaude. Lielākā daļa šo skaitītāju ir kumulatīvi. Palaidiet vaicājumus divreiz, ar dienas vai nedēļas starpību, un skatieties uz starpību. Tabula, kurā dienas laikā parādījās 50 miljoni mirušu rindu, pasaka daudz vairāk nekā tās kopējais skaitlis.

Kas mainās lielās datubāzēs

Galvenās atziņas

PostgreSQL Veselības pārbaude Monitorings DBA kontrolsaraksts
Sadarbība ar mums

Vēlaties neatkarīgu skatu uz savu PostgreSQL?

Mēs veicam pilnu PostgreSQL veselības pārbaudi jūsu produkcijas klasterī, skaidrā valodā izskaidrojam katru atradumu un dodam prioritizētu labojumu sarakstu.

Sazināties Vairāk no emuāra