Hoy me propuse hacer una limpieza de un sitio MediaWiki para recuperar el espacio en disco utilizado por archivos innecesarios u obsoletos. El problema es que, al eliminar un archivo (por ejemplo en la lista de archivos, accesible desde el menú "Páginas especiales > Lista de archivos"), éste no se elimina en absoluto. Sólo se restringe el acceso, quedando tanto referencias al archivo en la base de datos como el archivo mismo en disco. Esto se debe al mecanismo de control de cambios e historial propio de MediaWiki, que permite deshacer cualquier edición, incluso recuperar un archivo borrado. En este artículo voy a explicar cómo eliminar definitivamente un archivo subido a un sitio MediaWiki.



Partiendo del punto en que ya hemos eliminado todos los archivos no utilizados desde la lista de archivos, el primer paso consiste en cambiar al directorio de instalación del sitio:

# cd /var/www/wiki

Los archivos que conforman el sitio ocupan unos 1,4 GiB:

# du -hs .
1.4G    .

Luego de borrar los archivos desde el sitio Web, es posible comprobar que el tamaño ocupado no cambia, es decir no se elimina ningún archivo del disco.

Para borrar definitivamente los archivos eliminados se debe recurrir al script de mantenimiento deleteArchivedFiles.php:

# php-5.6 maintenance/deleteArchivedFiles.php
Use --delete to actually confirm this script

Ejecutar el script con el intérprete de PHP incluyendo la opción --delete:

# php-5.6 maintenance/deleteArchivedFiles.php --delete 
Searching for and deleting archived files...
Done! [21 file(s)]

El script elimina correctamente 21 archivos. Inmediatamente es posible comprobar que el tamaño en disco utilizado se ha reducido drásticamente (los archivos eliminados eran de gran tamaño, además MediaWiki guarda una copia por cada vez que se suben diferentes versiones del mismo archivo):

# du -hs .
793M    .

NOTA: Para el caso de servidores HTTP corriendo dentro de un entorno chroot, será necesario crear un enlace simbólico temporal para acceder correctamente a la base de datos (ya sea un archivo SQLite o un socket Unix).

En mi caso, el servidor Web corre "chrooteado" dentro de /var/www, por ende necesité crear un enlace simbólico para acceder correctamente a la base de datos SQLite por fuera del chroot:

# ln -s /var/www/var/databases/ /var/databases

Lo mismo ocurriría para acceder a un socket Unix (si el motor de bases de datos es MySQL u otro). Luego de correr el script se elimina el enlace simbólico:

# rm /var/databases

No es una solución súper elegante, pero es simple y rápida.


Tal vez pueda interesarte


Compartí este artículo