pg_ctl
es una utilidad muy útil pero subestimada que puede facilitar la vida de los equipos de desarrollo. Siga leyendo para obtener más información sobre pg_ctl
y cómo puede mejorar sus flujos de trabajo de desarrollo y prueba.
¿Qué es pg_ctl?
pg_ctl es una herramienta de línea de comandos incluida en la distribución estándar de Postgres. Está disponible en todos los lugares donde se encuentra Postgres, similar a las otras herramientas incluidas como psql y pg_dump .
El ejecutable estará en el mismo directorio que los otros binarios de Postgres. La ubicación exacta varía según la distribución de Linux y la versión de Postgres:
# debain, ubuntu, ...
/usr/lib/postgresql/11/bin
# rhel, centos, ...
/usr/pgsql-11/bin
Es posible que desee agregar este directorio a su RUTA, o alias pg_ctl a la ruta completa.
Crear un clúster de base de datos
A diferencia de otros RDBMS, un solo proceso de servidor de base de datos de Postgres (históricamente denominado postmaster ), administra un clúster de base de datos . El uso del término clúster no es moderno y no se refiere a un grupo de nodos en red. Un clúster de base de datos aloja un conjunto de bases de datos, con algunas características (roles, replicación física, archivos WAL, etc.) comunes a todas ellas. El servicio Postgressystemd que instala su distribución de Linux sirve a un clúster de base de datos único.
Puedes usar pg_ctl
para crear un clúster de base de datos. En la creación, el clúster vive completamente dentro de un solo directorio. Contiene todos los archivos de configuración necesarios (postgres.conf , pg_hba.conf , etc.) y archivos de datos. Es autónomo y se puede mover a otra máquina razonablemente similar si los permisos de archivo se manejan correctamente. Incluso puede colocar archivos de registro dentro del directorio, de modo que tenga todos los archivos relacionados (configuración, datos, registros) en un solo lugar.
Para crear un clúster de base de datos, utilice:
$ pg_ctl -D myclus initdb
Esto crea un directorio llamado myclus en el directorio actual y lo rellena con todos los archivos necesarios para iniciar un servidor desde él.
Aquí hay una sesión de muestra:
$ pg_ctl -D myclus initdb
The files belonging to this database system will be owned by user "alice".
This user must also own the server process.
The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
creating directory myclus ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default timezone ... Etc/UTC
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
/usr/lib/postgresql/11/bin/pg_ctl -D myclus -l logfile start
Iniciar un servidor de base de datos
Un "servidor de Postgres" es básicamente un postmaster proceso que se inicia con la ubicación de un directorio de clúster de base de datos. Este proceso postmaster, a su vez, genera múltiples procesos que realizan varias actividades en segundo plano, así como también manejan las conexiones entrantes. Puede ver este modelo de proceso en acción al ver el árbol de procesos del sistema usando una herramienta como htop, por ejemplo.
Para iniciar un proceso de postmaster para su nuevo clúster de base de datos, use:
$ pg_ctl -D myclus -l myclus/log start
El -l
La opción especifica la ubicación del archivo de registro de Postgres, que en este caso se encuentra dentro del propio directorio del clúster. No es raro colocar el archivo de registro dentro del directorio del clúster.
Debería ver una salida como esta:
waiting for server to start.... done
server started
La recarga, el reinicio y la detención suceden como era de esperar:
$ pg_ctl -D myclus -l myclus/log reload
server signaled
$ pg_ctl -D myclus -l myclus/log restart
waiting for server to shut down.... done
server stopped
waiting for server to start.... done
server started
$ pg_ctl -D myclus -l myclus/log stop
waiting for server to shut down.... done
server stopped
Ahora debería poder conectarse a este nuevo clúster usando clientes como psql y pgAdmin .
Configurar puerto y otras opciones
Sin embargo, en la práctica, si ya tiene Postgres instalado en su máquina, probablemente necesitará editar myclus/postgres.conf
y cambiar los valores de puerto , directorios_socket_unix y también quizás listen_address antes de que el clúster se inicie limpiamente. Esto se debe a que el servicio de Postgres instalado en el sistema ya se está ejecutando en el puerto 5432 y los directorios en unix_socket_directories no puede ser escrito por un usuario normal. La dirección de escucha predeterminada es localhost, lo que significa que no podrá conectarse al clúster desde fuera del localhost.
Si está utilizando pg_ctl Para crear y eliminar clústeres en sus scripts de prueba automatizados, es más fácil si puede especificar estas opciones directamente desde la línea de comandos en lugar de editar programáticamente myclus/postgres.conf
.Puedes especificar las opciones así:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i" start
Esto inicia el servidor en el puerto 6000, con el socket Unix creado en el directorio /tmp y escuchar en todas las interfaces.
Debe especificar estas opciones solo para "iniciar", puede omitirlas para otros comandos, incluido incluso "reiniciar".
Otras opciones de inicio útiles
Hay un par de otras opciones que puede usar dentro de "-o" que pueden ser útiles:
-F
deshabilita fsync, útil para completar más rápido los scripts de prueba-B shared_bufffers
establecer el valor de shared_buffers , ejemplo-B 100MB
-c conf_var=value
establecer cualquier valor de configuración, ejemplo-c wal_level=logical
Aquí hay un ejemplo con algunos de estos conjuntos:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i -B 100MB -c wal_level=logical" start
Estas opciones son realmente las opciones de línea de comandos de postgres proceso, cuya lista completa se documenta aquí.
Ejecutar base de datos de una versión diferente de Postgres
EnterpriseDB aloja binarios preconstruidos para varias versiones de Postgres para varias plataformas. Estos son tarballs sin ningún instalador.
Coge el tarball que quieras, descomprímelo, localiza el pg_ctl
binary con él, y utilícelo para crear un clúster. pg_ctl
encontrará automáticamente los archivos binarios initdb/postgres/otros asociados que necesita para crear/iniciar el clúster.
Puede usar esto independientemente e independientemente de cualquier instalación existente de PostgreSQL en la máquina.
Crear servicios en Windows
pg_ctl
está disponible en todas las plataformas, incluidas MacOS y Windows. En particular, puede usarlo para crear fácilmente un servicio que se puede iniciar y detener a través del Administrador de control de servicios (SCM). Para crear un servicio, use:
pg_ctl -D myclus -N myclus_service register
Esto crea un servicio de inicio automático llamado "myclus_service".
Esta función solo está disponible en Postgres v10 y superior.