dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/mongodb-cursornotfound-exceeded-time-limit
MongoDB
MongoDB 6.0 - 8.0Sorgu & Cursor
6 dk okuma
CursorNotFound: cursor id 123 not found / ExceededTimeLimit / maxTimeMS expired

MongoDB İmleç Zaman Aşımı: 10 Dakikalık cursorTimeout Limiti, Batch İşleme ve maxTimeMS Yönetimi

Uzun süren toplu veri aktarımlarında istemcinin yavaş okuması sonucu sunucunun cursor'ı kapatması; batchSize optimizasyonu ve kontrollü noCursorTimeout kullanımı.

İnceleyen:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
Test Edilen Sürümler: MongoDB 6.0 / 7.0 / 8.0

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 2 Kasım 2026
Test Edilen SürümlerMongoDB 7.0.8, 8.0.1
Gerekli Yetkiread role on database
Risk Seviyesi
MediumnoCursorTimeout() kullanıp imleci manuel kapatmamak sunucuda kaynak sızıntısına yol açar
Beklenen ÇıktıbatchSize(1000) ile toplu veri çekiminin imleç düşmeden başarıyla tamamlanması
Geri Dönüş (Rollback) Planı:Cursor'ları manuel temizleme (db.killCursors)
MongoDB Docs: cursor.batchSize & Timeout
İ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

Toplu veri işleme veya migration scripti çalışırken belirli bir süre sonra aniden düşer:

plaintext
MongoServerError: cursor id 584930284729102938 not found MongoServerSelectionError: operation exceeded time limit (maxTimeMS expired)

▸Sahada Ne Görürsün?

Script 100.000 dokümanın ilk 30.000'ini işledikten sonra (yaklaşık 10. dakikada) imleç bulunamadı hatasıyla patlar.


▸Kök Neden Matrisi

OlasılıkKök NedenAçıklama
%6510 Dakikalık Hareketsizlik LimitiMongoDB sunucusu 10 dakika boyunca yeni batch talep edilmeyen cursor'ları belleği korumak için otomatik yok eder. İstemci dokümanı işlerken çok vakit kaybetmiştir.
%25Küçük `batchSize` Varsayılanı (101 Doküman)Her 101 dokümanda bir sunucuya gidilir; istemci yavaşsa aralık 10 dakikayı geçer.
%10`maxTimeMS` SınırıSorgu için tanımlanan çalışma bütçesi aşılmıştır.

▸ACİL RUNBOOK (0-5dk)

javascript
// 1. Sunucuda açık cursor sayısını gör db.serverStatus().metrics.cursor; // 2. Takılı kalan yetim cursor'ları sonlandır db.killCursors("prod.users", [NumberLong("584930284729102938")]); // 3. Acil script düzeltmesi: batchSize(1000) ve cursorTimeout süresini uzat db.adminCommand({ setParameter: 1, cursorTimeoutMillis: 1800000 }); // 30 dakika

▸KALICI BLUEPRINT

  1. 1`batchSize(1000)` Standardı: Toplu veri okuma scriptlerinde varsayılan yerine her zaman optimize edilmiş batch boyutu atanmalıdır:
javascript
const cursor = db.users.find().batchSize(1000);
  1. 1Kontrollü `noCursorTimeout` Kullanımı: Zorunlu uzun işlemlerde noCursorTimeout() açılmalı ancak try / finally bloğunda mutlaka manuel kapatılmalıdır (cursor.close()).

▸Doğrulama

javascript
db.serverStatus().metrics.cursor.open;

Diğer Veritabanı Hata Teşhisleri

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

Tüm Hatalar (82)