PostgreSQL 13, la última versión del software de base de datos Postgres, viene con muchas mejoras internas. Si bien es el RDBMS de código abierto más popular y versátil, no es el más fácil de configurar y comenzar. Siga leyendo para saber cómo puede ponerse en marcha con la última versión de Postgres en la última versión LTS del servidor Ubuntu.
Instalación
Ubuntu 20.04 viene con Postgres 12 de su universo repositorio. Como queremos la versión 13, podemos usar directamente el repositorio APT oficial del proyecto PostgreSQL. Este repositorio contiene archivos binarios para Ubuntu 20.04 y también incluye paquetes para varias extensiones que quizás desee instalar más tarde.
Configuremos el repositorio de esta manera (tenga en cuenta que "focal" es el nombre en clave de Ubuntu 20.04):
# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main
END
# get the signing key and import it
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo apt-key add ACCC4CF8.asc
# fetch the metadata from the new repo
sudo apt-get update
Ahora podemos instalar el servidor PostgreSQL y otras herramientas de línea de comandos usando:
sudo apt-get install -y postgresql-13
La instalación hace algunas cosas:
- Instala el servidor PostgreSQL, las utilidades y un cliente de línea de comandos llamado psql .
- Crea un usuario del sistema Linux llamado postgres . Todos los archivos de datos son propiedad de este usuario y todos los procesos se ejecutan como este usuario.
- Crea un clúster de base de datos (vea abajo). En este clúster, crea una base de datos, también llamada postgres .
- Crea un usuario de PostgreSQL (no el usuario del sistema Linux), también llamado postgres . Este usuario de PostgreSQL tiene privilegios de superusuario.
¡Puedes ver que esto comienza a ser confuso!
Clústeres de bases de datos
En términos de Postgres, ahora tenemos un solo clúster de base de datos en funcionamiento. Un solo clúster de base de datos puede contener una o más bases de datos. En el clúster de base de datos que tenemos ahora, hay una base de datos llamada "postgres". (También hay un par de bases de datos de "plantilla" que podemos ignorar por ahora).
Un clúster de base de datos es administrado por un proceso principal de postgres llamado postmaster Genera varios procesos secundarios que realizan varias tareas del sistema o manejan las conexiones de clientes entrantes. Eche un vistazo a los procesos que se están ejecutando actualmente:
alice@ubu:~$ ps -o uname,pid,ppid,cmd -H -U postgres
USER PID PPID CMD
postgres 4880 1 /usr/lib/postgresql/13/bin/postgres -D /var/lib/postgresql/13/main -c config_file=/etc/postgresql/13/main/postgresql.conf
postgres 4882 4880 postgres: 13/main: checkpointer
postgres 4883 4880 postgres: 13/main: background writer
postgres 4884 4880 postgres: 13/main: walwriter
postgres 4885 4880 postgres: 13/main: autovacuum launcher
postgres 4886 4880 postgres: 13/main: stats collector
postgres 4887 4880 postgres: 13/main: logical replication launcher
Aquí, el proceso postmaster es 4880 y ha generado 6 procesos secundarios que manejan varias actividades de limpieza. También puede ver la ubicación del clúster (/var/lib/postgresql/13/main
) y la ubicación del archivo de configuración (/etc/postgresql/13/main/postgresql.conf
).
Recargar y reiniciar
En varios momentos, es posible que deba recargar o reiniciar su servidor de Postgres. La recarga hace que Postgres vuelva a examinar sus archivos de configuración y aplique los cambios. Si no hay cambios en los archivos de configuración, no sucede nada malo. La recarga no molesta a los clientes actualmente conectados. Para recargar su servidor Postgres, puede hacer:
sudo systemctl reload postgresql
Algunos cambios de configuración surtirán efecto solo después de que reinicie el servidor. Esto es más disruptivo y desconectará a todos los clientes conectados. Para reiniciar, puedes:
sudo systemctl restart postgresql
Archivos de registro
Como puede ver, hay un servicio systemd llamado postgresql
que puedes usar para controlar al administrador de correos. Si el servicio no se inicia, puede comprobar su estado para comprobar si hay mensajes de error:
alice@ubu:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Thu 2020-10-29 04:52:29 UTC; 25min ago
Main PID: 4557 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 1075)
Memory: 0B
CGroup: /system.slice/postgresql.service
Oct 29 04:52:29 ubu systemd[1]: Starting PostgreSQL RDBMS...
Oct 29 04:52:29 ubu systemd[1]: Finished PostgreSQL RDBMS.
El servidor PostgreSQL escribe un archivo de registro, que puede consultar para ver mensajes de error más detallados. Este archivo se encuentra en /var/log/postgresql/postgresql-13-main.log
:
alice@ubu:~$ cat /var/log/postgresql/postgresql-13-main.log
2020-10-29 04:52:34.096 UTC [4880] LOG: starting PostgreSQL 13.0 (Ubuntu 13.0-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0, 64-bit
2020-10-29 04:52:34.097 UTC [4880] LOG: listening on IPv4 address "127.0.0.1", port 5432
2020-10-29 04:52:34.099 UTC [4880] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-10-29 04:52:34.106 UTC [4881] LOG: database system was shut down at 2020-10-29 04:52:31 UTC
2020-10-29 04:52:34.112 UTC [4880] LOG: database system is ready to accept connections
Conexión a su servidor Postgres
Ahora que tenemos nuestro servidor en funcionamiento, intentemos conectarnos a él. De forma predeterminada, el servidor solo escucha:
- Conexiones TCP desde 127.0.0.1 en el puerto 5432, y
- Sockets de dominio Unix en /var/run/postgresql
Debido a la configuración predeterminada, la única forma de conectarse al servidor en este momento es a través del socket Unix desde un proceso que se ejecuta como el usuario del sistema postgres . Ejecutemos el cliente interactivo estándar psql así:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=#
Aquí estamos ejecutando psql como el usuario del sistema postgres ("sudo -u postgres psql") y conectándonos a la base de datos llamada "postgres" (el último "postgres" en la línea de comando). El indicador "postgres=#" indica el nombre de la base de datos actualmente conectada ("postgres") y que tenemos privilegios de superusuario ("#" en lugar de "$").
La conexión se realizó a través de sockets Unix (este es el método predeterminado en psql). Dado que, de manera predeterminada, el usuario de Postgres no tiene una contraseña y la configuración predeterminada requiere autenticación de contraseña para las conexiones TCP, no es posible conectarse a través de 127.0.0.1:5432 en este momento. .
Permitir conexiones entrantes desde una red interna
Primero cambiemos la configuración para permitir conexiones desde una red interna. Asumiendo que la IP de nuestro servidor en esta red es 10.1.2.3, podemos editar el archivo de configuración principal en /etc/postgresql/13/main/postgresql.conf
y cambia las líneas:
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
a:
listen_addresses = 'localhost,10.1.2.3'
También debemos decirle a Postgres que use la autenticación de contraseña para las conexiones que provienen de estas redes. Para esto, edite otro archivo de configuración llamado /etc/postgresql/13/main/pg_hba.conf
y cambia la línea:
host all all 127.0.0.1/32 md5
a:
host all all 127.0.0.1/32 scram-sha-256
host all all 10.1.0.0/16 scram-sha-256
(Suponiendo que la red interna sea 10.1.0.0/16).
También hemos cambiado el md5
predeterminado. al nuevo y más seguro scram-sha-256
. Todas las demás apariciones de md5
en el archivo también debe ser reemplazado con scram-sha-256
. Si su aplicación o controlador de base de datos no es compatible con este método, continúe usando el md5
en su lugar.
Para que estos cambios surtan efecto, debe reiniciar el servidor:
sudo systemctl restart postgresql
Creando un usuario regular y una base de datos
¡Ya casi llegamos!
Ahora podemos crear un usuario normal con el que nuestra aplicación pueda conectarse y una base de datos sobre la que tenga control total. Conéctese como superusuario postgres localmente desde la máquina del servidor para hacer esto:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=# SET password_encryption = 'scram-sha-256';
SET
postgres=# CREATE USER alice PASSWORD 's3cr3tp@ss';
CREATE ROLE
postgres=#
(Omita el primer comando si desea usar md5
en su lugar.) Esto creó un usuario llamado alice con la contraseña s3cr3tp@ss . También vamos a crear una base de datos de la que será propietario este usuario:
postgres=# CREATE DATABASE app1 OWNER alice;
CREATE DATABASE
postgres=#
La base de datos se llama app1 . Desde alicia posee esta base de datos, todas las operaciones dentro de la base de datos (como crear tablas, insertar filas) están permitidas si la aplicación se conecta como el usuario alice .
Intentemos conectarnos como alice , a través de la red:
~$ psql -h 10.1.2.3 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app1=>
¡Frio! Ahora estamos conectados a la base de datos app1 como el usuario alice .
Eliminación de bases de datos, copia de seguridad y restauración
Aquí hay algunos trucos que pueden ayudarlo a medida que continúa trabajando con su servidor de Postgres:
Eliminar una base de datos
Puede eliminar la base de datos que acaba de crear ("app1"), así:
alice@ubu:~$ psql -h 127.0.0.1 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app1=> \c postgres
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
You are now connected to database "postgres" as user "alice".
postgres=> DROP DATABASE app1;
DROP DATABASE
postgres=>
Tenga en cuenta que primero debe cambiar a otra base de datos usando el comando "\c" de psql.
Para crear otra base de datos o recrear app1 , conéctese como superusuario y haga “CREATE DATABASE” como antes.
Copia de seguridad de la base de datos
La forma más fácil de hacer una copia de seguridad de los datos en su base de datos es usar pg_dump así:
alice@ubu:~$ pg_dump -h 127.0.0.1 -U alice -f backup.sql app1
Password:
Esto crea un archivo SQL llamado "backup.sql" que contiene todos los comandos SQL necesarios para recrear el esquema y los datos en la base de datos app1 , en formato de texto. Puede ejecutar estos comandos en cualquier base de datos, y el esquema y los datos se rellenarán en esa base de datos.
Lea más sobre pg_dump aquí.
Restauración de datos
El archivo de comandos SQL que creó anteriormente se puede restaurar así:
alice@ubu:~$ psql -h 127.0.0.1 -U alice app2
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app2=> \i backup.sql
SET
SET
(..snip..)
Tenga en cuenta que restauramos el esquema y los datos en otra base de datos, app2 . El comando “\i” de psql le permite ejecutar los comandos SQL desde un archivo.
Pasos siguientes
Hay una gran cantidad de artículos, tutoriales, videos y cursos para ayudarlo a ser más competente con PostgreSQL. Dedique algún tiempo, sin embargo, a la documentación oficial aquí, que brinda una cobertura autorizada y extensa de todas las funciones, la sintaxis y las utilidades incluidas de PostgreSQL.