Fundamentos de Extensiones
Las extensiones de PostgreSQL añaden tipos, funciones y workers en segundo plano sin necesidad de bifurcar el servidor. Instálalas deliberadamente, rastrea sus versiones y ten en cuenta cuáles requieren un reinicio a través de shared_preload_libraries.
Receta
-- Lista las extensiones disponibles en el clúster
SELECT name, default_version, installed_version, comment
FROM pg_available_extensions
ORDER BY name;
-- Instalar en un esquema (patrón común para PostGIS, pgvector)
CREATE SCHEMA IF NOT EXISTS extensions;
CREATE EXTENSION IF NOT EXISTS vector
WITH SCHEMA extensions
VERSION '0.8.0';
-- Extensiones que necesitan precarga (ejemplo: pg_stat_statements)
-- postgresql.conf:
-- shared_preload_libraries = 'pg_stat_statements'
-- Luego reiniciar, y después:
CREATE EXTENSION pg_stat_statements;Cuándo usar esto: Necesitas capacidades más allá del SQL principal (vectores, geoespacial, estadísticas, auditoría) y quieres que se versionen como las dependencias de una aplicación.
Ejemplo Funcional
-- Inicializar una nueva base de datos con extensiones fijadas
BEGIN;
CREATE SCHEMA IF NOT EXISTS extensions;
GRANT USAGE ON SCHEMA extensions TO app_role;
CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA extensions;
CREATE EXTENSION IF NOT EXISTS vector WITH SCHEMA extensions VERSION '0.8.0';
-- Verificar qué está instalado
SELECT e.extname,
e.extversion,
n.nspname AS schema
FROM pg_extension e
JOIN pg_namespace n ON n.oid = e.extnamespace
WHERE e.extname IN ('pgcrypto', 'vector');
COMMIT;Qué demuestra esto:
- Un esquema
extensionsdedicado mantienepubliclimpio. VERSIONfija la extensión en el momento de la instalación.pg_extensiones la fuente de verdad del inventario.- Algunas extensiones son independientes del esquema; otras (PostGIS) tienen requisitos de orden.
Profundización
Cómo Funcionan las Extensiones
- Las extensiones distribuyen scripts SQL más bibliotecas C opcionales registradas en
pg_available_extensions. CREATE EXTENSIONejecuta el script de instalación y registra metadatos enpg_extension.ALTER EXTENSION ... UPDATEaplica scripts de migración entre versiones.DROP EXTENSIONelimina los objetos que posee la extensión; usaCASCADEsolo después de revisarlo.
shared_preload_libraries
| Extensión | ¿Requiere precarga? | Notas |
|---|---|---|
pg_stat_statements | Sí | Rastrea estadísticas de consultas normalizadas |
pg_cron | Sí | Programador de trabajos en segundo plano |
vector (pgvector) | No | Se carga al ejecutar CREATE EXTENSION |
postgis | No | Instalación SQL pesada, sin precarga |
Las extensiones de precarga necesitan un reinicio completo del servidor. Planifica ventanas de mantenimiento antes de habilitarlas en producción.
Versión y Empaquetado
-- Ver instalado vs. disponible
SELECT extname,
extversion AS installed,
(SELECT default_version
FROM pg_available_extensions a
WHERE a.name = e.extname) AS available_default
FROM pg_extension e;En Postgres gestionado (RDS, Cloud SQL, Neon), solo las extensiones pre-aprobadas aparecen en pg_available_extensions. Los clústeres auto-alojados instalan paquetes a través del sistema operativo (postgresql-18-pgvector, postgis) antes de que CREATE EXTENSION tenga éxito.
Notas SQL
- Concede
USAGEen el esquema de la extensión; evita concederCREATEenpublica los roles de aplicación. - Usa
IF NOT EXISTSen scripts de migración idempotentes. - Documenta las versiones de las extensiones en la infraestructura como código junto con la versión principal de Postgres.
Trampas Comunes
- Paquete del SO faltante -
CREATE EXTENSION vectorfalla con "could not open extension control file." Solución: Instala primero el paquete de extensión para tu versión principal de Postgres. - Esquema incorrecto - Los objetos de PostGIS terminan en
publicpor defecto y desordenan las rutas de búsqueda. Solución:CREATE EXTENSION postgis WITH SCHEMA extensions;en bases de datos nuevas. - Precarga sin reinicio - Añadir
shared_preload_librariesy ejecutarCREATE EXTENSIONinmediatamente falla. Solución: Reinicia Postgres, luego crea la extensión. - Instalación solo para superusuario - La mayoría de las extensiones requieren privilegios elevados. Solución: El DBA instala; el rol de aplicación solo obtiene
USAGEdel esquema. - Desfase de versiones entre réplicas - La réplica en espera tiene binarios de extensión más antiguos después de una actualización del primario. Solución: Actualiza todos los nodos con paquetes de extensión coincidentes antes de ejecutar
ALTER EXTENSION UPDATE. DROP EXTENSION CASCADE- Elimina objetos dependientes que no esperabas. Solución: Auditapg_dependantes de eliminar; prefiere actualizarALTER EXTENSIONen lugar de reinstalar.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Solo Postgres principal | CRUD simple, sin tipos especiales | Necesitas vectores, GIS o estadísticas avanzadas |
| Bibliotecas a nivel de aplicación | La extensión no está disponible en el host gestionado | Necesitas búsqueda indexada en SQL |
| Wrappers de datos externos (FDW) | Los datos residen en otro sistema | La latencia y la complejidad de las uniones son inaceptables |
| Servicio de búsqueda/OLAP separado | Escala masiva, equipo dedicado | El costo operativo de otro almacén de datos es demasiado alto |
Preguntas Frecuentes
¿Puedo instalar extensiones sin ser superusuario?
PostgreSQL 18 soporta extensiones confiables para no superusuarios cuando se concede el privilegio `CREATE` sobre la extensión. La mayoría de las organizaciones todavía centralizan las instalaciones con el rol de DBA.¿Dónde están los archivos de extensión en el disco?
Los archivos de control y SQL se encuentran en `SHAREDIR/extension/`. Las bibliotecas se encuentran en `PKGLIBDIR`. Usa `pg_config --sharedir` para localizarlos.¿CREATE EXTENSION se ejecuta en una transacción?
Sí. Una instalación fallida se revierte. Los cambios de configuración de precarga aún requieren un reinicio fuera de cualquier transacción.¿Cómo muevo una extensión a otro esquema?
No soportado directamente. Elimina y recrea en bases de datos vacías, o acepta el esquema original en sistemas existentes.¿Cuál es la diferencia entre una extensión y un lenguaje procedural?
`plpgsql` se instala como una extensión. Los lenguajes y tipos siguen el mismo modelo de inventario `pg_extension`.¿Pueden dos bases de datos tener extensiones diferentes?
Sí. Las extensiones son por base de datos. La configuración a nivel de clúster como `shared_preload_libraries` se aplica a todas las bases de datos de la instancia.¿Cómo bloqueo extensiones?
Deja `allow_in_place_tablespaces` a un lado; usa hooks de `pg_extension_config` o revoca `CREATE` en extensiones no confiables. Consulta el artículo de política de lista blanca.¿Las extensiones sobreviven a pg_upgrade?
Generalmente sí si los paquetes existen para la nueva versión principal. Vuelve a ejecutar `ALTER EXTENSION UPDATE` después de la actualización.¿Qué pasa con las extensiones en las plantillas?
Instala en `template1` para que las nuevas bases de datos las hereden. Ten cuidado: cada nueva base de datos incurre en el costo de instalación.¿Cómo listo los objetos propiedad de una extensión?
`SELECT * FROM pg_depend WHERE refobjid = (SELECT oid FROM pg_extension WHERE extname = 'vector');`Relacionado
- Extensiones Confiables vs. No Confiables - revisión de seguridad antes de la instalación
- Ruta de Actualización de Extensiones - incrementos de versión menor y mayor
- Política de Lista Blanca de Extensiones - gobernanza empresarial
- Mejores Prácticas para Extensiones - lista de verificación operativa
- Fundamentos de pgvector - tipo de vector y operadores
Versiones de Stack: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PostGIS 3.5+, pgbouncer 1.x, y Patroni 3.x.