Cómo instalar PostgreSQL en Mac


1. Qué es PostgreSQL

PostgreSQL es un motor de base de datos relacional open source con más de 30 años de desarrollo activo. Es el motor más usado en empresas que necesitan una base de datos seria sin el costo de licencias de Oracle o SQL Server.

A diferencia de BigQuery — que es serverless y vive 100% en la nube de Google — PostgreSQL es un servidor que corre en una máquina. Puede ser tu laptop, un servidor de la empresa, o una instancia en la nube. Tú controlas todo: la instalación, los usuarios, los permisos, los backups.

En las empresas lo vas a encontrar principalmente como la base de datos de las aplicaciones: cuando un usuario se registra, hace un pedido o actualiza su perfil, esa acción escribe en PostgreSQL. Los datos analíticos suelen fluir desde PostgreSQL hacia un warehouse como BigQuery — pero la fuente de verdad operacional vive en Postgres.

Diferencia con BigQuery

PostgreSQL BigQuery
Tipo OLTP (transaccional) OLAP (analítico)
Dónde vive Tu máquina / servidor / nube Google Cloud
Instalación Sí — tú lo gestionas No — serverless
Restricciones relacionales PK, FK, NOT NULL, UNIQUE No existen de forma nativa
Quién lo usa Desarrolladores, analistas Analistas de datos, ingenieros

2. Instalar PostgreSQL en Mac

Paso 1 — Verificar si ya lo tienes instalado

which psql && brew list | grep postgresql

Si ves algo como /opt/homebrew/opt/postgresql@17/bin/psql y postgresql@17 — ya lo tienes. Salta al Paso 3.

Si el comando no devuelve nada — no está instalado. Sigue con el Paso 2.

Paso 2 — Instalación

Usamos Homebrew porque es la forma más común de trabajar en mac y te da control real sobre el servidor. Si no tienes Homebrew instalado, sigue las instrucciones oficiales en brew.sh antes de continuar.

brew install postgresql@17

Paso 3 — Arrancar el servidor

PostgreSQL es un servidor — un programa que corre en segundo plano en tu Mac esperando conexiones. Instalarlo no es suficiente: hay que arrancarlo para que esté disponible.

Antes de arrancar nada, verifica si ya está corriendo — si en algún momento anterior se usó start, el servidor arranca solo en cada inicio de sesión y puede llevar tiempo encendido sin que lo notes:

# Ver si está corriendo (busca "started" en la columna Status)
brew services list

Si aparece started, salta al Paso 4. Si no:

# Arrancar el servidor + registrar inicio automático al encender el Mac
brew services start postgresql@17

# Arrancar solo esta vez, sin registrar inicio automático
brew services run postgresql@17

# Detenerlo + eliminar el inicio automático (apaga el proceso en segundo plano)
brew services stop postgresql@17

Cuando ejecutas brew services start, verás algo así:

Name          Status  User          File
postgresql@17 started <tu-usuario>  ~/Library/LaunchAgents/homebrew.mxcl.postgresql@17.plist

Ese archivo .plist en ~/Library/LaunchAgents/ es el mecanismo de macOS para arrancar servicios automáticamente al encender el Mac. Brew lo crea por ti.

Paso 4 — Conectarte

psql postgres

Qué significa el comando: psql es el cliente para hablarle al servidor, y postgres es el nombre de la base a la que entras (el patrón es psql <nombre-de-base>). Entramos por postgres porque es una base de sistema que existe siempre desde la instalación — la puerta garantizada cuando todavía no has creado ninguna base propia.

Si ves el prompt postgres=# — estás dentro del motor. Ese prompt indica la base de datos a la que estás conectado. Desde aquí puedes escribir comandos directamente a PostgreSQL.

¿Por qué psql y no una interfaz visual?

psql es un cliente, no el cliente. Existen interfaces gráficas — DBeaver, pgAdmin, DataGrip — y más adelante en el blog usaremos DBeaver para escribir consultas cómodamente. No dependen de psql: traen su propio driver y hablan directo con el servidor.

Entonces, ¿por qué empezar por la terminal?

  1. Es la prueba de que el Paso 3 funcionó. Si el servidor no arrancó, psql te lo dice en una línea. Con una interfaz gráfica un fallo puede venir del servidor, del driver, del puerto o de la contraseña — cuatro sospechosos en vez de uno.
  2. No añade otra instalación. Ya lo tienes: brew install postgresql@17 instaló el servidor y el cliente juntos, en el mismo paquete.
  3. Es lo único que hay en un servidor real. Cuando administres PostgreSQL en una máquina remota por SSH no habrá ventanas, habrá psql.
  4. Los metacomandos (\l, \du, \dt) solo existen aquí. No son SQL, son de psql. La documentación oficial y la mayoría de respuestas que encontrarás hablan ese idioma.

Su punto débil es real: leer datos en la terminal es incómodo. Por eso el reparto natural es psql para verificar y administrar; una interfaz visual para explorar y consultar.

No entran por la misma puerta

Un detalle que importará más adelante: psql y DBeaver no llegan al servidor por el mismo camino, y PostgreSQL aplica una regla distinta a cada uno. Esas reglas viven en un archivo llamado pg_hba.conf, donde cada línea es una puerta del servidor:

Cliente Camino Puerta que le aplica
psql en tu propia máquina socket Unix (un archivo local) línea local
DBeaver red TCP (localhost:5432) línea host

Ojo con el nombre: host significa "por red TCP", no "desde internet". DBeaver le aplica una regla host sin salir nunca de tu Mac.

La última columna de cada línea es el método de autenticación — la cerradura de esa puerta. Y aquí está lo que conviene saber desde ya:

Puerta Homebrew de fábrica Lo recomendable
local (socket) trust peer — el sistema operativo da fe de quién eres, sin contraseña
host (TCP) trust scram-sha-256 — contraseña cifrada, porque por red el sistema operativo ya no puede dar fe de nadie

O sea: para conectar DBeaver como es debido, tu base necesita la línea host en scram-sha-256 y un rol con contraseña definida. Por qué Homebrew no lo deja así, y cómo cambiarlo, es el tema de otra sesión.

3. Primeros comandos desde psql

psql tiene dos tipos de comandos: los que empiezan con \ son comandos propios de psql (no llevan punto y coma), y los que son SQL estándar sí llevan punto y coma al final.

Por ahora solo necesitas dos para orientarte:

Antes de empezar, un tip opcional: cuando un resultado no cabe en la pantalla, psql lo muestra dentro de un visor paginado (verás (END) al final; se sale con q). Si prefieres que todo salga directo en la terminal, desactívalo para esta sesión:

\pset pager off

Ver qué bases de datos existen:

\l

En una instalación limpia aparecen tres bases de datos por defecto:

   Nombre   |       Dueño       | ...
------------+-------------------+----
 postgres   | nombreusuario     |
 template0  | nombreusuario     |
 template1  | nombreusuario     |

Si aparece (END) al final, presiona q para volver al prompt.

¿Por qué entramos por postgres y no por otra base? Porque para listar las bases hay que preguntarle al servidor, y para eso hay que estar conectado a alguna base. postgres es el lobby: una base de sistema que siempre existe desde la instalación, garantizada como puerta de entrada. Cuando tengas bases propias, el mismo comando sirve para entrar directo a cualquiera (psql tareas), y desde dentro puedes cambiarte con \c tareas. Atajo útil: psql -l desde la terminal lista las bases y sale, sin quedarse dentro.

Experimenta un poco (sin miedo — ninguno de estos comandos crea ni modifica nada):

1. Tu primera consulta SQL — pregúntale al servidor su versión:

SELECT version(); 

Fíjate en el ; final: esto ya es SQL de verdad, no un comando de psql. La respuesta muestra la versión exacta del motor y la plataforma para la que fue compilado.

2. ¿Dónde estoy conectado?

\conninfo

Responde la base, el usuario y el puerto (el famoso 5432) — los mismos ingredientes de la cadena de conexión que vimos en la parte 1 de esta serie.

3. ¿Quién soy dentro del motor?

\du

Lista los roles (usuarios) del servidor. En una instalación con Homebrew verás uno solo: tu usuario de Mac, marcado como Superusuario.

4. ¿Qué tablas hay en esta base?

\dt

Respuesta: "No se encontró ninguna relación." La base postgres está vacía — y así debe quedarse: es el lobby, no un lugar de trabajo. De hecho, ninguna base de una instalación limpia tiene datos: PostgreSQL no trae datos de prueba. Para ver tablas con filas de verdad habrá que crear una base propia y llenarla — eso es justo lo que viene (ver "Qué sigue").

Bonus: cámbiate de base sin salir de psql con \c template1, mira su prompt cambiar a template1=#, y vuelve con \c postgres.

Salir de psql:

\q

Te devuelve al prompt normal de la terminal.

El resto de comandos — crear bases de datos, conectarte a ellas, ver tablas — los veremos en una próxima serie, cuando tengamos contexto de qué estamos creando y por qué.

4. ¿Tengo que dejarlo encendido siempre?

No es obligatorio. Los tres comandos del Paso 3 hacen cosas distintas:

Comando Arranca ahora Inicio automático al encender el Mac
brew services start postgresql@17 Sí — registra el LaunchAgent
brew services stop postgresql@17 No (detiene) No — elimina el LaunchAgent
brew services run postgresql@17 No — sin registro automático

Puedes verificar qué servicios están registrados en Configuración del Sistema → General → Elementos de inicio.

Para el aprendizaje de esta serie recomendamos start — arranca solo y no tienes que recordar iniciarlo cada vez.

¿Y en una empresa, quién lo mantiene encendido 24/7? Nadie depende de que una laptop esté prendida: el servidor corre en una máquina que nunca se apaga, por alguno de los dos caminos que vimos en la parte 1 de esta serie — autogestionado (un servidor Linux administrado por el equipo de infraestructura, donde el equivalente de brew services se llama systemd) o gestionado (Cloud SQL, RDS, Azure Database, Supabase: el proveedor se encarga del 24/7, los respaldos y los reinicios). La diferencia con tu Mac es una sola: allá el administrador del servidor es otro; aquí eres tú.

5. Excluir los datos de Spotlight (hacer esto justo después de instalar)

Spotlight es el buscador de macOS — el que se abre con Cmd+Space. Su trabajo es indexar automáticamente todos los archivos del sistema para que puedas encontrarlos en segundos. El problema es que Spotlight no distingue entre un documento de Word y un archivo binario interno de una base de datos: cuando detecta archivos nuevos en cualquier carpeta, los indexa todos sin excepción.

Al instalar PostgreSQL, Homebrew inicializa el cluster de datos en /opt/homebrew/var/postgresql@17/ — una carpeta con cientos de archivos binarios que son el corazón interno del motor (páginas de datos, logs de transacciones, archivos de control). Spotlight los ve como "archivos nuevos" y lanza hasta 16 workers paralelos para abrirlos y catalogarlos. Como son binarios sin contenido legible, el proceso es inútil — pero el daño ya está hecho: el disco se satura (hasta 148 MB/s de actividad sostenida) y el síntoma visible es que todo el Mac se pone lento — Chrome, apps, todo — aunque PostgreSQL no esté corriendo.

Para confirmar que Spotlight está indexando activamente, ejecutar:

ps aux | grep mdworker_shared | grep -v grep | wc -l

Este comando cuenta cuántos workers de indexación de Spotlight están corriendo en ese momento. Si el número es mayor a 0 (especialmente si ves 10 o más), Spotlight está en plena indexación. Cuando llega a 0, terminó.

La solución es decirle a Spotlight que nunca indexe esa carpeta:

sudo touch /opt/homebrew/var/postgresql@17/.metadata_never_index

Ese archivo es una señal que Spotlight reconoce nativamente. Una vez creado, los workers de indexación terminan solos en 2-3 minutos y el Mac vuelve a la normalidad. Es permanente — no se borra solo. Si en el futuro instalas otra versión (ej. postgresql@18), repetir el comando con la ruta de esa versión.

6. Qué sigue

Tienes PostgreSQL instalado, corriendo y conectado. Pero al explorar notaste algo: ninguna de las bases por defecto tiene datos. postgres es el lobby y las template son moldes — las tres vacías por diseño. PostgreSQL no trae datos de prueba: los datos los pones tú.

Por eso el siguiente paso es crear tu primera base de datos y llenarla con datos reales. Recién ahí cobran vida los comandos que hoy se quedaron con hambre: \dt mostrando tablas de verdad, \d <tabla> revelando su estructura, y los SELECT devolviendo filas reales. Ese camino — diseñar el modelo relacional, crear las tablas y consultarlas con SQL — viene en una próxima serie del blog.

Queda un cabo suelto que conviene que tengas en el radar: ¿notaste que al conectarte psql no te pidió usuario ni contraseña? Eso no es lo normal en un servidor de verdad. Homebrew tomó tres decisiones por ti al instalar, y una de ellas dejó las puertas sin cerradura. Mientras el servidor solo se escuche a sí mismo no es urgente — pero es lo primero que hay que arreglar antes de conectar una interfaz visual como DBeaver, que sí necesita esa cerradura puesta.

Gotchas

  • En Mac con teclado Latinoamericano, la barra invertida \ se escribe con Option + ?. Si dentro de la terminal no produce \ sino (arg: -1) u otro resultado extraño, es porque Terminal intercepta Option como meta-tecla. Solución: Terminal → Settings → Profiles → Basic → Keyboard → desmarcar "Use Option as Meta key" → cerrar y reabrir la terminal
  • El comando \l usa la letra ele minúscula, no el número uno — en terminal con fuente monoespaciada se ven casi iguales
  • Si después de \l aparece (END) al final, psql está mostrando el resultado dentro de un visor paginado (less). Mientras veas (END), todo lo que tecleas va al visor, no a psql — si repites \l + Enter pensando que no funcionó, solo acumulas comandos que se ejecutarán al salir y el listado reaparecerá una y otra vez. La única tecla que necesitas es q (una por cada listado abierto) hasta volver al prompt. Las líneas con ~ son el visor indicando que no hay más contenido, no un error. Si prefieres que los resultados salgan directo a la terminal sin visor, ejecuta \pset pager off dentro de psql (dura hasta que cierres la sesión)
  • Si el prompt cambia de postgres=# a postgres-# (guion en vez de igual), psql está esperando que termines una sentencia que dejaste a medias — todo lo que escribas se acumula en ese borrador. Pasa, por ejemplo, si tecleas q suelto fuera del visor: psql lo toma como inicio de una sentencia SQL. Solución: \r (reset) borra el borrador y devuelve el prompt =#
  • Si al conectarte ves No such file or directory en el socket, el servidor no está corriendo — ejecutar brew services start postgresql@17
  • En Mac con Homebrew el superusuario por defecto es tu usuario de Mac, no postgres. El comando correcto para conectarte es psql postgres, no psql -U postgres
  • La versión instalada puede variar — verificar con brew list | grep postgresql y usar ese número en los comandos de brew services
  • En macOS Ventura o posterior, al ejecutar brew services start aparece una notificación del sistema: "Se instalaron elementos en segundo plano". Es esperado — macOS te avisa que se registró el LaunchAgent de PostgreSQL para inicio automático. No es un error
  • Si al arrancar ves Service already running, no es un error: el servidor ya estaba encendido, casi seguro por el inicio automático de un start anterior. Para saber desde cuándo: el archivo .plist que muestra brew services list solo existe si hubo un start y ningún stop después — o sea, Postgres ha estado arrancando solo en cada inicio de sesión desde entonces

Referencia oficial