--- title: "Cómo monitorizar MySQL y PostgreSQL con Percona PMM 3" description: "Instala Percona Monitoring and Management 3 con Docker, registra servidores MySQL y PostgreSQL con pmm-client y analiza consultas lentas con Query Analytics." category: "Operaciones de Base de Datos" language: es source: https://cubepath.com/es/docs/operaciones-de-base-de-datos/monitorizacion-de-rendimiento-de-bd-con-pmm updated: 2026-09-25 --- # Cómo monitorizar MySQL y PostgreSQL con Percona PMM 3 Percona Monitoring and Management (PMM) es una plataforma de monitorización de código abierto específica para bases de datos. Además de métricas del sistema, muestra el detalle interno de MySQL, PostgreSQL y MongoDB y, sobre todo, incluye Query Analytics (QAN), que agrupa las consultas y te dice cuáles consumen más tiempo. En esta guía desplegarás PMM Server 3 con Docker en Ubuntu 24.04, instalarás el cliente en los servidores de bases de datos y registrarás una instancia de MySQL y otra de PostgreSQL. ## Requisitos previos - Un servidor para PMM Server con Ubuntu 24.04 LTS, al menos 2 vCPU, 4 GB de RAM y 100 GB de disco, por ejemplo un VPS de CubePath. El disco necesario crece con el número de instancias y el periodo de retención. - Docker Engine instalado en ese servidor desde el repositorio oficial de Docker. - Uno o más servidores de bases de datos con Ubuntu 24.04 y MySQL 8.0 o PostgreSQL 16, con un usuario no root con privilegios `sudo`. - Conectividad desde los servidores de bases de datos al puerto 443 del servidor PMM. ## Arquitectura de PMM PMM tiene dos piezas: - **PMM Server**: un contenedor con la interfaz web (basada en Grafana), la base de datos de métricas y la de consultas. Se instala una vez. - **PMM Client**: el paquete `pmm-client`, que se instala en cada servidor de bases de datos. Incluye `pmm-agent`, que recoge métricas y consultas y las envía al servidor, y la herramienta `pmm-admin` para configurarlo. ## Paso 1: Desplegar PMM Server Crea un volumen para que los datos sobrevivan a las actualizaciones del contenedor: ```bash docker volume create pmm-data ``` Arranca PMM Server 3. En esta versión el contenedor escucha en el puerto 8443 internamente, así que se publica en el 443 del host: ```bash docker run -d \ --name pmm-server \ --restart always \ -p 443:8443 \ -v pmm-data:/srv \ percona/pmm-server:3 ``` El primer arranque tarda uno o dos minutos. Comprueba que el contenedor está sano: ```bash docker ps --filter name=pmm-server --format '{{.Names}}: {{.Status}}' ``` ```output pmm-server: Up 2 minutes (healthy) ``` > Importante: los puertos publicados por Docker no pasan por las reglas de UFW. Si no quieres exponer la interfaz de PMM a Internet, publica el puerto solo en una IP privada, por ejemplo `-p 10.0.0.5:443:8443`, o filtra el acceso con un firewall externo. ## Paso 2: Cambiar la contraseña de administrador El usuario inicial es `admin` con contraseña `admin`. Cámbiala antes de nada, sustituyendo `your_strong_password`: ```bash docker exec -t pmm-server change-admin-password your_strong_password ``` Abre `https://your_server_ip` en el navegador. PMM usa un certificado autofirmado, así que el navegador mostrará un aviso que puedes aceptar. Inicia sesión con `admin` y la nueva contraseña; verás el dashboard **Home** con el propio servidor PMM ya monitorizado. ## Paso 3: Crear un token para registrar clientes En PMM 3 los clientes se registran con el token de una cuenta de servicio, en lugar de con la contraseña de administrador. En la interfaz web ve a **Administration > Users and access > Service accounts**, crea una cuenta de servicio llamada `pmm-clients` con rol **Admin** y pulsa **Add service account token**. Copia el token generado; lo usarás como `your_service_token`. ## Paso 4: Instalar PMM Client en el servidor de bases de datos En cada servidor de bases de datos, instala el paquete que configura los repositorios de Percona: ```bash sudo apt update sudo apt install -y curl gnupg2 lsb-release curl -fsSLO https://repo.percona.com/apt/percona-release_latest.generic_all.deb sudo apt install -y ./percona-release_latest.generic_all.deb ``` Activa el repositorio de PMM 3 e instala el cliente: ```bash sudo percona-release enable pmm3-client sudo apt update sudo apt install -y pmm-client ``` Comprueba la versión: ```bash pmm-admin --version ``` La versión mayor del cliente debe ser 3, igual que la del servidor. ## Paso 5: Registrar el cliente en PMM Server Registra el nodo contra el servidor. `--server-insecure-tls` es necesario mientras PMM use el certificado autofirmado: ```bash sudo pmm-admin config \ --server-insecure-tls \ --server-url=https://service_token:your_service_token@your_server_ip:443 ``` ```output Checking local pmm-agent status... pmm-agent is running. Registering pmm-agent on PMM Server... Registered. Configuration file /usr/local/percona/pmm/config/pmm-agent.yaml updated. Reloading pmm-agent configuration... Configuration reloaded. ``` Verifica que el agente está conectado: ```bash sudo pmm-admin status ``` La salida debe mostrar `Connected : true` en la sección de PMM Server y el agente `node_exporter` en estado `Running`. A partir de aquí ya ves las métricas del sistema del nodo en el dashboard **Node Overview**. ## Paso 6: Monitorizar MySQL Crea en MySQL un usuario para PMM con los permisos que necesita para leer métricas y el Performance Schema. Entra en la consola: ```bash sudo mysql ``` Ejecuta estas sentencias, sustituyendo `your_pmm_password`: ```sql CREATE USER 'pmm'@'localhost' IDENTIFIED BY 'your_pmm_password' WITH MAX_USER_CONNECTIONS 10; GRANT SELECT, PROCESS, REPLICATION CLIENT, RELOAD, BACKUP_ADMIN ON *.* TO 'pmm'@'localhost'; EXIT; ``` Como fuente de consultas se usa el Performance Schema, que MySQL 8.0 tiene activado por defecto y no requiere escribir un slow log en disco. Compruébalo: ```bash sudo mysql -e "SHOW VARIABLES LIKE 'performance_schema';" ``` ```output +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | performance_schema | ON | +--------------------+-------+ ``` Añade la instancia a PMM: ```bash sudo pmm-admin add mysql \ --username=pmm \ --password=your_pmm_password \ --host=127.0.0.1 \ --port=3306 \ --query-source=perfschema \ --service-name=mysql-prod-01 ``` ```output MySQL Service added. Service ID : ... Service name: mysql-prod-01 ``` ## Paso 7: Monitorizar PostgreSQL Query Analytics para PostgreSQL necesita la extensión `pg_stat_statements`, que se carga al arrancar el servidor. Actívala y habilita también la medición de tiempos de E/S: ```bash sudo -u postgres psql -c "ALTER SYSTEM SET shared_preload_libraries = 'pg_stat_statements';" sudo -u postgres psql -c "ALTER SYSTEM SET track_io_timing = on;" sudo systemctl restart postgresql ``` > Nota: si `shared_preload_libraries` ya tenía otras bibliotecas, inclúyelas todas separadas por comas; `ALTER SYSTEM` sustituye el valor completo. Crea la extensión en la base de datos `postgres`, que es a la que se conecta PMM, y un usuario con el rol predefinido `pg_monitor`: ```bash sudo -u postgres psql -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements;" sudo -u postgres psql -c "CREATE USER pmm WITH PASSWORD 'your_pmm_password';" sudo -u postgres psql -c "GRANT pg_monitor TO pmm;" ``` Comprueba que el usuario puede conectarse por TCP, que es como lo hará PMM: ```bash psql "host=127.0.0.1 dbname=postgres user=pmm" -c "SELECT count(*) FROM pg_stat_statements;" ``` Añade la instancia a PMM: ```bash sudo pmm-admin add postgresql \ --username=pmm \ --password=your_pmm_password \ --host=127.0.0.1 \ --port=5432 \ --query-source=pgstatements \ --service-name=postgresql-prod-01 ``` Lista los servicios registrados en el nodo: ```bash sudo pmm-admin list ``` Cada servicio debe aparecer con sus agentes (`mysqld_exporter` o `postgres_exporter` y el agente de QAN correspondiente) en estado `Running`. ## Paso 8: Analizar consultas con Query Analytics Tras unos minutos de actividad, abre en la interfaz web el apartado **Query Analytics** en el menú lateral. Verás una tabla con las consultas normalizadas (con los valores sustituidos por `?`) ordenadas por la carga que generan. Para encontrar las consultas que más conviene optimizar: 1. Filtra por servicio, por ejemplo `mysql-prod-01`, en el panel de filtros. 2. Ordena por **Load** o **Query Time**. Una consulta que tarda poco pero se ejecuta miles de veces por segundo puede pesar más que una lenta y ocasional. 3. Pulsa una consulta para ver su detalle: ejemplos reales, tiempo medio y percentiles, filas examinadas frente a filas devueltas y, en la pestaña **Explain**, su plan de ejecución. Una consulta que examina muchas más filas de las que devuelve suele indicar un índice que falta. Crea el índice, espera unos minutos y compara la misma consulta en QAN. Los dashboards más útiles para empezar, accesibles desde el menú lateral, son **MySQL Instance Summary**, **PostgreSQL Instance Summary** y **Node Overview**. ## Paso 9: Actualizar PMM Server Como los datos están en el volumen `pmm-data`, actualizar consiste en descargar la nueva imagen y recrear el contenedor con los mismos parámetros: ```bash docker pull percona/pmm-server:3 docker stop pmm-server docker rm pmm-server docker run -d --name pmm-server --restart always -p 443:8443 -v pmm-data:/srv percona/pmm-server:3 ``` Actualiza también los clientes con `sudo apt update && sudo apt install --only-upgrade pmm-client`. ## Solución de problemas **`pmm-admin config` falla con errores de conexión.** Comprueba que el servidor responde desde el cliente: ```bash curl -k -o /dev/null -w "%{http_code}\n" https://your_server_ip/ ``` Si no devuelve un código HTTP, revisa firewalls entre ambos servidores. Si responde pero el registro falla con un error de autenticación, el token no es válido o la cuenta de servicio no tiene rol **Admin**. **Un servicio aparece como `Waiting` o sin datos.** Revisa los logs del agente en el servidor de bases de datos: ```bash sudo journalctl -u pmm-agent -n 50 --no-pager ``` Los errores habituales son una contraseña incorrecta del usuario `pmm` o falta de permisos en la base de datos. **Query Analytics de PostgreSQL está vacío.** Confirma que la extensión existe en la base de datos `postgres` y que la biblioteca está cargada: ```bash sudo -u postgres psql -c "SHOW shared_preload_libraries;" sudo -u postgres psql -c "\dx pg_stat_statements" ``` ## Conclusión Has desplegado PMM Server 3 con Docker, registrado un nodo con `pmm-client` mediante un token de cuenta de servicio y añadido instancias de MySQL y PostgreSQL con Query Analytics. Como siguientes pasos, sustituye el certificado autofirmado por uno válido, ajusta la retención de datos en **PMM Configuration > Settings** según el disco disponible y configura reglas de alerta con las plantillas incluidas en el apartado **Alerting**.