È piuttosto facile che una tabella MyISAM si blocchi.
Nell'intestazione di ogni tabella MyISAM è presente un contatore che tiene traccia di quanti handle di file aperti sono presenti sulla tabella.
Se avvii mysql e il numero nell'intestazione non corrisponde al numero di handle di file effettivi, mysqld considera la tabella come bloccata.
Se un semplice lo REPAIR TABLE mdl_user
fa funzionare di nuovo ogni volta senza perdita di dati, ciò può indicare che hai un sito molto trafficato su cui scrive mdl_user
.
Se dozzine di tabelle lo richiedono REPAIR TABLE
, convertirò tutte le tabelle in InnoDB. Tuttavia, se la mdl_user
tabella è l'unica tabella con questo problema, c'è qualcosa che puoi fare (per questo esempio, supponiamo che sia il database moodle
);
Se vuoi che tutte le tabelle vengano lasciate come MyISAM
PASSAGGIO 01: Creare uno script di tabella di riparazione
echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql
PASSAGGIO 02: Dichiarare lo script di riparazione come file di avvio
Aggiungi questo a /etc/my.cnf
[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql
PASSAGGIO 03: riavviare mysql
Ogni riavvio di mysql attiverà lo Script tabella riparazioni
Se vuoi che tutte le tabelle diventino InnoDB
Esegui questo codice per creare uno script di conversione in blocco delle tabelle MyISAM in InnoDB e visualizzalo
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
Una volta che sei soddisfatto del contenuto dello script di conversione, eseguilo
mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql
AGGIORNAMENTO 2012-03-15 14:00 EDT
@Kevin , Durante l'utilizzo di MyISAM, cosa succede se rimanere senza spazio su disco è il tuo problema?
Ecco qualcosa da considerare: secondo la guida allo studio di certificazione MySQL 5.0 ,
bulletpoint # 11 dice quanto segue alle pagine 408.409 Sezione 29.2:
Se si esaurisce lo spazio su disco durante l'aggiunta di righe a una tabella MyISAM, non si verifica alcun errore. Il server sospende l'operazione fino a quando non diventa disponibile spazio, quindi completa l'operazione.
Quando esaurisci lo spazio su disco, non arrestare o eliminare mysql. Il conteggio degli handle di file aperti in qualsiasi MyISAM attualmente utilizzato non sarà cancellato. Pertanto, la tabella MyISAM è contrassegnata come bloccata. Se riesci a liberare spazio su disco nel volume di dati con mysqld ancora in esecuzione, mysqld si salverà una volta reso disponibile lo spazio su disco.