DBAtlas · Veritabanı operasyon atlası

Undo / TempDB / geçici alan baskısı

Undo/rollback alanı, geçici (temp) alan ya da TempDB baskı altında. Baskının nerede olduğunu belirleyip büyük sort/hash, uzun sorgu/transaction veya alan sızıntısı gibi kök nedene iniyoruz.

Baskı nerede: undo mu, temp mi, tempdb çekişmesi mi?

Alan kullanımına bakarak baskının kaynağını sınıfla: undo/rollback tablespace mi doluyor, genel geçici (temp) alan mı, yoksa MSSQL'de TempDB sayfa tahsis latch çekişmesi mi?

SELECT tablespace_name, ROUND(used_percent,1) AS used_pct
FROM dba_tablespace_usage_metrics
WHERE tablespace_name LIKE '%UNDO%' OR tablespace_name LIKE 'TEMP%';
  • Undo/rollback alanı doluyor (ORA-01555 / ORA-30036)
  • Geçici (temp) alan doluyor (sort/hash spill)
  • TempDB tahsis latch çekişmesi (PFS/GAM/SGAM)

Undo'yu ne tüketiyor?

Undo baskısı iki tipiktir: uzun bir SORGU başladığı andaki tutarlı görüntü için eski undo'ya ihtiyaç duyuyor (ORA-01555) ya da uzun/açık bir TRANSACTION çok fazla undo üretip alanı doldurup ORA-30036'ya yol açıyor.

SELECT s.sid, s.username, t.used_ublk*8/1024 AS undo_mb, s.status, t.start_time
FROM v$transaction t JOIN v$session s ON s.taddr=t.addr
ORDER BY undo_mb DESC;
SELECT MAX(maxquerylen) AS en_uzun_sorgu_sn, MAX(tuned_undoretention) AS tuned_retention FROM v$undostat;
  • Uzun sorgu eski undo istiyor (ORA-01555)
  • Uzun/açık transaction undo biriktiriyor (ORA-30036)

Geçici alanı ne dolduruyor?

Temp baskısı ya büyük bir sıralama/hash işleminin diske taşmasından (normal ama devasa) ya da tek bir oturumun temp'i sürekli tutmasından (açık cursor, sızıntı, hiç bitmeyen sorgu) gelir.

SELECT s.sid, s.username, u.tablespace, u.blocks*8/1024 AS temp_mb, u.sqladdr
FROM v$tempseg_usage u JOIN v$session s ON s.saddr=u.session_addr
ORDER BY temp_mb DESC;
  • Büyük sort/hash işlemi diske taşıyor
  • Tek oturum temp'i tutuyor (sızıntı/açık cursor)

TempDB çekişmesi tahsis mi yoksa hacim mi?

MSSQL TempDB'de iki farklı sorun olur: PFS/GAM/SGAM sayfalarında PAGELATCH çekişmesi (çok sayıda küçük geçici nesne) ya da büyük sıralama/version store'un TempDB'yi hacimce doldurması.

SELECT session_id, wait_type, wait_duration_ms, resource_description
FROM sys.dm_os_waiting_tasks
WHERE wait_type LIKE 'PAGELATCH%' AND resource_description LIKE '2:%';
SELECT COUNT(*) AS tempdb_data_files FROM sys.master_files WHERE database_id=2 AND type=0;
  • PFS/GAM/SGAM latch çekişmesi
  • Büyük sıralama/version store TempDB'yi dolduruyor

Kök neden: Uzun sorgu + yetersiz undo (ORA-01555)

Uzun sorgunun tutarlı okuma için ihtiyaç duyduğu eski undo, retention dolduğu ya da alan yetersiz olduğu için üzerine yazıldı.

Kök neden: Uzun/açık transaction undo doldurdu (ORA-30036)

Devasa tek bir DML ya da commit'i geciken açık transaction çok fazla undo üretti; UNDO tablespace genişleyemedi ve ORA-30036 alındı.

Kök neden: Büyük sort/hash geçici alanı dolduruyor

Belleğe sığmayan büyük sıralama/hash/group by işlemleri geçici alana taşıyor ve onu doldurabiliyor.

Kök neden: Oturum temp alanını tutuyor (sızıntı)

Tek bir oturum, kapanmayan cursor'lar, hiç bitmeyen bir sorgu ya da açık geçici tablolar yüzünden geçici alanı bırakmıyor.

Kök neden: TempDB PFS/GAM/SGAM latch çekişmesi

Çok sayıda oturum aynı anda küçük geçici nesneler yarattığında TempDB'nin tahsis haritası sayfalarında (PFS/GAM/SGAM) PAGELATCH çekişmesi oluşur.

DBAtlas'ta aç →