INNODB Recovery – INNODB kurtarma (Cpanel linux server)

Bu innodb sorunlarıyla ilgili o kadar uğraştık ki sonunda kurtarmanın bir yolunu bulduk fakat doğrusu atomu parçalamak gerekti.
Arama motorlarında bu konuyla ilgili yeterli bilgi mevcut değil.
Her aramanız sizi innodb veritabanı sorunlarında innodb_force_recovery = 1 – 2 – 3 – 4 – 5 – 6 ya yönlendirecektir.
http://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html gibi.
Force recovery modu sql’i read only mode a çektiği için istediğinizi tam olarak alamayacaksınız.
INNODB sorunlarında 2 nokta var.Birincisi geri dönüşü olmayan noktaya gelmediğini kısım.Burda /etc/my.cnf altına ekleyeceğiniz innodb_force_recovery = 1 sizi kurtaracaktır.Fakat bir de innodb_force_recovery = 1 ile SQL i çalıştıramadığınız kısım var. SQL’i sadece innodb_force_recovery = 4 ile read only mode da başlatabiliyorsanız geri dönüşü zor yola gelmişsiniz demektir.
İşte size bu kısımdan bahsedeceğim.

Şimdi,

loglardan baktığınızda sizi mysqlin sayfasına yönlendiren ya da açıklama bulunmayan hatalar göreceksiniz.Mysql innodb_force_recovery = 4 olmadan başlamıyor ve sunucunuzdaki veritabanları çalışmıyor.

Hatanın sebebi şu ; sunucunuzdaki innodb veritabanlarının tümü duruyor fakat ibdata klasörü altındaki şema ile eşleşmiyor.Yani ibdatanın innodb veritabanları için tuttuğu şema bozulmuş ve id’ler hash ler ile eşleşmiyor.
Sayısız şey denediğimizi söyleyebilirim.

Şöyle çözdük,

http://anilkutman.com/inno.txt
link sunucunuza çekip pl olarak değiştirip ./ ile çalıştırın.
Bu sayede read only modeda alamadığınız tüm innodb veritabanlarının yedeğini alabileceksiniz.
Yedekelerinizi /home/innodb_dumps/ klasörüne atacak.
Şimdi yapmamız gereken innodb veritabanlarını /var/lib/mysql içinden klasör olarak silip , sonra bu klasörleri yeniden oluşturup aldığınız veritabanı yedeklerini aynı klasörlere restore etmek ve ibdata ibdatalog klasörlerini sql i yeniden başlatarak ibdata şemasının yeniden başlamasını sağlamak olacak.
Bunun için ,
önce ibdata yedeklerini alın.
mkdir /var/lib/mysql/INNODB_BACKUPS
mv /var/lib/mysql/ib* /var/lib/mysql/INNODB_BACKUPS
/etc/my.cnf üzerinden innodb_force_recovery = 4 yada kaç olarak çalıştırdıysanız kaldırın.
Sonra mevcut innodb veritabanalrınnın yedeğini alın.
mv /var/lib/mysql/MYSQLDBNAME /var/lib/mysql/INNODB_BACKUPS
Sonra izinlerini düzenleyin,
mkdir /var/lib/mysql/MYSQLDBNAME
chown mysql:mysql /var/lib/mysql/MYSQLDBNAME

Aşağıdaki scripti dosya yoluna göre düzenleyip çalıştırarak klasörleri yeniden oluşturup izinleri düzenleyin

#!/bin/bash
for entry in `ls /home/innodb_dumps/yedekler | cut -d'.' -f1`;
do
echo $entry
mv /var/lib/mysql/$entry /var/lib/mysql/INNODB_BACKUPS
mkdir /var/lib/mysql/$entry
chown mysql:mysql /var/lib/mysql/$entry
done

Aldığınız yedek veritabanlarını restore edin ve my.cnf’u boşaltıp sql i başlatın.
Hatalı veritabanları çıkabilir ve bu nedenle sql başlamayabilir .hatalı veritabanlarını silin.SQL leri kurtardınız.
Evet zor biliyorum ama alternatifini henüz balamadık.
Bu arada sqlleri restore ederken hatalı veritabanları yüzünden mysql restart olabilir ve yedekleri eksik alabilirsiniz.Buna dikkat etmenizde yarar var.

Bir Cevap Yazın