MySQL recuperar tablas corruptas

Seguramente alguna vez te has encontrado con tus tablas de MySQL ( MyISAM ) corruptas y vaya chasco!

Aquí os dejo unos pasos para intentar recuperarlas,

Entre comillas dobles y en cursiva os dejo los comando a ejecutar.

OJO, estas instrucciones solo funcionan con Bases de Datos y Tablas MyISAM

  1. en shell de MySQL: «check table nombre_tabla extended;» Comprobamos la tabla
  2. en shell de MySQL: «repair table nombre_tabla;» Reparamos la tabla con la utilidad de MySQL
  3. Si lo anterior no funciona, en shell del sistema: «myisamchk -r /var/lib/mysql/base-de-datos/laTabla.MYI» Repara un poquito mejor la tabla…o al menos lo intenta
  4. Si lo anterior no funciona, en shell del sistema: «myisamchk -r –safe-recover /var/lib/mysql/base-de-datos/laTabla.MYI» Repara la tabla un poquito mejor que la anterior opción
  5. Si lo anterior no funciona, la tabla está KO, puedes borrarla tranquilamente porque no la vas a recuperar en la vida y si acaso tirarnos de los pelos si no teníamos una copia de seguridad.

Aquí os dejo un ejemplito real ( con nombres ficticios ),

Paso 1
mysql> check table nombre_tabla extended;
+————————————————+——-+———-+————————————————————————————————————-+
| Table                                          | Op    | Msg_type | Msg_text                                                                                                    |
+————————————————+——-+———-+————————————————————————————————————-+
| basededatos.nombre_tabla | check | error

| Table upgrade required. Please do «REPAIR TABLE `nombre_tabla`» or dump/reload to fix it! |
+————————————————+——-+———-+————————————————————————————————————-+
1 row in set (0.00 sec)

Paso 2
mysql> repair table nombre_tabla;
+————————————————+——–+———-+——————————————————————————————————————-+
| Table                                          | Op     | Msg_type | Msg_text                                                                                                          |
+————————————————+——–+———-+——————————————————————————————————————-+
| basededatos.nombre_tabla | repair | Error    | Table ‘./basededatos/nombre_tabla’ is marked as crashed and last (automatic?) repair failed |
| basededatos.nombre_tabla | repair | Error    | Table ‘nombre_tabla’ is marked as crashed and last (automatic?) repair failed                   |
| basededatos.nombre_tabla | repair | status   | Table is already up to date                                                                                       |
+————————————————+——–+———-+——————————————————————————————————————-+
3 rows in set (0.01 sec)

Paso 3
[root@servidor sql]# myisamchk -r /var/lib/mysql/basededatos/nombretabla.MYI
– recovering (with sort) MyISAM-table ‘/var/lib/mysql/basededatos/nombre_tabla.MYI’
Data records: 2410985
– Fixing index 1
– Fixing index 2
– Fixing index 3
– Fixing index 4
– Fixing index 5
– Fixing index 6
– Fixing index 7
– Fixing index 8
[root@7por7 sql]#

Paso 4
En este caso no hizo falta con el Paso 3 la tabla se arregló 🙂

Vulnerabilidad en MySQL

MySQL

Se ha detectado una vulnerabilidad en MySQL que podría provocar una denegación de servicio en el servidor afectado. Un ataque remoto podría dejar sin un servicio o un recurso a un servidor específico o a toda una red, consumiendo todo el ancho de banda o sobrecargando los recursos del equipo.

La vulnerabilidad se basa en el manejo y tratamiento de distintos tipos de comandos alter database, por lo que un atacante que tenga permisos para realizar un alter podría, incluso, cambiar el nombre del directorio del sistema para utilizarlo como directorio de la bases de datos y dejar KO a todo el servidor.

Las versiones que se ven afectadas por esta vulnerabilidad son las anteriores a la 5.1.48, 5.5.5 y 6.0.14 por lo que es muy recomendable actualizar nuestra versión de MySQL para eliminar este grave problema de seguridad.

Recuperar contraseña de root en Mysql

MySQL
MySQL

Cuando por descuido, imprudencia o lo que sea, perdemos o cambiamos y luego no nos acordamos la contraseña de root para MySQL y acabamos tirándonos de los pelos o cosas peores os dejo esta pequeña guía de como recuperar esa preciada contraseña.

  1. Matar los procesos de MySQL que se estén ejecutando en la máquina. kill mysql mysql-safe
  2. Creamos un ficherito con el nombre, por ejemplo, de reseteapassmysql y le añadimos las siguientes líneas:
      1. UPDATE mysql.user SET Password=PASSWORD('nuevapass') WHERE User=’root’;
      2. flush privileges;
  3. Cambiamos de la primera línea de antes el nuevapass por la contraseña que queremos
  4. Ahora solo tenemos que reiniciar MySQL pero en modo seguro y añadiendo el ficherito que acabamos de crear, lo hacemos con esta sentencia: mysqld_safe –init-file=/rutalalficherito/reseteapassmysql &
  5. Una vez que la contraseña se ha cambiado podemos eliminar el ficherito, por si las moscas, y reiniciar MySQL del modo normal:
      1. rm /rutalalficherito/reseteapassmysql
      2. pkill mysql-safe
      3. /etc/init.d/mysql start

Existe otra forma que es la siguiente,

  1. Matar los procesos de MySQL que se estén ejecutando en la máquina. kill mysql mysql-safe
  2. Reiniciamos MySQL en modo seguro con las siguientes opciones,
      1. mysqld_safe –skip-grant-tables –skip-networking

        Con -skip-grant-tables no saltamos la comprobación de permisos y con -skip-networking no se permitirán conexiones que no sean desde localhost, vaya a ser que nos entre alguien mientras estamos haciendo estos cambios.

  3. Ahora iniciamos una sesión de MySQL
      1. mysql -u root mysql
  4. Modificamos la contraseña
      1. UPDATE mysql.user SET Password=PASSWORD('nuevapass') WHERE User=’root’;
      2. flush privileges;
  5. Si obtenemos algún error con el comando anterior simplemente hacemos,

      1. mysql> GRANT ALL PRIVILEGES ON *.* TO ‘root’@'localhost’ IDENTIFIED BY ‘newpA$$’;
      2. mysql> FLUSH PRIVILEGES;
        Y problema resuelto
  6. «Matamos» la sesión segura y reiniciamos normalmente,
      1. pkill mysql-safe
      2. /etc/init.d/mysql start

Espero que os sirva de algo

Matar los procesos de MySQL que se estén ejecutando en la máquina. kill mysql mysql-safe#mysqld_safe –skip-grant-tables –skip-networking

Amazon: MySQL, bases de datos relacionales

El gigante Amazon ha dado un nuevo paso ( de gigante? ) en su afán de ente innovador y anuncia el lanzamiento de Bases de Datos Relacionales – MySQL como un servicio más.

La idea es que Amazon hospedaría las bases de datos de los clientes, a las que se accedería a través de una API. Con este nuevo planteamiento ya ofrece tres modos de almacenamiento, S3 para ficheros, SimpleDB y ahora relacional/MySQL.

Con esta nueva idea de Amazon basada en el cloud computing con sus ventajas y desventajas amplía el tipo de proyectos que pueden encajar en multitud de sectores.

Amazon
Amazon

MySQL conversión de LATIN1 a UTF-8

Seguramente alguna vez nos hemos encontrado que a la hora de comprobar un isert de miles de registros en una tabla recién creada ésta está codificada con LATIN1 cuando nosostros necesitamos tenerla en UTF-8.

Intentaré dar unos pasos para realizar la conversión y que todo funcione de nuevo con UTF-8.

Haced siempre una copia de seguridad antes de nada, recordad la Ley de Murphy.

  1. Hacer un backup de la base de datos con la codificación en LATIN1 a un fichero:mysqldump -u <usuario_BD> -p <nombre_BD_latin1> –default-character-set=latin1 > <nombre_BD_latin1>.sql
    Donde: usuario_BD es el nombre de usuario de la base de datos, nombre_BD_latin1 es el nombre de la base de datos con la codificación en LATIN1; este comando te pedirá la clave del usuario de base de datos introducido.
  2. Crear una base de datos vacía con codificación de caracteres UTF8:

    mysql -u <usuario_BD> -p
    CREATE DATABASE <nombre_BD_utf8> CHARACTER SET utf8 COLLATE utf8_general_ci;
    quit

  3. Modificar los caracteres del backup de LATIN1 a UTF8:

    iconv -f ISO-8859-1 -t UTF-8 <nombre_BD_latin1>.sql > <nombre_BD_utf8>.sql

  4. Substituir en la creación de las tablas del fichero de backup las cadenas que hacen que las tablas se creen con la codificación mala:

    perl -pi -w -e ‘s/CHARSET=latin1/CHARSET=utf8/g;’ <nombre_BD_utf8>.sql

  5. Importar el fichero de backup en la nueva base de datos:

    mysql -u <usuario_BD> -p <nombre_BD_utf8> –default-character-set=utf8 < <nombre_BD_utf8>.sql

Y listo, a trabajar en UTF-8.

Hacer un backup de la base de datos con la codificación en LATIN1 a un fichero:

mysqldump -u <usuario_BD> -p <nombre_BD_latin1> --default-character-set=latin1 > <nombre_BD_latin1>.sql
Donde: usuario_BD es el nombre de usuario de la base de datos, nombre_BD_latin1 es el nombre de la base de datos con la codificación en LATIN1; este comando te pedirá la clave del usuario de base de datos introducido.