dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/postgresql-canceling-statement-statement-timeout
PostgreSQL
PostgreSQL 14–18Performans & Kilitler
8 dk okuma
ERROR: canceling statement due to statement timeout (SQLSTATE 57014)

PostgreSQL "canceling statement due to statement timeout" — Sorgu mu Yavaş, Kilit mi Bekliyor?

57014 kodunun arkasındaki dört farklı olay, pg_settings ile eşiğin kaynağını bulma ve timeout'u rol bazlı yönetme.

İnceleyen:Principal Database Reliability Architect
Test Edilen Sürümler: PostgreSQL 18.6 & 17.11 (Alpine Linux / Docker 29.7) | Tarihsel: PostgreSQL 14, 15, 16

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 30 Ekim 2026
Test Edilen SürümlerPostgreSQL 18.6 & 17.11 (Alpine / Docker 29.7) | Tarihsel: PostgreSQL 14.10, 15.6, 16.4
Gerekli YetkiSUPERUSER veya pg_read_all_stats (pg_stat_statements ve pg_blocking_pids analizi için)
Risk Seviyesi
Mediumstatement_timeout değerini global olarak 0 (sınırsız) yapmak bağlantı havuzlarının kilitlenmesine ve sistem çöküşüne yol açar
Beklenen Çıktı57014 kodunun 4 farklı kaynağının (statement timeout, lock timeout, user cancel, recovery conflict) net ayrılması
Geri Dönüş (Rollback) Planı:Timeout süresini global değil rol bazlı (web vs rapor) kademelendirme ve lock_timeout değerini statement_timeouttan kısa tutma
PostgreSQL Docs: Statement Timeout Configuration
İlk 60 Saniye Teşhis Protokolü:

Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.

▸Belirti

plaintext
ERROR: canceling statement due to statement timeout

Aynı PostgreSQL SQLSTATE kodu olan 57014 (query_canceled) altında dört tamamen farklı olay yaşanabilir:

plaintext
ERROR: canceling statement due to statement timeout ERROR: canceling statement due to lock timeout ERROR: canceling statement due to user request ERROR: canceling statement due to conflict with recovery
ÖNEMLİ
SQLSTATE Koduna Değil, Hata Metnine Bakın! Yalnızca 57014 kodunu görüp *"Sorgumuz yavaş çalışıyor, hemen yeni indeks ekleyelim"* demek, 4 senaryonun 3'ünde yanlış yerde zaman kaybetmek demektir: - `statement timeout`: Sorgu gerçekten işlemci/disk üzerinde uzun sürdü ve zaman aşımı sınırını aştı. - `lock timeout`: Sorgu 1 milisaniyede bitecek kadar hızlı olabilir; ancak başka bir işlem tabloyu kilitlediği için beklerken lock_timeout eşiğine takıldı! Çözüm indeks değil kilit zincirini çözmektir (H-19, H-27). - `user request`: İptal emri sunucudan değil istemciden geldi! İstemci kütüphanesi (JDBC setQueryTimeout, .NET CommandTimeout, Go context timeout) süresi dolduğu için PostgreSQL'e kasten pg_cancel_backend() gönderdi. Sunucu tarafında hiçbir ayar hatası yoktur. - `conflict with recovery`: Sorgu bir Read Replica üzerinde çalışırken Master'dan gelen WAL replay işlemiyle çakıştı (H-11).

▸Eşiğin Nereden Geldiğini Tespit Edin (`pg_settings`)

PostgreSQL'de statement_timeout ayarı beş farklı hiyerarşik katmandan gelebilir:

sql
SELECT name, setting, unit, source, sourcefile, sourceline FROM pg_settings WHERE name IN ('statement_timeout', 'lock_timeout', 'idle_in_transaction_session_timeout');

source sütunu teşhisi netleştirir:

  • •configuration file: postgresql.conf dosyasından gelen global ayar.
  • •database: ALTER DATABASE dbname SET statement_timeout = ... ile verilmiş veritabanı ayarı.
  • •user: ALTER ROLE app_user SET statement_timeout = ... ile atanmış rol düzeyi kısıtlama.
  • •client: Bağlantı havuzu (PgBouncer) veya uygulama kodu oturum açarken SET statement_timeout = ... gönderdi.
  • •default: Ayarlanmamış; PostgreSQL varsayılanı 0 (sınırsız).

▸Adım Adım Teşhis ve Çözüm Akışı

1. Yavaş Sorguyu pg_stat_statements ile Ölçün

Tahmin yürütmek yerine gerçek kaynak tüketimini sorgulayın:

sql
CREATE EXTENSION IF NOT EXISTS pg_stat_statements; SELECT queryid, calls, round(mean_exec_time::numeric, 1) AS ortalama_ms, round(total_exec_time::numeric) AS toplam_ms, left(query, 100) AS sorgu FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 15;
  • •total_exec_time veritabanına en çok kümülatif yük getiren sorguları gösterir.
  • •mean_exec_time tek başına timeout eşiğini aşan sorguları listeler.

2. Kilit Beklemesi (Lock Wait) Kontrolü

sql
SELECT pid, now() - query_start AS suredir, wait_event_type, wait_event, cardinality(pg_blocking_pids(pid)) AS bloklayan_sayisi, pg_blocking_pids(pid) AS bloklayan_pidler, left(query, 80) AS sorgu FROM pg_stat_activity WHERE state = 'active' AND pid <> pg_backend_pid() ORDER BY suredir DESC;

Eğer wait_event_type = 'Lock' ise sorgu CPU tüketmiyor; başka bir oturumun açtığı satır/tablo kilidini bekliyor demektir.

3. Gerçek Yürütme Planını (BUFFERS Dahil) Alın

sql
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;

BUFFERS ibaresi olmadan diskten okunan blok sayısını göremezsiniz; bellek (shared hit) ile disk (read) arasındaki farkı yalnızca buffers çıktısı gösterir.


▸Kalıcı Çözüm: Timeout Yönetimi Bir Politikadır

1. Global Timeout'u Sıfırlamak Büyük Bir Hatadır!

Timeout aldığında ilk yapılan hatalı refleks statement_timeout = 0 yapmaktır. Zaman aşımı eşiği bir emniyet kemeridir; onu kaldırmak yavaş sorguyu çözmez, aksine o sorgunun bağlantı havuzunu tüketip tüm siteyi çökertmesine yol açar.

2. Rol Bazlı Kademeli Zaman Aşımı Tanımlayın

Web kullanıcıları ile analitik rapor servisleri asla aynı timeout sınırına tabi olmamalıdır:

sql
-- Web API kullanıcıları için agresif sınır (5 saniye) ALTER ROLE app_web SET statement_timeout = '5s'; -- Gece çalışan raporlama kullanıcısı için geniş sınır (15 dakika) ALTER ROLE app_rapor SET statement_timeout = '15min';

3. lock_timeout Değerini statement_timeout Değerinden Kısa Tutun

sql
ALTER SYSTEM SET lock_timeout = '3s'; ALTER SYSTEM SET statement_timeout = '10s'; SELECT pg_reload_conf();

Bu sayede bir sorgu kilit yüzünden takıldığında, 10 saniye boyunca havuzu meşgul etmeden 3. saniyede canceling statement due to lock timeout hatasıyla hızla başarısız olur ve hatanın kilit kaynaklı olduğu logda açıkça belgelenir.


▸İlgili Hata Rehberleri & Hub Bağlantıları

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (50)