MySQL "No space left on device" ve "Table is full" Çözümü
MySQL "No space left on device" — Disk Dolu Ama Neden?
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
MySQL Diğer Üretim Rehberleri
Aynı veritabanı motoruna ait doğrulanmış diğer içerikler.
InnoDB Tuning Referansı
Buffer pool boyutlandırma formülü (%70-80), redo log ve flush politikaları, I/O kapasitesi, production my.cnf şablonu ve SHOW ENGINE INNODB STATUS okuma rehberi.
MySQL Yedekleme & Kurtarma
mysqldump ve MySQL Shell dumpInstance mantıksal yedekler, Percona XtraBackup fiziksel yedekleme, binary log ile PITR ve CLONE eklentisi.
MySQL OCP 8.0 DBA Sınav Konu Haritası
Oracle 1Z0-908 MySQL 8.0 Database Administrator sınavının 7 ana alanı: Mimari, Kurulum, Güvenlik, İzleme, Optimizasyon, Yedekleme, HA (InnoDB Cluster) ve sınav tuzakları.