Cómo liberar espacio de la base de datos de VCSA 6.7

por | 22 septiembre, 2020

Cuando la base de datos de vCenter 6.7 se va llenando, en torno al 80% del almacenamiento, provoca que el servicio vmware-vpxd se caiga y por consecuente, no podamos administrar dicha máquina a través de los dos clientes web (vsphere-client y vsphere-ui).

Para comprobar si la base de datos está mal de espacio, basta con mirar la ocupación del filesystem «/storage/seat«.

Si esto pasa, únicamente, vamos a poder acceder por SSH, o a través de la Shell, siempre y cuando sepamos en que ESXi está localizado nuestro vCenter Server Appliance (VCSA).

En esta entrada vamos a ver cómo podemos liberar espacio de la base de datos, cómo parar y rearrancar el servicio vmware-vpxd y cómo automatizar la purga de eventos para solventar este problema.

Liberar espacio de manera manual

Para liberar espacio de manera manual, lo primero que tenemos que hacer es acceder a nuestro VCSA por SSH. Una vez logueados, debemos para el servicio «vmware-vpxd» en caso de que no se haya caído ya, para ello, ejecutamos este comando :

Command> service-control --stop vmware-vpxd

Ahora accedemos a la shell de VCSA, mediante:

Command> shell

En este punto, cómo vamos a acceder directamente a la base de datos, necesitamos saber la contraseña del usuario ‘postgres’ de SQL, para ello, basta con ejecutar el siguiente comando:

# grep -i PASSWORD /etc/vmware-vpx/embedded_db.cfg

El comando anterior nos devolverá una salida por pantalla dónde veremos la contraseña, la cual debemos copiar para introducirla en el siguiente paso, tras ejecutar este comando, en el se que nos pedirá dicha contraseña:

# /opt/vmware/vpostgres/current/bin/psql -d VCDB postgres

Tras introducir la contraseña, ahora tenemos que ejecutar la siguiente sentencia SQL, para saber que tabla de eventos están ocupando más espacio y por lo tanto, purgarlas:

VCDB=# SELECT nspname || '.' || relname AS "relation", pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN ('pg_catalog', 'information_schema') AND C.relkind <> 'i' AND nspname !~ '^pg_toast' ORDER BY pg_total_relation_size(C.oid) DESC LIMIT 20;

La consulta SQL anterior, nos devolverá una salida con las tablas de mayor ocupación, ordenadas de mayor a menor.

Para purgar estas tablas, basta con ir haciendo lo siguiente (con cuantas tablas sea necesario):

VCDB=# TRUNCATE TABLE vpx_event_arg_28 CASCADE;

Una vez purgadas todas las tablas necesarias, nos saldremos de postgres y volveremos a arrancar el servicio:

VCDB=# \q

Cómo podremos observar, el espacio de ocupación del filesystem «/storage/seat/» se ha reducido notoriamente.

# df -h | grep seat

Finalmente, saldremos de la Shell y arrancaremos el servicio de nuevo:

# exit
Command> service-control --start vmware-vpxd

Automatizar purga de eventos y liberación de espacio

Para automatizar este proceso, lo primero que tenemos que hacer es acceder a la VCSA, por SSH y entrar a la shell:

Command> shell

Una vez dentro de la shell, nos dirigimos al directorio /root/ (por defecto estamos ahí nada más entrar, pero por si las moscas):

cd /root

Ahora, vamos a crear un script que se llame «cleanup.sql» y le vamos a pegar el siguiente contenido:

DO
$$
DECLARE
    rec   record;
BEGIN
   FOR rec IN
      SELECT *
      FROM   pg_tables
      WHERE tablename ~ '^vpx_event_[0-9].*'
      ORDER  BY tablename
   LOOP
      EXECUTE 'TRUNCATE TABLE '
       || quote_ident(rec.schemaname) || '.'
       || quote_ident(rec.tablename) || ' CASCADE';
   END LOOP;
END$$;
 
DO
$$
DECLARE
    rec   record;
BEGIN
   FOR rec IN
      SELECT *
      FROM   pg_tables
      WHERE tablename ~ '^vpx_event_arg_[0-9].*'
      ORDER  BY tablename
   LOOP
      EXECUTE 'TRUNCATE TABLE '
        || quote_ident(rec.schemaname) || '.'
        || quote_ident(rec.tablename) || ' CASCADE';
   END LOOP;
END$$;

Guardamos el fichero y le establecemos los siguientes permisos:

# chown root:root /root/cleanup.sql
# chmod 700 /root/cleanup.sql

El último paso es crear una tarea programada, que se ejecute diariamente. Por lo tanto, nos dirigimos al directorio /etc/cron.daily y creamos un fichero de nombre «dbcleanup.sh» y le copiamos el siguiente contenido:

#!/bin/bash  
/opt/vmware/vpostgres/current/bin/psql -d VCDB postgres -f /root/cleanup.sql

Guardemos el fichero, establecemos los permisos apropiados y reiniciamos el servicio de crond:

# chown root:root /etc/cron.daily/dbcleanup.sh
# chmod 700 /etc/cron.daily/dbcleanup.sh
# systemctl restart crond

Con esta configuración automática es muy probable que no volváis a tener problemas de espacio en el filesystem /storage/seat y por consiguiente, el servicio vmware-vpxd, funcionará con normalidad.

Hasta la próxima Sysadmins! 🙂

About: Miguel Carretas Perulero

Miguel Carretas Perulero ha escrito 80 artículos en este blog.

Deja un comentario