sql >> Base de Datos >  >> RDS >> PostgreSQL

Primeros pasos con Postgres 13 en Ubuntu 20.04

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.