Referencia DBA PostgreSQL
Guía de consulta rápida para la materia Gestión de Seguridad y Desempeño de Bases de Datos.
Motor: PostgreSQL 16 Enfoque: administración, seguridad, control de acceso, diagnóstico, rendimiento, mantenimiento y continuidad.
1. Propósito de esta referencia
Section titled “1. Propósito de esta referencia”Este documento reúne instrucciones y comandos básicos que un administrador de bases de datos puede utilizar para:
- Administrar PostgreSQL
- Consultar información del servidor
- Crear y administrar bases de datos
- Administrar usuarios y roles
- Aplicar mínimo privilegio
- Revisar permisos
- Analizar sesiones y bloqueos
- Analizar consultas
- Administrar índices
- Realizar mantenimiento
- Realizar respaldos y restauraciones
- Revisar configuraciones de seguridad
- Diagnosticar problemas básicos de desempeño
La lista no pretende sustituir la documentación oficial de PostgreSQL. Su objetivo es servir como guía de consulta para las prácticas de la materia.
2. Acceder a PostgreSQL
Section titled “2. Acceder a PostgreSQL”2.1 Conectarse con psql
Section titled “2.1 Conectarse con psql”psql -U postgresConectarse a una base de datos específica:
psql -U postgres -d mi_baseIndicar servidor y puerto:
psql -h localhost -p 5432 -U postgres -d mi_baseSolicitar contraseña:
psql -h localhost -p 5432 -U usuario -d mi_base -W¿Para qué sirve?
Section titled “¿Para qué sirve?”Permite establecer una sesión con PostgreSQL utilizando el cliente de línea de comandos psql.
3. Comandos básicos de psql
Section titled “3. Comandos básicos de psql”Los comandos que comienzan con \ son instrucciones propias de psql, no SQL estándar.
3.1 Listar bases de datos
Section titled “3.1 Listar bases de datos”\lo:
\list3.2 Conectarse a otra base
Section titled “3.2 Conectarse a otra base”\c nombre_base3.3 Mostrar usuario actual
Section titled “3.3 Mostrar usuario actual”SELECT current_user;3.4 Mostrar base de datos actual
Section titled “3.4 Mostrar base de datos actual”SELECT current_database();3.5 Mostrar servidor
Section titled “3.5 Mostrar servidor”SELECT version();3.6 Listar esquemas
Section titled “3.6 Listar esquemas”\dn3.7 Listar tablas
Section titled “3.7 Listar tablas”\dt3.8 Describir una tabla
Section titled “3.8 Describir una tabla”\d usuariosMás información:
\d+ usuarios3.9 Listar roles
Section titled “3.9 Listar roles”\du3.10 Ver ayuda
Section titled “3.10 Ver ayuda”\?Ayuda sobre SQL:
\hAyuda específica:
\h CREATE ROLE3.11 Salir
Section titled “3.11 Salir”\q4. Bases de datos
Section titled “4. Bases de datos”Crear una base
Section titled “Crear una base”CREATE DATABASE sistema;Crear una base indicando propietario
Section titled “Crear una base indicando propietario”CREATE DATABASE sistemaOWNER administrador;Eliminar una base
Section titled “Eliminar una base”DROP DATABASE sistema;Precaución: Esta operación elimina la base de datos. No debe ejecutarse en una base productiva sin verificar previamente sus consecuencias.
Una base no puede eliminarse mientras existen conexiones activas hacia ella.
5. Esquemas
Section titled “5. Esquemas”Crear esquema
Section titled “Crear esquema”CREATE SCHEMA ventas;Crear esquema con propietario
Section titled “Crear esquema con propietario”CREATE SCHEMA ventasAUTHORIZATION administrador;Listar esquemas
Section titled “Listar esquemas”\dnEliminar esquema
Section titled “Eliminar esquema”DROP SCHEMA ventas;Eliminar esquema y objetos contenidos:
DROP SCHEMA ventas CASCADE;Precaución:
CASCADEpuede eliminar objetos dependientes. Debe utilizarse con extrema precaución.
6. Tablas
Section titled “6. Tablas”Crear tabla
Section titled “Crear tabla”CREATE TABLE usuarios ( id BIGSERIAL PRIMARY KEY, nombre VARCHAR(100) NOT NULL, correo VARCHAR(150) UNIQUE NOT NULL, activo BOOLEAN DEFAULT TRUE, creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP);Consultar estructura
Section titled “Consultar estructura”\d usuariosAgregar columna
Section titled “Agregar columna”ALTER TABLE usuariosADD COLUMN telefono VARCHAR(20);Cambiar tipo
Section titled “Cambiar tipo”ALTER TABLE usuariosALTER COLUMN telefono TYPE VARCHAR(30);Eliminar columna
Section titled “Eliminar columna”ALTER TABLE usuariosDROP COLUMN telefono;Eliminar tabla
Section titled “Eliminar tabla”DROP TABLE usuarios;Eliminar dependencias:
DROP TABLE usuarios CASCADE;Precaución:
DROP TABLEelimina la estructura y los datos de la tabla.
7. CRUD
Section titled “7. CRUD”INSERT
Section titled “INSERT”INSERT INTO usuarios (nombre, correo)VALUES ('Ana López', 'ana@example.com');SELECT
Section titled “SELECT”SELECT *FROM usuarios;Seleccionar columnas específicas:
SELECT id, nombre, correoFROM usuarios;Filtrar:
SELECT *FROM usuariosWHERE activo = TRUE;Ordenar:
SELECT *FROM usuariosORDER BY nombre;Limitar resultados:
SELECT *FROM usuariosLIMIT 10;UPDATE
Section titled “UPDATE”UPDATE usuariosSET activo = FALSEWHERE id = 10;Precaución: Nunca ejecutar un
UPDATEsin revisar previamente elWHERE.
DELETE
Section titled “DELETE”DELETE FROM usuariosWHERE id = 10;Precaución: Nunca ejecutar
DELETEsin verificar el filtro.
8. Transacciones
Section titled “8. Transacciones”Una transacción permite agrupar operaciones y confirmar o deshacer los cambios.
Iniciar
Section titled “Iniciar”BEGIN;Confirmar
Section titled “Confirmar”COMMIT;Deshacer
Section titled “Deshacer”ROLLBACK;Ejemplo:
BEGIN;
UPDATE cuentasSET saldo = saldo - 100WHERE id = 1;
UPDATE cuentasSET saldo = saldo + 100WHERE id = 2;
COMMIT;9. Usuarios y roles
Section titled “9. Usuarios y roles”PostgreSQL utiliza roles para representar usuarios y grupos de permisos.
Crear rol
Section titled “Crear rol”CREATE ROLE app_userLOGINPASSWORD 'CAMBIAR_ESTA_CONTRASEÑA';Nunca utilizar contraseñas reales en código, repositorios o material compartido.
Crear rol sin acceso de inicio de sesión
Section titled “Crear rol sin acceso de inicio de sesión”CREATE ROLE app_readonly;Este tipo de rol puede utilizarse como grupo de permisos.
Convertir un rol en usuario
Section titled “Convertir un rol en usuario”ALTER ROLE app_user LOGIN;Cambiar contraseña
Section titled “Cambiar contraseña”ALTER ROLE app_userPASSWORD 'NUEVA_CONTRASEÑA';Deshabilitar acceso
Section titled “Deshabilitar acceso”ALTER ROLE app_user NOLOGIN;Eliminar rol
Section titled “Eliminar rol”DROP ROLE app_user;10. Principio de mínimo privilegio
Section titled “10. Principio de mínimo privilegio”Una aplicación no debería utilizar una cuenta administrativa.
Ejemplo de usuario de aplicación:
CREATE ROLE app_webLOGINPASSWORD 'CAMBIAR_ESTA_CONTRASEÑA';Permitir conexión:
GRANT CONNECTON DATABASE sistemaTO app_web;Permitir uso del esquema:
GRANT USAGEON SCHEMA publicTO app_web;Permitir consulta:
GRANT SELECTON usuariosTO app_web;Permitir inserción:
GRANT INSERTON usuariosTO app_web;No otorgar:
SUPERUSERCREATEDBCREATEROLEsalvo que exista una razón administrativa explícita.
11. GRANT
Section titled “11. GRANT”Permitir SELECT
Section titled “Permitir SELECT”GRANT SELECTON usuariosTO app_web;Permitir INSERT
Section titled “Permitir INSERT”GRANT INSERTON usuariosTO app_web;Permitir UPDATE
Section titled “Permitir UPDATE”GRANT UPDATEON usuariosTO app_web;Permitir DELETE
Section titled “Permitir DELETE”GRANT DELETEON usuariosTO app_web;Varios permisos
Section titled “Varios permisos”GRANT SELECT, INSERTON usuariosTO app_web;12. REVOKE
Section titled “12. REVOKE”Eliminar permiso:
REVOKE DELETEON usuariosFROM app_web;Eliminar todos los permisos:
REVOKE ALLON usuariosFROM app_web;La seguridad no consiste solamente en otorgar permisos. También implica revisar y retirar permisos innecesarios.
13. Privilegios sobre todas las tablas
Section titled “13. Privilegios sobre todas las tablas”Por ejemplo:
GRANT SELECTON ALL TABLES IN SCHEMA publicTO app_readonly;Para secuencias:
GRANT USAGE, SELECTON ALL SEQUENCES IN SCHEMA publicTO app_web;14. Privilegios predeterminados
Section titled “14. Privilegios predeterminados”Los privilegios predeterminados pueden establecerse para objetos creados posteriormente.
Ejemplo:
ALTER DEFAULT PRIVILEGESIN SCHEMA publicGRANT SELECT ON TABLESTO app_readonly;Precaución: Los privilegios predeterminados dependen del rol que crea los objetos. Es importante comprender este comportamiento antes de utilizarlos en ambientes reales.
15. Revisar permisos
Section titled “15. Revisar permisos”En psql:
\dpTambién:
\zConsultar privilegios de una tabla:
SELECT *FROM information_schema.role_table_grantsWHERE table_name = 'usuarios';16. Sesiones activas
Section titled “16. Sesiones activas”Consultar sesiones:
SELECT pid, usename, datname, client_addr, state, queryFROM pg_stat_activity;Consultar solamente sesiones activas:
SELECT pid, usename, datname, state, queryFROM pg_stat_activityWHERE state = 'active';17. Identificar consultas de larga duración
Section titled “17. Identificar consultas de larga duración”SELECT pid, now() - query_start AS duracion, usename, state, queryFROM pg_stat_activityWHERE query_start IS NOT NULLORDER BY duracion DESC;Esto puede ayudar a detectar:
- consultas lentas
- transacciones prolongadas
- sesiones problemáticas
- posibles bloqueos
18. Bloqueos
Section titled “18. Bloqueos”Consultar información relacionada con bloqueos:
SELECT pid, usename, state, wait_event_type, wait_event, queryFROM pg_stat_activityWHERE wait_event IS NOT NULL;Los bloqueos deben analizarse antes de cancelar procesos.
19. Cancelar una consulta
Section titled “19. Cancelar una consulta”SELECT pg_cancel_backend(12345);El número corresponde al pid.
Si es necesario terminar una sesión:
SELECT pg_terminate_backend(12345);Precaución: Terminar una sesión puede provocar rollback de una transacción. Debe utilizarse después de identificar correctamente el proceso.
20. EXPLAIN
Section titled “20. EXPLAIN”Permite conocer el plan de ejecución de una consulta.
EXPLAINSELECT *FROM usuariosWHERE correo = 'ana@example.com';Una versión más detallada:
EXPLAIN (ANALYZE, BUFFERS)SELECT *FROM usuariosWHERE correo = 'ana@example.com';Precaución:
EXPLAIN ANALYZEejecuta realmente la consulta.
Para operaciones que modifican datos debe extremarse la precaución. En un laboratorio puede utilizarse una transacción controlada:
BEGIN;
EXPLAIN ANALYZEUPDATE usuariosSET activo = FALSEWHERE id = 10;
ROLLBACK;Aun así, funciones, triggers y otras acciones pueden producir efectos secundarios. No debe asumirse que ROLLBACK hace segura cualquier operación.
21. Índices
Section titled “21. Índices”Crear índice
Section titled “Crear índice”CREATE INDEX idx_usuarios_correoON usuarios(correo);Índice único
Section titled “Índice único”CREATE UNIQUE INDEX idx_usuarios_correo_uniqueON usuarios(correo);Listar índices
Section titled “Listar índices”\diEliminar índice
Section titled “Eliminar índice”DROP INDEX idx_usuarios_correo;Los índices pueden mejorar consultas, pero también tienen costos:
- espacio
- mantenimiento
- escrituras más costosas
- memoria
- tiempo de actualización
22. Estadísticas
Section titled “22. Estadísticas”Actualizar estadísticas:
ANALYZE usuarios;Actualizar toda la base:
ANALYZE;Las estadísticas ayudan al optimizador a seleccionar planes de ejecución.
23. VACUUM
Section titled “23. VACUUM”Ejecutar:
VACUUM usuarios;Con estadísticas:
VACUUM ANALYZE usuarios;VACUUM ayuda a mantener las tablas después de actualizaciones y eliminaciones.
Importante:
VACUUMnormalmente hace que el espacio liberado pueda reutilizarse dentro de PostgreSQL. No significa necesariamente que el sistema operativo recupere ese espacio.
VACUUM FULL funciona de manera diferente:
VACUUM FULL usuarios;Puede recuperar espacio para el sistema operativo, pero requiere una operación más costosa y puede bloquear la tabla.
24. Tamaño de bases de datos
Section titled “24. Tamaño de bases de datos”SELECT pg_size_pretty(pg_database_size(current_database()));Tamaño de una tabla:
SELECT pg_size_pretty(pg_total_relation_size('usuarios'));Listar tamaños:
SELECT relname, pg_size_pretty(pg_total_relation_size(relid))FROM pg_catalog.pg_statio_user_tablesORDER BY pg_total_relation_size(relid) DESC;25. Configuración de PostgreSQL
Section titled “25. Configuración de PostgreSQL”Consultar un parámetro:
SHOW port;SHOW listen_addresses;SHOW max_connections;SHOW ssl;Consultar ubicación de archivos:
SHOW config_file;SHOW hba_file;Ver todos los parámetros:
SELECT name, settingFROM pg_settingsORDER BY name;26. postgresql.conf
Section titled “26. postgresql.conf”Archivo principal de configuración.
Algunos parámetros importantes:
listen_addressesportmax_connectionsshared_bufferswork_memmaintenance_work_memssllog_connectionslog_disconnectionsNo deben modificarse valores de configuración sin comprender:
- qué controla el parámetro
- qué impacto tiene
- qué valor existe actualmente
- qué cambio se pretende realizar
- cómo verificar el resultado
- cómo regresar al estado anterior
27. pg_hba.conf
Section titled “27. pg_hba.conf”Controla la autenticación y acceso de clientes.
Consultar su ubicación:
SHOW hba_file;Ejemplo conceptual:
host sistema app_web 10.10.10.0/24 scram-sha-256La interpretación general es:
tipo base usuario origen métodoNunca debe abrirse PostgreSQL indiscriminadamente a Internet.
Evitar configuraciones como:
0.0.0.0/0salvo que exista una justificación de arquitectura, controles adicionales y conocimiento de las implicaciones.
28. TLS
Section titled “28. TLS”Consultar:
SHOW ssl;En ambientes reales, la protección de conexiones debe analizar:
- TLS
- certificados
- autenticación
- clientes autorizados
- cifrado
- administración de certificados
29. Backup lógico
Section titled “29. Backup lógico”Crear respaldo:
pg_dump -U postgres -d sistema -F c -f sistema.dumpFormato SQL:
pg_dump -U postgres -d sistema > sistema.sqlEl formato personalizado -F c es útil para trabajar con pg_restore.
30. Restauración
Section titled “30. Restauración”Restaurar un archivo SQL:
psql -U postgres -d sistema < sistema.sqlRestaurar formato personalizado:
pg_restore -U postgres -d sistema sistema.dumpListar contenido de un dump:
pg_restore -l sistema.dumpUn respaldo no debe considerarse válido solamente porque el archivo existe. Debe probarse su restauración.
31. Diagnóstico básico
Section titled “31. Diagnóstico básico”Ante un problema de PostgreSQL:
1. ¿El servidor está disponible?2. ¿La base responde?3. ¿Hay conexiones?4. ¿Hay consultas lentas?5. ¿Hay bloqueos?6. ¿Hay errores?7. ¿Hay suficiente espacio?8. ¿Los índices son adecuados?9. ¿Las estadísticas están actualizadas?10. ¿Hubo algún cambio reciente?32. Comandos que requieren precaución
Section titled “32. Comandos que requieren precaución”Los siguientes comandos pueden tener consecuencias importantes:
DROP DATABASEDROP TABLEDROP SCHEMA ... CASCADETRUNCATEDELETEUPDATEALTER ROLE ... SUPERUSERREVOKE ALLpg_terminate_backend(...)VACUUM FULLAntes de ejecutar una operación destructiva:
Identificar → verificar → respaldar si aplica → ejecutar → comprobar → documentar33. Checklist básico de seguridad PostgreSQL
Section titled “33. Checklist básico de seguridad PostgreSQL”Acceso
Section titled “Acceso”- No utilizar
postgrescomo usuario de la aplicación - Crear roles específicos
- Aplicar mínimo privilegio
- Revisar usuarios periódicamente
- Eliminar o deshabilitar cuentas innecesarias
- No exponer PostgreSQL directamente a Internet
- Revisar
listen_addresses - Revisar
pg_hba.conf - Restringir redes autorizadas
- Utilizar TLS cuando corresponda
Privilegios
Section titled “Privilegios”- Revisar
GRANT - Revisar
REVOKE - Evitar
SUPERUSER - Revisar privilegios predeterminados
Mantenimiento
Section titled “Mantenimiento”- Revisar estadísticas
- Revisar índices
- Revisar sesiones
- Revisar bloqueos
- Revisar espacio
Continuidad
Section titled “Continuidad”- Realizar respaldos
- Proteger los respaldos
- Probar restauraciones
- Definir RPO
- Definir RTO
34. Comandos que conviene memorizar
Section titled “34. Comandos que conviene memorizar”\l\c\dt\d\du\dn\qSELECT current_user;SELECT current_database();SELECT version();
CREATE ROLEALTER ROLEDROP ROLE
GRANTREVOKE
SELECT * FROM pg_stat_activity;
EXPLAINEXPLAIN ANALYZE
CREATE INDEXANALYZEVACUUM
SHOW35. Modelo mental del DBA PostgreSQL
Section titled “35. Modelo mental del DBA PostgreSQL”Un DBA no solamente ejecuta comandos.
Ante cualquier problema debe pensar:
OBSERVAR ↓ENTENDER ↓EVALUAR RIESGO ↓CAMBIAR ↓VERIFICAR ↓DOCUMENTARLa administración de una base de datos debe buscar simultáneamente:
Seguridad +Disponibilidad +Integridad +Rendimiento +Recuperabilidad
