giriiş
Bazen MySQL tabloları bozulabilir; bu da bir hata oluştuğu ve tablolarda depolanan verilerin okunamadığı anlamına gelir. Bozuk bir tablodan okuma girişiminde bulunmak genellikle sunucunun çökmesine neden olur.
Tablo bozulmasının bazı yaygın nedenleri şunlardır:
- MySQL sunucusu bir yazma işleminin ortasında duruyor.
- Sunucu tarafından aynı anda değiştirilen bir tabloyu harici bir uygulama değiştirir.
- Cihaz beklenmedik bir şekilde kapanıyor.
- Bilgisayar donanımı arızalanır.
- MySQL kodunda bir yerde yazılım hatası var.
Tablolarınızdan birinin bozulduğundan şüpheleniyorsanız, sorun gidermeye veya tabloyu onarmaya çalışmadan önce veri listenizi yedeklemelisiniz. Bu, veri kaybı riskini azaltmaya yardımcı olur.
Öncelikle MySQL servisini durduralım:
sudo systemctl stop mysqlArdından tüm verilerinizi yeni bir yedekleme klasörüne kopyalayın. Ubuntu sistemlerinde varsayılan veri dizini /var/lib/mysql/'dir:
cp -r /var/lib/mysql /var/lib/mysql_bkpYedeklemeyi aldıktan sonra, tablonun gerçekten bozuk olup olmadığını kontrol etmeye hazırsınız. Tablo MyISAM depolama motorunu kullanıyorsa, MySQL'i yeniden başlatıp MySQL komut isteminden CHECK TABLE ifadesini çalıştırarak bozulma olup olmadığını kontrol edebilirsiniz:
sudo systemctl start mysqlCHECK TABLE table_name;Bu ifadenin çıktısında, bozuk olup olmadığını bildiren bir mesaj görünecektir. MyISAM tablosu gerçekten bozuksa, genellikle REPAIR TABLE ifadesi çalıştırılarak onarılabilir:
REPAIR TABLE table_name;Onarımın başarılı olduğunu varsayarsak çıktınızda şuna benzer bir mesaj göreceksiniz:
Output
+--------------------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| database_name.table_name | repair | status | OK |
+--------------------------+--------+----------+----------+Eğer tablo hala bozuksa, MySQL dokümantasyonu bozuk tabloları onarmak için birkaç alternatif yöntem önermektedir.
Öte yandan, bozuk tablo InnoDB depolama motorunu kullanıyorsa, onarım süreci farklıdır. InnoDB, 8.0 sürümünden beri MySQL'deki varsayılan depolama motorudur ve otomatik bozulma denetimi ve onarımı özelliğine sahiptir. InnoDB, okuduğu her sayfada toplam kontrolleri gerçekleştirerek bozuk sayfaları kontrol eder ve bir sıralama tutarsızlığı tespit ederse MySQL sunucusunu otomatik olarak durdurur.
InnoDB tablolarını onarmaya nadiren ihtiyaç duyulur, çünkü InnoDB, sunucu yeniden başlatıldığında çoğu sorunu çözebilen bir çökme kurtarma mekanizmasına sahiptir. Ancak, bozuk bir InnoDB tablosunu yeniden oluşturmanız gereken bir durumla karşılaşırsanız, MySQL belgeleri Dump and Reload yöntemini kullanmanızı önerir. Bu yöntem, bozuk tabloya erişimi geri yüklemeyi, mysqldump yardımcı programını kullanarak tablonun yapısını ve içindeki verileri koruyan mantıksal bir yedeğini oluşturmayı ve ardından tabloyu veritabanına yeniden yüklemeyi içerir.
Bunu aklınızda tutarak MySQL servisini yeniden başlatarak sunucuya erişiminizin olup olmadığını kontrol edin:
sudo systemctl restart mysqlSunucu kapalıysa veya erişilemiyorsa, InnoDB force_recovery seçeneğini etkinleştirmek faydalı olabilir. Bunu mysqld.cnf dosyasını düzenleyerek yapabilirsiniz. Ubuntu ve Debian sistemlerinde bu dosya genellikle etc/mysql konumunda bulunur. Red Hat ve Rocky sistemlerinde ise bu dosya genellikle /etc/my.cnf.d konumunda bulunur.
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf[mysqld] bölümüne aşağıdaki satırı ekleyin:
. . .
[mysqld]
. . .
innodb_force_recovery=1Dosyayı kaydedip kapatın ve ardından MySQL hizmetini yeniden başlatın. Bozuk tabloya başarıyla erişebiliyorsanız, mysqldump yardımcı programını kullanarak tablo verilerinizi yeni bir dosyaya aktarın. Bu dosyaya istediğiniz adı verebilirsiniz, ancak biz burada dump.sql adını vereceğiz:
mysqldump database_name table_name > out.sqlArdından tabloyu veritabanından silin. MySQL komutunun tekrar açılmasını önlemek için aşağıdaki komutu kullanabilirsiniz:
mysql -u user -p --execute="DROP TABLE database_name.table_name"Daha sonra oluşturduğunuz dump dosyası ile tabloyu geri yükleyin:
mysql -u user -p < out.sqlInnoDB depolama motorunun genellikle eski MyISAM motorundan daha fazla hata toleransına sahip olduğunu unutmayın. InnoDB kullanan tablolar yine de bozulabilir, ancak kendi kendini onarma özellikleri sayesinde tablo bozulması ve arıza riski önemli ölçüde daha düşüktür.









