reparar - crear tabla innodb mysql
¿Cómo reparo una tabla InnoDB? (6)
Antes que nada, detenga el servidor e imagine el disco . No tiene sentido tener solo una oportunidad para esto. Entonces echa un vistazo aquí .
Nosotros (al parecer) habíamos ejecutado mal nuestro motor de base de datos MySQL Solaris anoche. Al menos algunas de las tablas de InnoDB están dañadas, con errores de fecha y hora fuera de orden en el registro de transacciones y un error específico sobre la corrupción del índice.
Conocemos las herramientas disponibles para las reparaciones de la tabla MyISAM, pero no encontramos nada para InnoDB.
Nota al margen: al intentar optimizar una tabla (en mi intento de reconstruir el índice dañado), el servidor de la base de datos se bloquea.
La siguiente solución fue inspirada por el consejo de Sandro arriba.
Advertencia : mientras funcionó para mí, pero no puedo decir si funcionará para ti.
Mi problema era el siguiente: leer algunas filas específicas de una tabla (llamemos a esta tabla broken
) haría colapsar MySQL. Incluso SELECT COUNT(*) FROM broken
lo mataría. Espero que tengas una PRIMARY KEY
en esta tabla (en la siguiente muestra, es id
).
- Asegúrese de tener una copia de seguridad o una instantánea del servidor MySQL roto (¡en caso de que quiera volver al paso 1 y probar otra cosa!)
-
CREATE TABLE broken_repair LIKE broken;
-
INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
- Repita el paso 3 hasta que bloquee el DB (puede usar
LIMIT 100000
y luego usar valores más bajos, hasta que elLIMIT 1
bloquee el DB). - Vea si tiene todo (puede comparar
SELECT MAX(id) FROM broken
con el número de filas enbroken_repair
). - En este punto, aparentemente tenía todas mis filas (excepto aquellas que probablemente fueron truncadas salvajemente por InnoDB). Si pierde algunas filas, puede intentar agregar un
OFFSET
alLIMIT
.
¡Buena suerte!
detenga su aplicación ... o detenga su esclavo para que no se agreguen nuevas filas
create table <new table> like <old table>;
insert <new table> select * from <old table>;
truncate table <old table>;
insert <old table> select * from <new table>;
reinicia tu servidor o esclavo
Aquí está la solución proporcionada por MySQL: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
Vea este artículo: http://www.unilogica.com/mysql-innodb-recovery/ (Está en portugués)
Se explica cómo usar innodb_force_recovery y innodb_file_per_table . Descubrí esto después de la necesidad de recuperar una base de datos bloqueada con un solo ibdata1 .
Usando innodb_file_per_table, todas las tablas en InnoDB crearán un archivo de tabla separado, como MyISAM.
Paso 1.
Detener el servidor MySQL
Paso 2.
agregue esta línea a my.cnf (En Windows se llama my.ini)
set-variable=innodb_force_recovery=6
Paso 3.
eliminar ib_logfile0 y ib_logfile1
Etapa 4.
Comience el servidor de MySQL
Paso 5
Ejecute este comando:
mysqlcheck --database db_name table_name -uroot -p
Después de haber solucionado satisfactoriamente la tabla innodb bloqueada, no se olvide de eliminar # set-variable = innodb_force_recovery = 6 de my.cnf y reinicie el servidor MySQL nuevamente.