MySQL "No space left on device" — Disk Dolu Ama Neden?
ERROR 28 ve ERROR 1114 farkı, binlog ve undo şişmesi, inode tükenmesi ve veri kaybetmeden disk açma adımları.
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
İki farklı mesaj, iki farklı katman:
ERROR 1030 (HY000): Got error 28 from storage engine -- gerçekten disk dolu (OS)
ERROR 1114 (HY000): The table 'siparis' is full -- tablo / tablespace sınırı (InnoDB)error 28 işletim sisteminden gelir (ENOSPC) ve diskte yer kalmadığını söyler. 1114 ise genellikle InnoDB'nin sabit boyutlu tablespace sınırına ya da autoextend kapalı bir yapıya işaret eder. MySQL'de disk doluluğunun sorumlusu çoğu zaman tablonun kendisi değil, binlog ve undo log dosyalarıdır.
▸Adım adım teşhis
1. Gerçekten yer var mı, inode var mı?
df -h
df -idf -h yer olduğunu söylerken df -i %100 ise sorun inode tükenmesidir — milyonlarca küçük geçici dosya (tmpdir veya partition başına tablo dosyaları).
2. Neyin büyüdüğünü bulun.
SHOW VARIABLES LIKE 'datadir';
SHOW VARIABLES LIKE 'tmpdir';
SHOW VARIABLES LIKE 'innodb_data_file_path';
SHOW BINARY LOGS;du -sh /var/lib/mysql/* | sort -h | tail -20
du -sh /var/lib/mysql/#innodb_redo 2>/dev/null
du -sh /var/lib/mysql/*.binlog 2>/dev/null | tailBinlog'lar, redo log ve undo dosyaları genellikle ilk üç sırada çıkar.
3. Tablo bazlı boyut analizi.
SELECT table_schema,
ROUND(SUM(data_length) / 1024 / 1024) AS veri_mb,
ROUND(SUM(index_length) / 1024 / 1024) AS indeks_mb
FROM information_schema.tables
GROUP BY 1
ORDER BY 2 DESC;▸Çözüm adımları
1. Binlog'ları temizleyin (veri kaybetmeden en hızlı yer açma yolu).
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);Kalıcı otomatik temizlik:
SET PERSIST binlog_expire_logs_seconds = 604800; -- 7 gün2. Geçici dosyaları (`tmpdir`) hedefleyin. Büyük ORDER BY / GROUP BY sorguları diske taşar:
SELECT COUNT(*) FROM information_schema.processlist WHERE command = 'Query';
SHOW VARIABLES LIKE 'tmp_table_size';
SHOW VARIABLES LIKE 'max_heap_table_size';3. Tablespace'i büyütün. innodb_data_file_path içinde autoextend yoksa sabit boyut dolmuştur:
innodb_data_file_path = ibdata1:12M:autoextend:max:64GBu ayarı my.cnf'te değiştirmek MySQL'in yeniden başlatılmasını gerektirir. 1114 hatası alıyorsanız ve diskte yer varsa ilk bakılacak yer burasıdır.
4. Undo log şişmesini kontrol edin. Uzun süren açık bir transaction undo alanını büyütür. Uzun transaction'ı bitirmek dosyayı küçültmese de kontrolsüz büyümeyi derhal durdurur.
▸Bunu bir daha yaşamamak için
Disk dolduğunda panik yapıp rastgele DROP TABLE aramak yerine, önce binlog ve tmpdir bakın. Veritabanı veri dizinini asla işletim sistemi kök bölümüne kurmayın; disk dolduğunda SSH dahi açılmaz.
- •İlgili CheatSheet: MySQL InnoDB Tuning Referansı
- •İlgili CheatSheet: MySQL Yedekleme & Kurtarma
Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
PostgreSQL too many clients already Hatası: 6 Adımda Çözüm
FATAL: sorry, too many clients already hatasının üç nedeni, nedeni ayırt eden tek sorgu ve max_connections ile PgBouncer üzerinden kalıcı çözümü.
PostgreSQL password authentication failed Hatası: Neden ve Çözüm
psql password authentication failed hatasının dört nedeni: yanlış şifre, md5/SCRAM uyuşmazlığı, pg_hba.conf sırası ve yanlış cluster. Adım adım teşhis.
MySQL ERROR 1045 Access denied: root Şifresi Sıfırlama Rehberi
MySQL 1045 hatasının dört nedeni, "using password: YES/NO" ayrımının anlamı ve kilitli kalınca --init-file ile güvenli şifre sıfırlama.