MySQL tabloları neden çöküyor? Nasıl önleyebilirim?


9

Ben Kullanıcılar tablosu bozuk olan ve kullanılamaz hale gelen bir Moodle sitesinin Yöneticisiyim .

Neyse ki, basit bir REPAIR TABLE mdl_usertekrar çalışmasını sağladı. Mesele şu ki, neden çöktüğünü ve kullanılamaz hale getirdiğini bilmiyorum ve bir dahaki sefere daha iyi hazırlandığımdan emin olmak istiyorum.

Ben tamamen tecrübeli bir DBA değilim - Ben sadece çok şey yapan bir geliştiriciyim, bu yüzden lütfen bana katlan.

Sadece bir yedeklemeyi geri yükleyebilirim, ancak çökmeleri önlemenin yolları var sanırım.

Bu tablolar utf8_general_ci ve MyISAM kullanıyor.

MySQL tablosu neden çöküyor? Bunun olmasını önlemek için ne yapabilirim?

Yanıtlar:


11

Bir MyISAM tablosunun çökmesi oldukça kolaydır.

Her MyISAM tablosunun başlığında, tabloya karşı kaç açık dosya tanıtıcısı bulunduğunu izleyen bir sayaç bulunur.

Mysql'yi başlatırsanız ve üstbilgideki sayı, gerçek dosya tanıtıcılarının sayısıyla eşleşmezse, mysqld tabloyu çökmüş olarak ele alır.

Bir basit REPAIR TABLE mdl_user, veri kaybı olmadan her seferinde tekrar çalışmasını sağlarsa, bu, çok trafik işlemleri yapılan bir siteye sahip olduğunuzu gösterebilir mdl_user.

Düzinelerce tablo bunu gerektiriyorsa REPAIR TABLE, tüm tabloları InnoDB dönüştürür. Ancak, mdl_usertablo bu soruna sahip tek tablo ise, yapabileceğiniz bir şey vardır (bu örnek için veritabanının olduğunu varsayalım moodle);

Tüm tabloların MyISAM olarak kalmasını istiyorsanız

ADIM 01: Onarım Tablosu Komut Dosyası Oluşturma

echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql

ADIM 02: Onarım Komut Dosyasını başlangıç ​​dosyası olarak bildirin

Bunu /etc/my.cnf dosyasına ekle

[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql

ADIM 03: MySQL'i yeniden başlat

MySQL'in her yeniden başlatılması, Onarım Tablosu Komut Dosyasını tetikler

Tüm tabloların InnoDB olmasını istiyorsanız

MyISAM tablolarının InnoDB'ye toplu dönüştürme komut dosyası yapmak için bu kodu çalıştırın ve görüntüleyin

MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"
echo "SET SQL_LOG_BIN = 0;" > /root/ConvertMyISAMToInnoDB.sql
mysql ${MYSQL_CONN} -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > /root/ConvertMyISAMToInnoDB.sql
less /root/ConvertMyISAMToInnoDB.sql

Dönüşüm komut dosyasının içeriğinden memnun olduğunuzda, çalıştırın

mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql

GÜNCELLEME 2012-03-15 14:00 EDT

@Kevin , MyISAM kullanırken, Disk Alanı yetersizse sorununuz nedir?

Dikkate alınması gereken bir nokta: MySQL 5.0 Sertifikasyon Çalışması Kılavuzu'na göre ,

resim açıklamasını buraya girin

madde işareti # 11 , Sayfa 408.409 Bölüm 29.2'de aşağıdakileri söylüyor:

MyISAM tablosuna satır eklerken disk alanınız tükenirse, hata oluşmaz. Sunucu, kullanılabilir alan elde edilene kadar işlemi askıya alır ve ardından işlemi tamamlar.

Disk alanınız bittiğinde, sadece mysql'yi kapatmayın veya öldürmeyin. Halen kullanılan MyISAM'deki açık dosya tanıtıcılarının sayısı silinmeyecektir. Böylece, MyISAM tablosu çöktü olarak işaretlenir. Mysqld hala çalışırken veri birimindeki disk alanını boşaltabilirseniz, disk alanı kullanılabilir duruma geldiğinde mysqld çalışır.


Mükemmel yanıt. Dosya tutamaçlarının bitini bilmiyordum ve bir şeyler ters gittiğinde nasıl önleyebileceğimi (veya otomatik olarak onarabileceğimi) zaten çözdünüz. Site aslında mdl_user (veya başka bir tablo) için çok fazla yazı yaparsa güvenlik için herhangi bir öneri?
AeroCross

Üç şey yapmalısınız: 1) RAM'i artırın, 2) max_connections'ı artırın, 3) InnoDB'ye geçin.
RolandoMySQLDBA

Noob burada. Bu kodu nerede "çalıştırırım"? Sunucuya yüklenen bir dosyadan mı, yoksa bazı komut satırından mı?
UncaughtTypeError

0

Ayrıca mysql üzerinde bir moodle sitesini yönetiyorum ve bizim için tablo bozulmasının en yaygın nedeni disk alanı tükeniyor.


@RolandoMySQLDBA - evet, disk alanı kesinlikle sorun (diğer bazı süreçler ve genel olarak yönetim felsefesi ile ilgili). Ne yazık ki, alan temizlendiğinde sorunun kendisini çözdüğünü görmüyoruz veya yeterince zamanında bir fasionda çözülmüyor. Benim yanıt sadece moodle / mysql örneğimizde, disk alanı sorunlarının mysql / myisam'ın ne yapması gerektiğine bakılmaksızın tablo çökmelerine neden olabileceğini belirtmekti.
Kevin

-3

Tüm tabloları InnoDB dönüştürmek için iyi bir satır buldum:

mysql -u root -p dbName -e "show table status where Engine='MyISAM';" | 
    awk 'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}'  | 
    mysql -u root -p dbName

Kod bunun için iyi olabilir, ancak ilk bölüm sorusuna cevap vermiyor (MySQL tablosu neden çöküyor?). İkinci kısmı (Nasıl önlenir?) Yanıtladığını kastediyorsanız, lütfen biraz daha açıklama ekleyin.
ypercubeᵀᴹ

Ayrıca daha fazla ayrıntı ekleyin. Bunu çalıştırmak veritabanındaki tüm tabloları dönüştürür mü? Yoksa sunucunun tamamı mı? Bir tablo dönüştürülemezse ve bir hata alırsak ne olur? Bazı tablolar dönüştürülmüş ve bazıları MyiSAM'da kalmış olabilir mi? Genel olarak, bir DBA bunu çalıştırmadan önce başka nelere dikkat etmelidir?
ypercubeᵀᴹ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.