Awaria tabeli MyISAM jest raczej łatwa.
W nagłówku każdej tabeli MyISAM znajduje się licznik, który śledzi liczbę otwartych uchwytów plików względem tabeli.
Jeśli uruchomisz mysql, a liczba w nagłówku nie odpowiada liczbie rzeczywistych uchwytów plików, mysqld traktuje tabelę jako zawieszoną.
Jeśli prosty REPAIR TABLE mdl_user
sprawia, że działa on ponownie za każdym razem bez utraty danych, może to oznaczać, że masz witrynę o bardzo dużym natężeniu ruchu, która pisze mdl_user
.
Jeśli wymagają tego dziesiątki tabel REPAIR TABLE
, przekonwertowałbym wszystkie tabele na InnoDB. Jeśli jednak mdl_user
tabela jest jedyną tabelą z tym problemem, można coś zrobić (w tym przykładzie powiedzmy, że baza danych jest moodle
);
Jeśli chcesz, aby wszystkie tabele pozostały jako MyISAM
KROK 01: Utwórz skrypt tabeli naprawy
echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql
KROK 02: Zadeklaruj skrypt naprawczy jako plik startowy
Dodaj to do /etc/my.cnf
[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql
KROK 03: Uruchom ponownie mysql
Każde ponowne uruchomienie mysql spowoduje uruchomienie skryptu naprawy tabeli
Jeśli chcesz, aby wszystkie tabele stały się InnoDB
Uruchom ten kod, aby utworzyć skrypt konwersji zbiorczej tabel MyISAM do InnoDB, i wyświetl go
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
Gdy będziesz zadowolony z zawartości skryptu konwersji, uruchom go
mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql
AKTUALIZACJA 2012-03-15 14:00 EDT
@Kevin , Co zrobić, jeśli korzystasz z MyISAM?
Oto kilka rzeczy do rozważenia: Zgodnie z MySQL 5.0 Certification Study Guide ,
punkt 11 mówi: na stronach 408, 409, sekcja 29.2:
Jeśli zabraknie miejsca na dysku podczas dodawania wierszy do tabeli MyISAM, nie wystąpi błąd. Serwer zawiesza operację, dopóki przestrzeń nie będzie dostępna, a następnie kończy operację.
Kiedy zabraknie miejsca na dysku, nie wyłączaj ani nie zabijaj mysql. Liczba uchwytów otwartych plików w aktualnie używanym MyISAM nie zostanie wyczyszczona. Tak więc tabela MyISAM jest oznaczona jako rozbita. Jeśli możesz zwolnić miejsce na dysku w woluminie danych, gdy mysqld nadal działa, mysqld wykona połączenie po udostępnieniu miejsca na dysku.
Zarządzam także witryną moodle na mysql, a najczęstszą przyczyną uszkodzenia tabeli jest brak miejsca na dysku.
źródło
Znalazłem jedną dobrą linię do konwersji wszystkich tabel na InnoDB:
źródło