dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Kütüphanesi/MySQL/mysql-no-space-left-on-device
MySQL
MySQL 8.0 - 8.4
6 dk okuma
ERROR 1030 (HY000): Got error 28 from storage engine / ERROR 1114: The table is full

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ı.

Standart:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
Test Edilen Sürümler: MySQL 8.0 / 8.4 LTS
İ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

İki farklı mesaj, iki farklı katman:

plaintext
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ı?

bash
df -h df -i

df -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.

sql
SHOW VARIABLES LIKE 'datadir'; SHOW VARIABLES LIKE 'tmpdir'; SHOW VARIABLES LIKE 'innodb_data_file_path'; SHOW BINARY LOGS;
bash
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 | tail

Binlog'lar, redo log ve undo dosyaları genellikle ilk üç sırada çıkar.

3. Tablo bazlı boyut analizi.

sql
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).

sql
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);

Kalıcı otomatik temizlik:

sql
SET PERSIST binlog_expire_logs_seconds = 604800; -- 7 gün
[!WARNING] Bu değişiklik replikasyon kullanan ortamlarda replica'nın geride kalma toleransını aşmamalıdır; 3 günlük log tutarken 4 gün kopmuş bir replica bir daha yetişemez.

2. Geçici dosyaları (`tmpdir`) hedefleyin. Büyük ORDER BY / GROUP BY sorguları diske taşar:

sql
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:

plaintext
innodb_data_file_path = ibdata1:12M:autoextend:max:64G

Bu 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.

Diğer Veritabanı Hata Teşhisleri

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

Tüm Hatalar (20)