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
Administrador de Sistemas, Programador, Docente y ahora resulta que también Blogger (peor es ser tictoker). Más de 20 años de experiencia en computación atendiendo nabos y resolviendo problemas, los cuales si no fuera por estos nabos, no habrían ocurrido en primer lugar. Escribo más que nada sobre tecnología y herramientas en general, además de algunos artículos con opiniones tan subjetivas como irrelevantes, así que si no te gustan, mejor madura y superalo.