Estoy tratando de recuperar una tabla InnoDB semi corrupta. Noté el problema al intentar agregar un nuevo índice a la tabla.
ALTER TABLE `<table>` ADD INDEX `<name>` ERROR 1712 (HY000): Index "TEST008"--temporary-- is corrupted La check table <table> EXTENDED no detecta el problema.
+---------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------+-------+----------+----------+ | <table> | check | status | OK | +---------------+-------+----------+----------+ He intentado eliminar el índice corrupto usando la tabla ALTER TABLE DROP INDEX "TEST008"--temporary--\ pero termina con
ERROR 1091 (42000): Can't DROP '"TEST008"--temporary--'; check that column/key exists ¿Estoy obligado a recrear la tabla usando, por ejemplo, OPTIMIZE ?
Estoy de acuerdo con @ nbk , si no puede deshacerse de un índice dañado, deberá reconstruir la tabla. ¿Haces copias de seguridad ocasionales? En el ejemplo, literalmente detengo el servicio de la base de datos y copio todo el directorio de la base de datos, incluido el binario MariaDB y todo. La redundancia parece una exageración hasta que la necesitas.
La forma más básica de lograr la reconstrucción de la tabla es usando lo siguiente:
INSERT INTO `table_new` SELECT * FROM `table_old`;Hay algunos hilos flotando en la web sobre cómo hacerlo más rápido, aunque este lo pude probar sin errores en MariaDB. Simplemente cambie el nombre de la tabla anterior en caso de que encuentre un mejor enfoque después de reconstruir la tabla. Recientemente actualicé algunas tablas de bases de datos que creé hace una década después de que alguien me dio un mal consejo sobre las convenciones de nomenclatura y ahora puedo expandir en gran medida la funcionalidad de ese software si es necesario.
¡Buena suerte!
Debe verificar el estado de los índices que no se mostrarán en CHECK TABLE .
Para hacer eso, intente lo siguiente
SHOW VARIABLES LIKE 'userstat'; SET GLOBAL USERSTAT = ON; -- just to get all columns used from the stats table -- SHOW COLUMNS FROM `INFORMATION_SCHEMA`.`INDEX_STATISTICS` -- get all indices just in case SELECT * FROM `INFORMATION_SCHEMA`.`INDEX_STATISTICS`; -- get all indices for the table SELECT * FROM `INFORMATION_SCHEMA`.`INDEX_STATISTICS` WHERE `TABLE_NAME` = 'yourTable';Eso aclarará lo que está indexado y lo que no está en sus tablas.
Otra cosa es que cuando agrega/elimina índices, es mejor usar marcas como \ TEST008`` en lugar de "TEST008" . Si esto tampoco funciona... clone/copie el contenido de la tabla, suéltelo y vuelva a crearlo.
CREATE TEMPORARY TABLE `backupTable` SELECT * FROM `yourTable`;Para obtener información adicional, lea Crear tabla temporal
Asegúrese de que esto suceda, ya que esta tabla de memoria podría fallar debido al tamaño del índice. Si eso sucede, debe aumentar o cambiar el algoritmo de indexación HASH en uso.
Si todo funciona como se esperaba, AGREGAR las líneas de la tabla temporal en la siguiente declaración
Nota : asegúrese de agregar todos los campos que faltan
DROP TABLE IF EXISTS `yourTable`; CREATE TABLE `yourTable`( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, -- other columns PRIMARY KEY(`id`) ) Engine=InnoDB; -- or extend this with collation, and other instructions INSERT INTO `yourTable` SELECT * FROM `backup`;Esto debería funcionar.
La solución del último caso es eliminar del sistema de archivos la tabla InnoDB, pero dudo que este sea el caso.