sunucuhataları
teknik çözüm merkezi
Ara Giriş Yap Üye Ol
🏠 Ana Sayfa 📚 Kurulum Rehberleri
Kategoriler
🌐 Web Sunucuları 🐧 İşletim Sistemleri 📦 Sanallaştırma & VPS 🖥️ Kontrol Panelleri 🔒 SSL & Güvenlik 📝 CMS & Uygulamalar 🗄️ Veritabanı 📧 Mail Sunucusu 🗨️ Forum ℹ️ Hakkımızda 📧 İletişim
Giriş Yap Üye Ol
Ana Sayfa Veritabanı MySQL Kurulumu MySQL Table is Full / Disk Full Hatası ve Çözümü
🐬 MySQL Kurulumu

MySQL Table is Full / Disk Full Hatası ve Çözümü

MySQL Table is full hatası, disk alanının dolması veya InnoDB ibdata1 dosyasının aşırı büyümesi sonucu oluşur. Kapsamlı çözüm rehberi.

📅 23 Nisan 2025 👁 5 görüntülenme ⏱ 5 dk okuma
𝕏 Paylaş
📋 İçindekiler göster/gizle

MySQL "Table is Full" Hatası Nedir?

MySQL veritabanına veri eklemeye veya güncellemeye çalışırken "Table is full" hatasıyla karşılaşmak, birkaç farklı probleme işaret edebilir. Bu hata her zaman disk alanı dolduğu anlamına gelmez; InnoDB motor konfigürasyonu, geçici tablo boyutu limitleri veya MyISAM tablo boyutu kısıtlamaları da bu hatayı tetikleyebilir.

ERROR 1114 (HY000): The table 'table_name' is full

Hatanın Başlıca Nedenleri

1. Disk Alanı Doldu

En yaygın nedendir. MySQL veri dizini bulunduğu disk bölümü dolduğunda yeni veri yazılamaz.

2. InnoDB ibdata1 Dosyası Aşırı Büyüdü

Varsayılan InnoDB yapılandırmasında tüm tablolar tek bir büyük dosyada (ibdata1) saklanır. Bu dosya sürekli büyür ve küçültülemez (shrink edilemez). innodb_file_per_table aktifleştirilmemişse ciddi yer sorunlarına yol açar.

3. tmp_table_size / max_heap_table_size Yetersiz

Karmaşık sorgular geçici tablolar oluşturur. Geçici tablo bellek limiti aşıldığında disk geçici tablosuna geçilir; disk de doluysa hata oluşur.

4. MyISAM Tablo Limiti

Eski MyISAM tablolarının 4GB boyut sınırı vardır (max_rows ve avg_row_length ayarlarına bağlı).

5. /tmp Dizini Doldu

MySQL geçici dosyaları /tmp dizinine yazar. Bu dizin dolduğunda da hata oluşabilir.

Tanı: Hatanın Kaynağını Belirleme

# Disk kullanımını kontrol et
df -h

# MySQL veri dizini disk kullanımı
du -sh /var/lib/mysql/

# ibdata1 dosyası boyutu
ls -lh /var/lib/mysql/ibdata1

# /tmp dizini boyutu
du -sh /tmp/

# MySQL error log
sudo tail -50 /var/log/mysql/error.log
# MySQL içinden kontrol
mysql -u root -p -e "SHOW VARIABLES LIKE 'tmpdir';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'tmp_table_size';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_file_per_table';"
mysql -u root -p -e "SHOW TABLE STATUS WHERE Engine='MyISAM';"

Çözüm 1: Disk Alanı Açma

# En büyük dosyaları bul
du -sh /var/lib/mysql/*/ | sort -rh | head -20

# Eski MySQL binary log dosyalarını temizle
mysql -u root -p -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"

# Eski log dosyalarını sil
find /var/log -name "*.log.gz" -mtime +30 -delete
find /var/log -name "*.log.1" -mtime +7 -delete

# Kullanılmayan tabloları düşür
mysql -u root -p DB_ADI -e "DROP TABLE IF EXISTS temp_table_old;"

Çözüm 2: OPTIMIZE TABLE ile Yer Kazanma

# Tek tablo optimize et
mysql -u root -p -e "OPTIMIZE TABLE database_adi.tablo_adi;"

# Tüm tabloları optimize et (dikkatli kullanın, yavaş olabilir)
mysqlcheck -u root -p --optimize --all-databases

OPTIMIZE TABLE komutu, silinmiş kayıtların bıraktığı boşlukları temizler ve tabloyu sıkıştırır. Büyük tablolarda uzun sürebilir.

Çözüm 3: tmp_table_size ve max_heap_table_size Artırma

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
tmp_table_size = 256M
max_heap_table_size = 256M
sudo systemctl restart mysql

# Geçici değişiklik (restart gerektirmez):
mysql -u root -p -e "SET GLOBAL tmp_table_size = 268435456;"
mysql -u root -p -e "SET GLOBAL max_heap_table_size = 268435456;"

Çözüm 4: InnoDB innodb_file_per_table Aktifleştirme

Bu ayar aktifleştirildiğinde her tablo kendi ayrı .ibd dosyasında saklanır. Bu sayede tablo silindiğinde yer gerçekten geri kazanılır:

[mysqld]
innodb_file_per_table = ON

Mevcut tabloları da ayrı dosyalara taşımak için:

mysql -u root -p -e "
SELECT CONCAT('ALTER TABLE ', table_schema, '.', table_name, ' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema', 'mysql', 'performance_schema')
AND engine = 'InnoDB';" | mysql -u root -p

Çözüm 5: ibdata1 Dosyasını Küçültme

ibdata1 doğrudan küçültülemez. Tek yol: tüm veritabanlarını yedekleyip MySQL'i sıfırdan kurmaktır.

# Tüm veritabanlarını yedekle
mysqldump -u root -p --all-databases > /backup/all_databases_$(date +%Y%m%d).sql

# MySQL durdur
sudo systemctl stop mysql

# InnoDB dosyalarını sil
sudo rm /var/lib/mysql/ibdata1
sudo rm /var/lib/mysql/ib_logfile*

# MySQL başlat (ibdata1 yeniden oluşturulur)
sudo systemctl start mysql

# Yedekten geri yükle
mysql -u root -p < /backup/all_databases_TARIH.sql

Dikkat: Bu işlem veri kaybı risklidir. Mutlaka tam yedek alın.

Çözüm 6: MySQL Veri Dizinini Taşıma

Mevcut disk dolmaya devam ediyorsa MySQL veri dizinini daha büyük bir diske taşıyabilirsiniz:

# MySQL durdur
sudo systemctl stop mysql

# Veri dizinini yeni konuma kopyala
sudo rsync -av /var/lib/mysql/ /yeni_disk/mysql/

# MySQL yapılandırmasında yeni konumu belirt
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
datadir = /yeni_disk/mysql
sudo systemctl start mysql

Önleyici Tedbirler

  • Disk kullanımını monitoring ile izleyin (%80 dolduğunda uyarı alın)
  • innodb_file_per_table = ON kullanın (yeni kurulumlarda varsayılan)
  • Binary log saklama süresini makul tutun (7 gün)
  • Düzenli OPTIMIZE TABLE çalıştırın
  • Gereksiz tabloları ve eski verileri temizleyin

Özet

MySQL Table is Full hatası için önce disk alanını kontrol edin, ardından ibdata1 boyutunu ve geçici tablo limitlerini inceleyin. Kısa vadede eski log dosyalarını silip OPTIMIZE TABLE çalıştırın. Uzun vadede innodb_file_per_table=ON ayarı ile her tablonun kendi dosyasında saklanmasını sağlayın ve disk kullanımını monitoring ile proaktif biçimde izleyin.

🤔 Bu kurulumda sorun mu yaşıyorsunuz?

Hata mesajınızı kopyalayıp foruma konu açın. Topluluğumuz size özel durumunuza göre yardımcı olacaktır.

🗨️ Foruma Katıl & Yardım Al

Yorumlar

Henüz yorum yok. İlk yorumu siz yapın!

Yorum Yap

Yorumunuz onaylandıktan sonra yayınlanır.