16.3. Lancer le serveur de bases de données

Avant qu'une personne ait accès à la base de données, vous devez démarrer le serveur de bases de données. Le programme serveur est appelé postmaster.. Le postmaster doit savoir où trouver les données qu'il est supposé utiliser. Ceci se fait avec l'option -D. Du coup, la façon la plus simple de lancer le serveur est :

$ postmaster -D /usr/local/pgsql/data

qui laissera le serveur s'exécuter en avant plan. Pour cela, vous devez être connecté en utilisant le compte de l'utilisateur PostgreSQL. Sans -D, le serveur essaiera d'utiliser le répertoire de données proposé par la variable d'environnement PGDATA. Si aucun des deux ne réussit, le lancement échouera.

Pour lancer postmaster en tâche de fond, utilisez la syntaxe shell habituelle :

$ postmaster -D /usr/local/pgsql/data >logfile 2>&1 &

Il est important de sauvegarder les sorties stdout et stderr du serveur quelque part, comme montré ci-dessus. Cela vous aidera dans des buts d'audits ou pour diagnostiquer des problèmes. (Voir Section 21.3 pour une discussion plus détaillée de la gestion de journaux de trace.)

Le postmaster prend aussi un certain nombre d'autres options en ligne de commande. Pour plus d'informations, voir la page de référence ainsi que Section 16.4 ci-dessous. En particuler, pour que le serveur accepte des connexions TCP/IP (plutôt que de simples sockets de domaine Unix), vous devez ajouter l'option -i.

Cette syntaxe shell peut rapidement devenir ennuyante. Donc, un emballage en script shell pg_ctl est fourni pour simplifier certaines tâches. Par exemple :

pg_ctl start -l journaux_trace

lancera le serveur en tâche de fond et placera les sorties dans le journal de trace indiqué. L'option -D a la même signification ici qu'avec postmaster. pg_ctl est aussi capable d'arrêter le serveur.

Normalement, vous lancerez le serveur de bases de données lors du démarrage de l'ordinateur. Les scripts de lancement automatique sont spécifiques au système d'exploitation. Certains sont distribués avec PostgreSQL dans le répertoire contrib/start-scripts. Ils pourraient nécessiter les droits de root.

Différents systèmes ont différentes conventions pour lancer les démons au démarrage. La plupart des systèmes ont un fichier /etc/rc.local ou /etc/rc.d/rc.local. D'autres utilisent les répertoires rc.d. Quoi que vous fassiez, le serveur doit être exécuté par le compte utilisateur PostgreSQL et non pas par root ou tout autre utilisateur. Donc, vous devriez probablement former vos commandes en utilisant su -c '...' postgres. Par exemple :

su -c 'pg_ctl start -D /usr/local/pgsql/data -l serverlog' postgres

Voici quelques suggestions supplémentaires par système d'exploitation. (Toujours les replacer dans le bon répertoire d'installation et le bon nom de l'utilisateur.)

Tant que postmaster est lancé, son PID est stocké dans le fichier postmaster.pid du répertoire de données. C'est utilisé pour empêcher les nombreux processus postmaster d'être exécuté dans le même répertoire de données et peut aussi être utilisé pour arrêter le processus postmaster.

16.3.1. Échecs de lancement

Il existe de nombreuses raisons habituelles pour lesquelles le serveur échouerait au lancement. Vérifiez le journal des traces du serveur ou lancez-le manuellement (sans redirection des sorties standard et d'erreur) et regardez les messages d'erreurs qui apparaissent. Nous en expliquons certains ci-dessous parmi les messages d'erreurs les plus communs.

LOG:  could not bind IPv4 socket: Address already in use
HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
FATAL:  could not create TCP/IP listen socket

Ceci signifie seulement ce que cela suggère : vous avez essayé de lancer un autre postmaster sur le même port où un autre est en cours d'exécution. Néanmoins, si le message d'erreur du noyau n'est pas Address already in use ou une quelconque variante, il pourrait y avoir un autre problème. Par exemple, essayer de lancer un postmaster sur un numéro de port réservé pourrait avoir ce résultat :

$ postmaster -i -p 666
LOG:  could not bind IPv4 socket: Permission denied
HINT:  Is another postmaster already running on port 666? If not, wait a few seconds and retry.
FATAL:  could not create TCP/IP listen socket

Un message du type

FATAL:  could not create shared memory segment: Invalid argument
DETAIL:  Failed system call was shmget(key=5440001, size=4011376640, 03600).

signifie probablement que les limites de votre noyau sur la taille de la mémoire partagée est plus petite que l'aire de fonctionnement que PostgreSQL essaie de créer (4011376640 octets dans cet exemple). Ou il pourrait signifier que vous n'avez pas du tout configuré le support de la mémoire partagée de type System-V dans votre noyau. Comme contournement temporaire, vous pouvez essayer de lancer le serveur avec un nombre de tampons plus petit que la normale (option -B). Vous voudrez éventuellement reconfigurer votre noyau pour accroître la taille de mémoire partagée autorisée. Vous pourriez voir aussi ce message en essayant de lancer plusieurs serveurs sur la même machine si le total de l'espace qu'ils requièrent dépasse la limite du noyau.

Une erreur du type

FATAL:  could not create semaphores: No space left on device
DETAIL:  Failed system call was semget(5440126, 17, 03600).

ne signifie pas qu'il vous manque de l'espace disque. Elle signifie que la limite de votre noyau sur le nombre de sémaphores System V est inférieur au nombre que PostgreSQL veut créer. Comme ci-dessus, vous pourriez contourner le problème en lançant le serveur avec un nombre réduit de connexions autorisées (option -N) mais vous voudrez éventuellement augmenter la limite du noyau.

Si vous obtenez une erreur << illegal system call >>, il est probable que la mémoire partagée ou les sémaphores ne sont pas du tout supportés par votre noyau. Dans ce cas, votre seule option est de reconfigurer le noyau pour activer ces fonctionnalités.

Des détails sur la configuration des capacités IPC System V sont donnés dans la Section 16.5.1.

16.3.2. Problèmes de connexion du client

Bien que les conditions d'erreurs possibles du côté client sont assez variées et dépendantes de l'application, certaines pourraient être en relation direct avec la façon dont le serveur a été lancé. Les conditions autres que celles montrées ici devraient être documentées avec l'application client respective.

psql: could not connect to server: Connection refused
        Is the server running on host "server.joe.com" and accepting
        TCP/IP connections on port 5432?

Ceci est l'échec générique << Je n'ai pas trouvé de serveur à qui parler >>. Cela ressemble au message ci-dessus lorsqu'une connexion TCP/IP est tentée. Une erreur commune est d'oublier de configurer le serveur pour qu'il autorise les connexions TCP/IP.

Autrement, vous obtiendrez ceci en essayant une communication de type socket de domaine Unix vers un serveur local :

psql: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

La dernière ligne est utile pour vérifier si le client essaie de se connecter au bon endroit. Si aucun serveur n'est exécuté ici, le message d'erreur du noyau sera typiquement soit Connection refused soit No such file or directory, comme ce qui est illustré (il est important de réaliser que Connection refused, dans ce contexte, ne signifie pas que le serveur a obtenu une demande de connexion et l'a refusé. Ce cas produira un message différent comme indiqué dans la Section 19.3). D'autres messages d'erreurs tel que Connection timed out pourraient indiquer des problèmes plus fondamentaux comme un manque de connexion réseau.