jueves, 13 de octubre de 2011

MySQL 5.1: Reparar tablas MyISAM con mysqlcheck


Bacula se nego a funcionar, la db es MySQL 5.1, el log de bacula es:

12-Oct 19:47 bacula-dir JobId 12396: Fatal error: sql_create.c:870 Lock Filename table Query failed: LOCK TABLES Filename write, batch write, Filename as f write: ERR=Table './bacula/Filename' is marked as crashed and last (automatic?) repair failed
 

Bueno, tenemos que reparar nuestras tablas, mysql nos proporciona varios comandos, entre ellos podemos tratar de compactar la bd completo o bien usar el comando: mysqlcheck para ver el estatus de las tablas y si necesitaramos reparar alguna tipo MYISAM esta el comando myisamchk.

NOTA: Recomendacion de MySQL, si van a reparar tablas es
altamente recomendable que el servicio este apagado por seguridad, de lo contrario atenganse a las consecuencias si algo sale mal, ya que si un usuario esta tratando de ingresar datos, aunque la tabla ya no se lo permita pero puede estar abierto el aputador a el archivo y luego el comando myisamchk tambien trata de hacer modificaciones, nomas imaginense que puede pasar?.


mysqlcheck

 
Si lo ejecutan solo, les va a dar todo su arsenal de parametros que soporta.

Bacula tiene varias tablas, todas son usando el engine: myisam.

Ahora vamos empezar por revisar la bd y que nos diga que tablas necesitan reparacion:

/var/lib/mysql/bacula/
 
 -rw-rw---- 1 mysql mysql       8710 Jun 27 00:28 BaseFiles.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:28 BaseFiles.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:28 BaseFiles.MYI
-rw-rw---- 1 mysql mysql       8604 Jun 27 00:28 CDImages.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:28 CDImages.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:28 CDImages.MYI
-rw-rw---- 1 mysql mysql       8764 Jun 27 00:28 Client.frm
-rw-rw---- 1 mysql mysql       1904 Jun 27 00:28 Client.MYD
-rw-rw---- 1 mysql mysql       3072 Jun 27 00:28 Client.MYI
-rw-rw---- 1 mysql mysql       8732 Jun 27 00:28 Counters.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:28 Counters.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:28 Counters.MYI
-rwxr-xr-x 1 mysql mysql         65 Nov 26  2010 db.opt
-rw-rw---- 1 mysql mysql       9290 Jun 27 00:28 Device.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:28 Device.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:28 Device.MYI
-rw-rw---- 1 mysql mysql       8806 Jun 27 00:28 File.frm
-rw-rw---- 1 mysql mysql 1756959048 Oct 12 22:34 File.MYD
-rw-rw---- 1 mysql mysql  777433088 Oct 12 22:34 File.MYI
-rw-rw---- 1 mysql mysql       8602 Jun 27 00:34 Filename.frm
-rw-rw---- 1 mysql mysql   69038080 Oct 12 18:15 Filename.MYD
-rw-rw---- 1 mysql mysql   75943936 Oct 12 19:10 Filename.MYI
-rw-rw---- 1 mysql mysql       8676 Jun 27 00:34 FileSet.frm
-rw-rw---- 1 mysql mysql       5104 Sep 14 19:20 FileSet.MYD
-rw-rw---- 1 mysql mysql       2048 Sep 26 06:28 FileSet.MYI
-rw-rw---- 1 mysql mysql       9618 Jun 27 00:34 Job.frm
-rw-rw---- 1 mysql mysql       9618 Jun 27 00:34 JobHisto.frm
-rw-rw---- 1 mysql mysql     167324 Jun 27 00:34 JobHisto.MYD
-rw-rw---- 1 mysql mysql      20480 Jun 27 00:34 JobHisto.MYI
-rw-rw---- 1 mysql mysql       8916 Jun 27 00:34 JobMedia.frm
-rw-rw---- 1 mysql mysql     423325 Oct 12 22:34 JobMedia.MYD
-rw-rw---- 1 mysql mysql     304128 Oct 12 22:34 JobMedia.MYI
-rw-rw---- 1 mysql mysql     334004 Oct 12 22:34 Job.MYD
-rw-rw---- 1 mysql mysql      39936 Oct 12 22:34 Job.MYI
-rw-rw---- 1 mysql mysql       8676 Jun 27 00:34 Location.frm
-rw-rw---- 1 mysql mysql       8881 Jun 27 00:34 LocationLog.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:34 LocationLog.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 LocationLog.MYI
-rw-rw---- 1 mysql mysql          0 Jun 27 00:34 Location.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 Location.MYI
-rw-rw---- 1 mysql mysql       8660 Jun 27 00:34 Log.frm
-rw-rw---- 1 mysql mysql    5677120 Oct 12 22:34 Log.MYD
-rw-rw---- 1 mysql mysql     732160 Oct 12 22:34 Log.MYI
-rw-rw---- 1 mysql mysql      10453 Jun 27 00:34 Media.frm
-rw-rw---- 1 mysql mysql      11108 Oct 12 22:34 Media.MYD
-rw-rw---- 1 mysql mysql       4096 Oct 12 22:34 Media.MYI
-rw-rw---- 1 mysql mysql       8652 Jun 27 00:34 MediaType.frm
-rw-rw---- 1 mysql mysql        100 Jun 27 00:34 MediaType.MYD
-rw-rw---- 1 mysql mysql       2048 Jun 27 00:34 MediaType.MYI
-rw-r--r-- 1 root  root        6372 Jun 27 00:19 out.txt
-rw-rw---- 1 mysql mysql       8594 Jun 27 00:34 Path.frm
-rw-rw---- 1 mysql mysql       8600 Jun 27 00:34 PathHierarchy.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:34 PathHierarchy.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 PathHierarchy.MYI
-rw-rw---- 1 mysql mysql   16394220 Oct 12 19:17 Path.MYD
-rw-rw---- 1 mysql mysql   25443328 Oct 12 19:17 Path.MYI
-rw-rw---- 1 mysql mysql       8658 Jun 27 00:34 PathVisibility.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:34 PathVisibility.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 PathVisibility.MYI
-rw-rw---- 1 mysql mysql       9699 Jun 27 00:34 Pool.frm
-rw-rw---- 1 mysql mysql        240 Oct  9 23:17 Pool.MYD
-rw-rw---- 1 mysql mysql       3072 Oct 12 18:15 Pool.MYI
-rw-rw---- 1 mysql mysql       8656 Jun 27 00:34 Status.frm
-rw-rw---- 1 mysql mysql        640 Jun 27 00:34 Status.MYD
-rw-rw---- 1 mysql mysql       2048 Jun 27 00:34 Status.MYI
-rw-rw---- 1 mysql mysql       8644 Jun 27 00:34 Storage.frm
-rw-rw---- 1 mysql mysql        120 Jun 27 00:34 Storage.MYD
-rw-rw---- 1 mysql mysql       2048 Jun 27 00:34 Storage.MYI
-rw-rw---- 1 mysql mysql       8678 Jun 27 00:34 UnsavedFiles.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:34 UnsavedFiles.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 UnsavedFiles.MYI
-rw-rw---- 1 mysql mysql       8570 Jun 27 00:34 Version.frm
-rw-rw---- 1 mysql mysql          7 Jun 27 00:34 Version.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 Version.MYI
 
O bien si analizamos toda la bd debemos darle el usuario/password del root, el nombre de la bd y el sabe donde buscarlo, vamos empezando por esta opcion:
 
bacula]# time mysqlcheck -a  -B bacula -p
Enter password:
bacula.BaseFiles                                   Table is already up to date
bacula.CDImages                                    Table is already up to date
bacula.Client                                      Table is already up to date
bacula.Counters                                    Table is already up to date
bacula.Device                                      Table is already up to date
bacula.File                                        Table is already up to date
bacula.FileSet                                     Table is already up to date
bacula.Filename
Error    : Table './bacula/Filename' is marked as crashed and last (automatic?) repair failed
Error    : Table 'Filename' is marked as crashed and last (automatic?) repair failed
error    : Corrupt
bacula.Job                                         Table is already up to date
bacula.JobHisto                                    Table is already up to date
bacula.JobMedia                                    Table is already up to date
bacula.Location                                    Table is already up to date
bacula.LocationLog                                 Table is already up to date
bacula.Log                                         Table is already up to date
bacula.Media                                       Table is already up to date
bacula.MediaType                                   Table is already up to date
bacula.Path                                        Table is already up to date
bacula.PathHierarchy                               Table is already up to date
bacula.PathVisibility                              Table is already up to date
bacula.Pool                                        Table is already up to date
bacula.Status                                      Table is already up to date
bacula.Storage                                     Table is already up to date
bacula.UnsavedFiles                                Table is already up to date
bacula.Version                                     Table is already up to date
real    0m2.297s
user    0m0.000s
sys     0m0.000s
 
Con el parametro -a le pedimos que revise rapidamente los estatus de cada tabla de la bd, es rapido y nos dice la condicion de la tabla. Me gusta ver el tiempo que tardan las tareas en ejecutarse, nos indica la condicion de nuestro equipo en lo personal cuando se trata de bd siempre deseo saber este dato.

Ahora vamos solictando mas detalle, que no revise el estatus si no que abra cada tabla y le realice una revision normal.

 
time mysqlcheck  --check -B bacula -p
Enter password:******
bacula.BaseFiles                                   OK
bacula.CDImages                                    OK
bacula.Client                                      OK
bacula.Counters                                    OK
bacula.Device                                      OK
bacula.File                                        OK
bacula.FileSet                                     OK
bacula.Filename
warning  : Table is marked as crashed and last repair failed
warning  : 1 client is using or hasn't closed the table properly
warning  : Size of indexfile is: 75943936      Should be: 14383104
error    : Size of datafile is: 69038080         Should be: 69038956
error    : Corruptbacula.Job                                         OK
bacula.JobHisto                                    OK
bacula.JobMedia                                    OK
bacula.Location                                    OK
bacula.LocationLog                                 OK
bacula.Log                                         OK
bacula.Media                                       OK
bacula.MediaType                                   OK
bacula.Path                                        OK
bacula.PathHierarchy                               OK
bacula.PathVisibility                              OK
bacula.Pool                                        OK
bacula.Status                                      OK
bacula.Storage                                     OK
bacula.UnsavedFiles                                OK
bacula.Version                                     OK
 
real    1m19.222s
user    0m0.000s
sys     0m0.000s
 
Ahi esta la tabla que esta danada de nuevo.

Pero que tal si ejecutamos la misma consulta pero agregamos el parametro -e que significa, revisa las tablas 100% sin importar el tiempo que tardes ("extendida").


 
time mysqlcheck  --check -e  -B bacula -p
Enter password:
bacula.BaseFiles                                   OK
bacula.CDImages                                    OK
bacula.Client                                      OK
bacula.Counters                                    OK
bacula.Device                                      OK
bacula.File                                        OK
bacula.FileSet                                     OK
bacula.Filename
warning  : Table is marked as crashed and last repair failed
warning  : 1 client is using or hasn't closed the table properly
warning  : Size of indexfile is: 75943936      Should be: 14383104
error    : Size of datafile is: 69038080         Should be: 69038956
error    : Corrupt
bacula.Job                                         OK
bacula.JobHisto                                    OK
bacula.JobMedia                                    OK
bacula.Location                                    OK
bacula.LocationLog                                 OK
bacula.Log                                         OK
bacula.Media                                       OK
bacula.MediaType                                   OK
bacula.Path                                        OK
bacula.PathHierarchy                               OK
bacula.PathVisibility                              OK
bacula.Pool                                        OK
bacula.Status                                      OK
bacula.Storage                                     OK
bacula.UnsavedFiles                                OK
bacula.Version                                     OK
real    2m8.610s
user    0m0.000s
sys     0m0.008s
 
Si ven el tiempo de ejecucion fue un poco mas.
MyIsamChk 

Ya sabemos que tabla esta danada, ahora vamos a tratar de repararla, los archivos que este comando nos pide son los que tienen extension "MYI". asi que vamos a ejecutar el comando de la siguiente manera.

Si saben donde esta el archivo deben darle la ruta de el o bien se meten a el folder donde estan los archivos, en mi caso es:


/var/lib/mysql/bacula

Pero antes de vamos a apagar el servicio en lo que reparamos la tabla, claro esto lo hago ya despues de horas de trabajo, cuando se que a nadie le afecta si el servicio no esta operando.

 
service mysql stop

 
Ahora si, segun el comando tenemos 2 parametros a usar para la reparacion:

-r == repara de manera rapida, la mayor parte del tiempo funciona.
-o == repara al modo antiguo, este siempre funciona, es mas lento pero efectivo.

Yo hago uso del metodo antiguo por ello uso el parametro -o, tengo tiempo, nadie me esta esperando por el servicio asi que lo ejecuto:
 

time myisamchk -o Filename.MYI
- recovering (with keycache) MyISAM-table 'Filename.MYI'
Data records: 1409502
Found block that points outside data file at 69038076
Data records: 1409472

real    0m27.491s
user    0m19.417s
sys     0m0.384s
 

Bien parece que todo esta reparado, ahora si a levantar el servicio de nuevo.
 

service mysql start
 

De nuevo regresamos a el comando mysqlchk para revisar nuestra base de datos:
 

time mysqlcheck --check -e  -B bacula -p
Enter password:
bacula.BaseFiles                                   OK
bacula.CDImages                                    OK
bacula.Client                                      OK
bacula.Counters                                    OK
bacula.Device                                      OK
bacula.File                                        OK
bacula.FileSet                                     OK
bacula.Filename                                    OK
bacula.Job                                         OK
bacula.JobHisto                                    OK
bacula.JobMedia                                    OK
bacula.Location                                    OK
bacula.LocationLog                                 OK
bacula.Log                                         OK
bacula.Media                                       OK
bacula.MediaType                                   OK
bacula.Path                                        OK
bacula.PathHierarchy                               OK
bacula.PathVisibility                              OK
bacula.Pool                                        OK
bacula.Status                                      OK
bacula.Storage                                     OK
bacula.UnsavedFiles                                OK
bacula.Version                                     OK

real    4m56.098s
user    0m0.000s
sys     0m0.000s
 

Listo, asi es como debemos tener nuestras tablas, ahora si a seguir trabajando, saludos!!!

5 comentarios:

Germán dijo...

Buenísimo. Funcionó perfecto! Gracias!

Pedro Moreno dijo...

De naa German, que bueno que te sirvio, saludos!!!

Aleksander Silva dijo...

Perfecto amigo, mil gracias. Tu tutorial acaba de salvarme la vida!!

Pedro Moreno dijo...

Ya esta, saludos!!!

Anónimo dijo...

Perfecto procedimiento.
Muchas Gracias.