dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
ÜRETİM TEŞHİS & OPERASYONEL SCRİPT KÜTÜPHANESİ

100 Kıdemli DBA & SRE Teşhis Scripti

PostgreSQL, MySQL, SQL Server, Oracle ve MongoDB için kilit zincirleri, bloat, replikasyon gecikmesi, önbellek isabeti ve darboğaz analizleri içeren salt okunur teşhis sorguları.

100 Doğrulanmış Script
Salt Okunur (Read-Only) Teşhis
5 Veritabanı Motoru
Gösterilen: 1-10 / 100 script (Toplam: 100)
Sayfa 1 / 10·ALL · ALL
#1
postgresql
Performance
read-onlyMin: 9.6

PostgreSQL'de Uzun Süren Sorguları ve Idle in Transaction Oturumlarını Bulma

Bir dakikadan uzun süredir çalışan sorguları, bekleme olaylarını ve vacuum'u engelleyen idle in transaction oturumlarını listeler. Performans olaylarında ilk bakılacak script'tir.

#pg_stat_activity#long-running#sessions#incident
sql
SELECT pid, usename, datname, state,
       now() - query_start AS query_age,
       now() - xact_start  AS xact_age,
       wait_event_type, wait_event,
       left(query, 200) AS query
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
  AND state <> 'idle'
  AND now() - query_start > interval '1 minute'
ORDER BY query_start;

Not: `idle in transaction` oturumları vacuum'u engeller. Sonlandırmak için (yazma etkisi) `SELECT pg_cancel_backend(pid);`, olmazsa `pg_terminate_backend(pid)`.

Detay & Paylaş
#2
postgresql
Locking
read-onlyMin: 9.6

PostgreSQL Kilit Zinciri: Kim Kimi Blokluyor?

pg_blocking_pids ile bloklanan ve bloklayan oturumları, sorgularıyla ve bekleme süreleriyle eşleştirir. Zincirin kök nedenini saniyeler içinde gösterir.

#locks#blocking#pg_blocking_pids#deadlock
sql
SELECT blocked.pid                AS blocked_pid,
       blocked.usename            AS blocked_user,
       left(blocked.query, 120)   AS blocked_query,
       blocker.pid                AS blocking_pid,
       blocker.usename            AS blocking_user,
       blocker.state              AS blocking_state,
       left(blocker.query, 120)   AS blocking_query,
       now() - blocked.query_start AS waiting_for
FROM pg_stat_activity blocked
JOIN LATERAL unnest(pg_blocking_pids(blocked.pid)) AS b(pid) ON true
JOIN pg_stat_activity blocker ON blocker.pid = b.pid
ORDER BY waiting_for DESC;

Not: Zincirin en başındaki (kendisi bloklanmayan) pid kök nedendir.

Detay & Paylaş
#3
postgresql
Maintenance
read-onlyMin: 9.4

PostgreSQL Dead Tuple, Bloat ve Autovacuum Durumu Kontrolü

Tablo bazında dead tuple oranını ve son vacuum/analyze zamanlarını gösterir. Autovacuum ayarının yetersiz kaldığı tabloları tespit etmenizi sağlar.

#vacuum#autovacuum#bloat#dead-tuples
sql
SELECT schemaname, relname,
       n_live_tup, n_dead_tup,
       round(100.0 * n_dead_tup / NULLIF(n_live_tup + n_dead_tup, 0), 2) AS dead_pct,
       last_vacuum, last_autovacuum, last_autoanalyze,
       pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_stat_user_tables
WHERE n_dead_tup > 10000
ORDER BY n_dead_tup DESC
LIMIT 30;

Not: `dead_pct` sürekli %20 üzerindeyse tablo bazında `autovacuum_vacuum_scale_factor` düşürmeyi düşünün.

Detay & Paylaş
#4
postgresql
Performance
read-onlyMin: 9.2

PostgreSQL'de Kullanılmayan İndeksleri Bulma

Hiç taranmamış, unique veya primary key olmayan indeksleri boyutlarıyla listeler. Gereksiz yazma maliyetini ve disk alanını geri kazanmak için temizlik adayı çıkarır.

#index#unused-index#pg_stat_user_indexes#cleanup
sql
SELECT s.schemaname, s.relname AS table_name, s.indexrelname AS index_name,
       s.idx_scan,
       pg_size_pretty(pg_relation_size(s.indexrelid)) AS index_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
  AND NOT i.indisprimary
ORDER BY pg_relation_size(s.indexrelid) DESC
LIMIT 30;

Not: İstatistikler son sıfırlamadan beri geçerlidir (`pg_stat_database.stats_reset`). Replica'larda kullanılan indeksleri de kontrol edin. Silmeden önce `DROP INDEX CONCURRENTLY` kullanın.

Detay & Paylaş
#5
postgresql
Performance
read-onlyMin: 13 (eski sürümde `total_time`, `mean_time`)

PostgreSQL En Pahalı Sorgular: pg_stat_statements ile Top 20

Toplam süreye, çağrı sayısına ve ortalama süreye göre en çok kaynak tüketen sorguları sıralar. Ayar çalışmasında önce hangi sorguya odaklanacağınızı belirler.

#pg_stat_statements#top-queries#tuning
sql
-- Gerekli: CREATE EXTENSION pg_stat_statements; (shared_preload_libraries)
SELECT round(total_exec_time::numeric, 0) AS total_ms,
       calls,
       round(mean_exec_time::numeric, 2)  AS mean_ms,
       round((100 * total_exec_time / sum(total_exec_time) OVER ())::numeric, 2) AS pct_total,
       rows,
       left(query, 150) AS query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;

Not: Üretim ortamında çalıştırmadan önce test ortamında doğrulayın. Salt okunur teşhis sorgusudur; sistem kilitlerine yol açmaz.

Detay & Paylaş
#6
postgresql
Replication
read-onlyMin: 10

PostgreSQL Streaming Replikasyon Gecikmesi Ölçümü

Primary üzerinde WAL gecikmesini bayt ve süre olarak, standby üzerinde ise replay gecikmesini gösterir. Replikasyon sağlığını ve RPO riskini izlemek için kullanılır.

#replication#lag#streaming#wal
sql
-- 1. Primary Üzerinde (Run on Primary)
SELECT application_name, client_addr, state, sync_state,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)) AS replay_lag_bytes,
       write_lag, flush_lag, replay_lag
FROM pg_stat_replication;

-- 2. Standby Üzerinde (Run on Standby)
SELECT now() - pg_last_xact_replay_timestamp() AS replay_delay;

Not: Üretim ortamında çalıştırmadan önce test ortamında doğrulayın. Salt okunur teşhis sorgusudur; sistem kilitlerine yol açmaz.

Detay & Paylaş
#7
postgresql
Monitoring
read-onlyMin: 9.x

PostgreSQL Transaction ID Wraparound Riski Kontrolü

Veritabanı bazında XID yaşını ve wraparound sınırına yüzde kaç yaklaşıldığını gösterir. Kritik bir kesintiyi önceden yakalamak için alarm kaynağıdır.

#xid#wraparound#freeze#critical
sql
SELECT datname,
       age(datfrozenxid) AS xid_age,
       round(100.0 * age(datfrozenxid) / 2147483647, 2) AS pct_to_wraparound
FROM pg_database
ORDER BY xid_age DESC;

Not: `autovacuum_freeze_max_age` (varsayılan 200 milyon) yaklaşıldığında agresif vacuum başlar. %50 üzerinde alarm kurun.

Detay & Paylaş
#8
postgresql
Storage
read-onlyMin: 9.x

PostgreSQL'de En Büyük Tablolar ve İndeks Boyutları

Tablo, indeks ve toplam boyutu tahmini satır sayısıyla sıralar. Kapasite planlaması ve bölümleme adaylarını belirlemek için kullanılır.

#table-size#capacity#pg_class#index-size
sql
SELECT n.nspname AS schema_name, c.relname AS table_name,
       pg_size_pretty(pg_total_relation_size(c.oid)) AS total_size,
       pg_size_pretty(pg_relation_size(c.oid))       AS table_size,
       pg_size_pretty(pg_indexes_size(c.oid))        AS index_size,
       c.reltuples::bigint AS est_rows
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','m','p')
  AND n.nspname NOT IN ('pg_catalog','information_schema','pg_toast')
ORDER BY pg_total_relation_size(c.oid) DESC
LIMIT 25;

Not: `reltuples` bir tahmindir; `ANALYZE` sonrası güncellenir.

Detay & Paylaş
#9
postgresql
Monitoring
read-onlyMin: 9.x

PostgreSQL Buffer Cache Hit Oranı

Veritabanı bazında shared buffer isabet oranını hesaplar. Belleğin yetersiz olup olmadığını ve diskten gereksiz okuma yapılıp yapılmadığını gösterir.

#cache-hit#shared_buffers#pg_stat_database
sql
SELECT datname, blks_hit, blks_read,
       round(100.0 * blks_hit / NULLIF(blks_hit + blks_read, 0), 2) AS hit_pct
FROM pg_stat_database
WHERE datname IS NOT NULL
ORDER BY blks_read DESC;

Not: OLTP'de %99 üzeri beklenir. OS cache de devrede olduğundan tek başına karar vermeyin; `pg_stat_io` (16+) ile birlikte yorumlayın.

Detay & Paylaş
#10
postgresql
Performance
read-onlyMin: 9.x

PostgreSQL'de Sürekli Sequential Scan Yapılan Tablolar

Çok sayıda satırı sequential scan ile okuyan tabloları bulur. Eksik indeks adaylarını belirlemek için ilk adımdır.

#seq-scan#missing-index#pg_stat_user_tables
sql
SELECT schemaname, relname, seq_scan, seq_tup_read,
       idx_scan, n_live_tup,
       round(seq_tup_read::numeric / NULLIF(seq_scan, 0)) AS avg_rows_per_seq_scan
FROM pg_stat_user_tables
WHERE seq_scan > 0 AND n_live_tup > 10000
ORDER BY seq_tup_read DESC
LIMIT 20;

Not: Küçük tablolarda seq scan normaldir; filtre alanına göre indeks açmadan önce ilgili sorguyu `EXPLAIN` ile doğrulayın.

Detay & Paylaş