Es bastante fácil que una tabla MyISAM se bloquee.
En el encabezado de cada tabla MyISAM hay un contador que rastrea la cantidad de identificadores de archivos abiertos que hay en la tabla.
Si inicia mysql y el número en el encabezado no coincide con el número de identificadores de archivo reales, mysqld trata la tabla como bloqueada.
Si un simple lo REPAIR TABLE mdl_user
hace funcionar de nuevo cada vez sin pérdida de datos, esto puede indicar que tiene un sitio con mucho tráfico que escribe mdl_user
.
Si docenas de tablas requieren esto REPAIR TABLE
, convertiría todas las tablas a InnoDB. Sin embargo, si la mdl_user
tabla es la única tabla con este problema, hay algo que puede hacer (para este ejemplo, supongamos que la base de datos es moodle
);
Si desea que todas las tablas se dejen como MyISAM
PASO 01: Crear un script de tabla de reparación
echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql
PASO 02: Declare la secuencia de comandos de reparación como el archivo de inicio
Agregue esto a /etc/my.cnf
[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql
PASO 03: reinicie mysql
Cada reinicio de mysql activará el Script de tabla de reparación
Si desea que todas las tablas se conviertan en InnoDB
Ejecute este código para hacer una secuencia de comandos de conversión masiva de tablas MyISAM a InnoDB y verlo
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 vez que esté satisfecho con el contenido del script de conversión, ejecútelo
mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql
ACTUALIZACIÓN 2012-03-15 14:00 EDT
@Kevin , mientras usa MyISAM, ¿qué sucede si quedarse sin espacio en disco es su problema?
Aquí hay algo a considerar: De acuerdo con la Guía de estudio de certificación MySQL 5.0 ,
bulletpoint # 11 dice lo siguiente en las páginas 408,409 Sección 29.2:
Si se queda sin espacio en disco al agregar filas a una tabla MyISAM, no se produce ningún error. El servidor suspende la operación hasta que haya espacio disponible y luego completa la operación.
Cuando te quedes sin espacio en disco, no solo apagues o mates mysql. El recuento de los identificadores de archivos abiertos en cualquier MyISAM utilizado actualmente no se habrá borrado. Por lo tanto, la tabla MyISAM se marca bloqueada. Si puede liberar espacio en disco en el volumen de datos con mysqld aún ejecutándose, mysqld se activará una vez que el espacio en disco esté disponible.
También administro un sitio moodle en mysql, y la causa más común de corrupción de tablas para nosotros es quedarse sin espacio en disco.
fuente
Encontré una buena línea para convertir todas las tablas a InnoDB:
fuente