Uno de los grandes problemas de MySQL es que muchas veces los archivos engordan demasiado ocupando un espacio desmedido porque no se libera el espacio de forma adecuada por parte de MySQL mismo cuando se trata de tablas InnoDB

Dependiendo del uso que se le de a MySQL hay casos que una base de datos con un peso de 1GB termina ocupando en el disco 30GB o 40GB y esto es un problema fundamentalmente en servicios Cloud VPS de pocos recursos.

Vamos a ver como podemos reducir significativamente el uso del disco, lo primero que debemos hacer es un respaldo de todas las base de datos, el script una vez que corra ira eliminando las base de datos así que no me hago responsable del uso imprudente o de la falta de respaldo que tengas.

Antes de ejecutar lo siguiente asegúrate de tener un respaldo propio de las base de datos, solo luego de tenerlo prosigue con el resto del tutorial, igualmente si no estas seguro que estas haciendo es mejor que no lo hagas porque corres riesgos de perder datos.

¿Ya tienes tu respaldo? Bien, en un archivo, digamos llamado mysql_reduce.sh guarda el siguiente contenido

#!/bin/bash

OLDIFS=$IFS
IFS=$'\n'

for i in $(mysql -u root -Bse 'show databases' | egrep -v 'mysql|information_schema|performance_schema');
do
    echo $i
        mysqldump --opt -R -E --triggers "$i" --databases -c>> "$1";
        mysql -u root -Bse "drop database $i;" 
done

Esto no es un script de respaldo, esto BORRARA LA BASE DE DATOS LUEGO DEL DUMP, asi que mucho cuidado con no tener respaldo previo.

Una vez que guardamos los cambios le damos permisos de ejecución:

chmod +x mysql_reduce.sh

Ahora ejecutamos el script pasando le una ruta donde volcaremos este dump y a medida que lo vaya volcando ira eliminando la base de datos

./mysql_myreduce.sh /tmp/dump.sql

Una vez que el script termino, en nuestro servidor solo quedaran 3 tablas dadas de alta: mysql, information_schema y performance_schema, detenemos el servicio de mysql que puede llamarse mysql, mysqld o mariadb

service mariadb stop

Con el servicio detenido borramos los siguientes archivos:

find /var/lib/mysql/ -iname "ib_logfile*" -exec rm -f {} \;
find /var/lib/mysql/ -iname "ibdata*" -exec rm -f {} \;

Esto es opcional, podemos editar el archivo /etc/my.cnf

[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G

Solo hay que tener en cuenta que innodb_log_file_size debe ser el 25% de innodb_buffer_pool_size, podemos cambiar los valores siempre y cuando se respete la proporción entre cada uno de ellos, luego solo reiniciamos el servicio:

service mariadb start

Importamos nuevamente las base de datos:

mysql < /tmp/dump.sql

Como vemos es bastante simple aunque no se lo recomiendo para inexpertos, cualquier consulta que tengas puedes dejar la en la caja de comentarios

Leave a Reply

Your email address will not be published. Required fields are marked *

Discover more from Alvaro De León

Subscribe now to keep reading and get access to the full archive.

Continue reading