pg_ctl
est un utilitaire très utile mais sous-estimé qui peut faciliter la vie des équipes de développement. Lisez la suite pour en savoir plus sur pg_ctl
et comment il peut améliorer vos workflows de développement et de test.
Qu'est-ce que pg_ctl ?
pg_ctl est un outil en ligne de commande inclus dans la distribution standard de Postgres. Il est disponible partout où Postgres lui-même est, similaire aux autres outils inclus comme psql et pg_dump .
L'exécutable sera dans le même répertoire que les autres binaires Postgres. L'emplacement exact varie selon la distribution Linux et la version de Postgres :
# debain, ubuntu, ...
/usr/lib/postgresql/11/bin
# rhel, centos, ...
/usr/pgsql-11/bin
Vous voudrez peut-être ajouter ce répertoire à votre PATH, ou alias pg_ctl au chemin complet.
Créer un cluster de bases de données
Contrairement à d'autres SGBDR, un seul processus de serveur de base de données Postgres (historiquement appelé le postmaster ), gère un cluster de bases de données . L'utilisation du termecluster n'est pas moderne et ne fait pas référence à un groupe de nœuds en réseau. Un cluster de bases de données héberge un ensemble de bases de données, avec certaines fonctionnalités (rôles, réplication physique, fichiers WAL, etc.) communes à toutes. Le service Postgressystemd qui est installé par votre distribution Linux sert un seul cluster de base de données.
Vous pouvez utiliser pg_ctl
pour créer un cluster de base de données. A sa création, le cluster vit entièrement dans un seul répertoire. Il contient tous les fichiers de configuration nécessaires (postgres.conf , pg_hba.conf , etc.) et des fichiers de données. Il est autonome et peut être déplacé vers une autre machine raisonnablement similaire si les autorisations de fichiers sont correctement gérées. Vous pouvez même placer des fichiers journaux dans le répertoire, de sorte que vous disposiez de tous les fichiers associés (configuration, données, journaux) au même endroit.
Pour créer un cluster de base de données, utilisez :
$ pg_ctl -D myclus initdb
Cela crée un répertoire appelé myclus sous le répertoire courant, et le remplit avec tous les fichiers nécessaires pour démarrer un serveur à partir de celui-ci.
Voici un exemple de session :
$ 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
Démarrer un serveur de base de données
Un "serveur Postgres" est essentiellement un postmaster processus démarré avec l'emplacement d'un répertoire de cluster de bases de données. Ce processus postmaster génère plusieurs processus qui effectuent diverses activités en arrière-plan et gèrent les connexions entrantes. Vous pouvez voir ce modèle de processus en action en visualisant l'arborescence des processus du système à l'aide d'un outil comme htop, par exemple.
Pour démarrer un processus postmaster pour votre nouveau cluster de base de données, utilisez :
$ pg_ctl -D myclus -l myclus/log start
Le -l
L'option spécifie l'emplacement du fichier journal Postgres, qui dans ce cas se trouve dans le répertoire du cluster lui-même. Il n'est pas rare de placer le fichier journal dans le répertoire du cluster.
Vous devriez voir une sortie comme celle-ci :
waiting for server to start.... done
server started
Le rechargement, le redémarrage et l'arrêt se déroulent comme prévu :
$ 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
Vous devriez maintenant pouvoir vous connecter à ce nouveau cluster en utilisant des clients comme psql et pgAdmin .
Configuration du port et d'autres options
Pratiquement cependant, si vous avez déjà installé Postgres sur votre machine, vous devrez probablement modifier myclus/postgres.conf
et modifiez les valeurs de port , unix_socket_directories et peut-être aussi listen_address avant que le cluster ne démarre proprement. En effet, le service Postgres installé sur le système s'exécute déjà sur le port 5432 et les répertoires dans unix_socket_directories ne peut pas être écrit par un utilisateur régulier. L'adresse_d'écoute par défaut est localhost, ce qui signifie que vous ne pourrez pas vous connecter au cluster depuis l'extérieur de localhost.
Si vous utilisez pg_ctl pour créer et supprimer des clusters dans vos scripts de test automatisés, il est plus facile de spécifier ces options directement à partir de la ligne de commande plutôt que de modifier par programme myclus/postgres.conf
.Vous pouvez spécifier les options comme ceci :
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i" start
Cela démarre le serveur sur le port 6000, avec le socket unix créé dans le répertoire /tmp et à l'écoute sur toutes les interfaces.
Vous devez spécifier ces options uniquement pour "démarrer", vous pouvez les omettre pour d'autres commandes, y compris même "redémarrer".
Autres options de démarrage utiles
Il existe quelques autres options que vous pouvez utiliser à l'intérieur de "-o" qui pourraient être utiles :
-F
désactive fsync, utile pour terminer plus rapidement les scripts de test-B shared_bufffers
définir la valeur de shared_buffers , exemple-B 100MB
-c conf_var=value
définir n'importe quelle valeur de configuration, exemple-c wal_level=logical
Voici un exemple avec certains de ces ensembles :
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i -B 100MB -c wal_level=logical" start
Ces options sont en fait les options de ligne de commande de postgres processus, dont la liste complète est documentée ici.
Exécuter la base de données d'une autre version de Postgres
EnterpriseDB héberge des fichiers binaires pré-construits pour différentes versions de Postgres pour différentes plates-formes. Ce sont des archives tar sans aucun programme d'installation.
Prenez l'archive que vous voulez, décompressez-la, localisez le pg_ctl
binaire avec, et utilisez-le pour créer un cluster. pg_ctl
trouvera automatiquement les fichiers binaires initdb/postgres/autres associés dont il a besoin pour créer/démarrer le cluster.
Vous pouvez l'utiliser indépendamment de toute installation PostgreSQL existante sur la machine.
Créer des services sur Windows
pg_ctl
est disponible sur toutes les plateformes, y compris MacOS et Windows. En particulier, vous pouvez l'utiliser pour créer facilement un service qui peut être démarré et arrêté via le Service Control Manager (SCM). Pour créer un service, utilisez :
pg_ctl -D myclus -N myclus_service register
Cela crée un service de démarrage automatique appelé "myclus_service".
Cette fonctionnalité est disponible uniquement dans Postgres v10 et supérieur.