Bienvenidos sean a este post, hoy veremos como reparar las tablas.
En los posts anteriores mencionamos que una de las posibilidades que nos brinda utilizar backups es reparar tablas dañadas pero esto no es estrictamente asi, aunque tambien podemos intentar repararla dado que los motores tienen la posibilidad de hacerlo pero cada motor tiene su procedimiento.
InnoDB tiene un proceso de recuperacion que es lanzado cuando se inicia el servidor, si bien este proceso es automatico debe ser configurado por el DBA, MyIsam y Aria tambien poseen procesos automatico al inicio pero tambien soportan la recuperacion via REPAIR TABLE o cuando el servidor esta detenido se puede usar herramientas especificas de mariadb, por ultimo el resto de los motores tambien soportan REPAIR TABLE.
Hablemos sobre como trabaja la recuperacion en InnoDB, si bien este motor no necesita ser reparado podemos usar la opcion INTO OUTFILE para generar un archivo con los datos correctos sin importar que este dañada la tabla, si bien el motor generar un backup que se puede usar para restaurarlo despues pero en ciertos casos de corrupcion SELECT puede «crashear» a InnoDB, para estos casos debemos reparar las tablas o restaurar el backup mas reciente, veamos el primero caso.
Chequeando tablas
InnoDB soporta la instruccion CHECK TABLE, donde si una tabla esta corrupta devuelve un conjunto de resultados cuyo ultimo valor es de error para la columna Msg_Type y un valor Corrupt para la columna Msg_Text, en este caso la tabla dañada o indice son marcada como corrupta y no sera usada hasta que sea arreglada, esta instruccion cuando detecta ciertos tipos de corrupcion detiene al servidor para evitar que este inconveniente se propague mas.
Logs de transaccion
InnoDB posee dos logs para las transacciones:
- redo log, se usa para repetir transacciones
- undo log, cancelar transacciones no ejecutadas
Estas se utilizan para recuperarnos de algun inconveniente con las mismas, el log redo antes de comenzar la modificacion de las tablas graba todas los registros necesarios, ahora si nuestro servidor se daña antes de realizar las modificaciones aun podremos realizar las transacciones almacenadas en el log en el reinicio del equipo, este log se almacena fisicamente en archivos dedicados y gracias a un buffer permite a InnoDB a reducir de forma segura la escritura en estos archivos hasta que una transaccion sea finalizada, el undo log en esta almacenado en espacio de tablas del sistema y de manera opcional en otros espacios de tablas.
Forzando la recuperacion de datos
Si bien dijimos que si el servidor detecta una corrupcion de datos este no ejecutara automaticamente la recuperacion de datos, salvo que el valor de la variable @@innodb_force_recovery sea mayor a 0, esta variable no es dinamica por lo tanto debemos usar la opcion –innodb_force_recovery al inicio o la variable innodb_force_recovery en el archivo de configuraciones, solo valores mayores que 0 se deben usar para la recuperacion, despues de una recuperacion exitosa debemos volver a establecer con el valor de 0 a @@innodb_force_recovery y reiniciarlo.
El valor determina que acciones va a tomar InnoDB para ejecutar la recuperacion, cada valor incluye las acciones tomadas con los valores bajos, a su vez estos valores pueden tener algunos inconvenientes:
- 1 al 3, se consideran valores bajos y son los recomendados para usar
- 4, puede corromper los indices secundarios pero pueden arreglarse luego
- 5, puede causar resultados inconsistentes
- 6, puede causar que las paginas queden en estados obsoletos
Los valores que estan mas alla del 3 solo deben usarse en caso de que los anteriores hayan fallado, con valores mayores a 3 InnoDB rechaza instrucciones DML que intenten modificar los datos y en el caso del valor 6 rechaza a CREATE TABLE y DROP TABLE, veamos que hace cada valor de @@innodb_force_recovery mediante la siguiente tabla:
Valor | Descripcion |
0 | Ejecucion normal (sin recuperacion) |
1 | Intenta simplemente esquivar las paginas corruptas |
2 | No inicia al thread principal y purga todos los threads |
3 | Evita la vuelta atras de las transacciones |
4 | El buffer de cambio no unira paginas |
5 | Ignora el log de undo |
6 | Ignora el log de redo |
En resumen, hoy hemos visto como reparar tablas de InnoDB, como es, las herramientas que disponemos, como chequear una tabla, como forzar la autorepacion y una descripcion de que hace cada opcion, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
