Fui a trabajar por la tarde y me sorprendió escuchar que había un problema con mi sitio web dedecms. Cuando lo visité, encontré un error de pantalla completa. Verifiqué el registro de MySQL y el mensaje de error era:
Tabla '.. dedecmsv4dede_archives' está marcado como bloqueado y debe repararse.
Dice cms. La tabla de artículos dede_archives está marcada como problemática y necesita ser reparada. Así que restablecí rápidamente los datos históricos y me conecté a Internet para descubrir la causa. El problema eventualmente se resolverá. La solución es la siguiente:
busque la herramienta bin/myisamchk en el directorio de instalación de mysql e ingrese en la línea de comando:
myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
Luego, la herramienta myisamchk lo ayudará a restaurar el índice. de la tabla de datos. Reinicie mysql y el problema estará resuelto.
Análisis del problema:
1. La causa del error Algunos internautas dijeron que era un error de índice causado por consultas y actualizaciones frecuentes de la tabla dede_archives. Debido a que mi página no se generó estáticamente, sino una página dinámica, estoy bastante de acuerdo con esta afirmación. . También se dice que la base de datos MYSQL se ha dañado por algún motivo. Por ejemplo, un corte repentino de energía del servidor de la base de datos, alguna operación en el archivo original de la tabla al proporcionar servicios a la tabla de la base de datos puede causar que la base de datos MYSQL esté dañada. dañada. La tabla está corrupta y los datos no se pueden leer. En resumen, el reloj está dañado debido a algunos problemas insondables.
El número del problema es 145
2. Solución al problema.
Cuando intenta reparar un problema de tabla dañada, existen tres tipos de reparaciones. Si recibe un mensaje de error que indica que no se puede crear un archivo temporal, elimine el archivo indicado en el mensaje e inténtelo de nuevo; esto suele ser un vestigio de una operación de reparación anterior.
Las tres correcciones son las siguientes:
% myisamchk --recover --quick /ruta/a/tblName
% myisamchk --recover /ruta/a/tblName
% myisamchk --safe-recover /ruta/a/tblName
El primero es el más rápido y se utiliza para solucionar los problemas más comunes; el último es el más lento y se utiliza para solucionar problemas que no se pueden solucionar con otros métodos.
Verificar y reparar archivos de datos MySQL Si los métodos anteriores no pueden reparar una tabla dañada, antes de darse por vencido, también puede probar estos dos consejos:
Si sospecha que ha ocurrido un error irreparable en el archivo de índice (*.MYI) de la tabla, o incluso que el archivo se ha perdido, puede utilizar el archivo de datos (*.MYD) y el archivo de formato de datos (*.frm) para regenerarlo. Primero haga una copia del archivo de datos (tblName.MYD). Reinicie su servicio MySQL y conéctese a él. Utilice el siguiente comando para eliminar el contenido de la tabla:
mysql> ELIMINAR DE tblName;
Al eliminar el contenido de la tabla, se creará un nuevo archivo de índice. Cierre sesión y cierre el servicio nuevamente, luego sobrescriba el nuevo archivo de datos (vacío) con el archivo de datos que acaba de guardar (tblName.MYD). Finalmente, use myisamchk para realizar una reparación estándar (el segundo método anterior) para regenerar los datos del índice según el contenido de los datos de la tabla y el archivo de formato de la tabla.
Si falta el archivo de formato de su tabla (tblName.frm) o tiene un error irreparable, pero sabe cómo usar la instrucción CREATE TABLE correspondiente para regenerar la tabla, puede regenerar un nuevo archivo .frm y usarlo con sus archivos de datos. y archivos de índice (si hay un problema con el archivo de índice, utilice el método anterior para reconstruir uno nuevo). Primero haga una copia de los archivos de datos e índice y luego elimine los archivos originales (elimine todos los registros relacionados con esta tabla en el directorio de datos).
Inicie el servicio MySQL y cree una nueva tabla utilizando el archivo CREATE TABLE original. El nuevo archivo .frm debería funcionar bien, pero es mejor si realiza una reparación estándar (el segundo método anterior).
3. Introducción a la herramienta myisamchk (consulte el manual oficial de mysql).
Puede utilizar la utilidad myisamchk para obtener información sobre las tablas de la base de datos o para verificarlas, repararlas y optimizarlas. myisamchk se aplica a tablas MyISAM (tablas correspondientes a archivos .MYI y .MYD).
Método para llamar a myisamchk:
shell> myisamchk [opciones] tbl_name...
opciones especifica lo que desea que haga myisamchk. Se describen más adelante. También puede obtener una lista de opciones llamando a myisamchk --help.
tbl_name es la tabla de la base de datos que desea verificar o reparar. Si no ejecuta myisamchk en algún lugar del directorio de la base de datos, debe especificar la ruta al directorio de la base de datos porque myisamchk no sabe dónde está ubicada su base de datos. De hecho, a myisamchk no le importa si el archivo que está operando está ubicado en un directorio de base de datos; puede copiar el archivo correspondiente a la tabla de la base de datos en otro lugar y realizar la operación de restauración allí;
Si lo desea, puede utilizar la línea de comando myisamchk para nombrar varias tablas. También puede especificar una tabla nombrando el archivo de índice (con un sufijo ".MYI"). Le permite especificar todas las tablas en un directorio utilizando el esquema "*.MYI". Por ejemplo, si está en el directorio de la base de datos, puede verificar todas las tablas MyISAM en el directorio de esta manera:
shell> myisamchk *.MYI
Si no está en el directorio de la base de datos, puede verificar todas las tablas allí especificando la ruta al directorio:
shell> myisamchk /path/to/database_dir/*.MYI
Incluso puede verificar todas las tablas en todas las bases de datos especificando un comodín para la ruta al directorio de datos de MySQL:
shell> myisamchk /path/to/datadir/*/*.MYI
La forma recomendada de comprobar rápidamente todas las tablas MyISAM es:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
Si desea verificar todas las tablas MyISAM y reparar las tablas dañadas, puede usar el siguiente comando:
shell> myisamchk --silent --force --fast --update-state
-O key_buffer=64M -O sort_buffer=64M
-O búfer_lectura=1M -O búfer_escritura=1M
/ruta/al/datadir/*/*.MYI
Este comando supone que tienes más de 64 MB de memoria libre. Para obtener detalles sobre la asignación de memoria con myisamchk, consulte la Sección 5.9.5.5, “Uso de memoria de myisamchk”.
Cuando ejecuta myisamchk, debe asegurarse de que otros programas no estén usando la tabla. De lo contrario, cuando ejecute myisamchk, se mostrará el siguiente mensaje de error:
advertencia: los clientes están usando o no han cerrado la tabla correctamente
Esto indica que está intentando verificar una tabla que está siendo actualizada por otro programa (como el servidor mysqld) que no ha cerrado el archivo o ha finalizado sin cerrar el archivo correctamente.
Si mysqld se está ejecutando, debe forzar el vaciado de cualquier modificación de la tabla que aún esté en la memoria a través de FLUSH TABLES. Cuando ejecuta myisamchk, debe asegurarse de que otros programas no estén usando la tabla. La forma más sencilla de evitar el problema es utilizar CHECK TABLE en lugar de myisamchk para comprobar la tabla.