Installation
depuis les paquets binaires du PGDG (Rocky Linux)
Pré-installation
Quelle commande permet d’installer les paquets binaires de
PostgreSQL ?
Le présent TP utilise Rocky Linux en version 8 ou 9. C’est une
distribution communautaire qui se veut succéder au projet CentOS, clone de
Red Hat, interrompu en 2021 .
(Une version plus complète, ainsi que l’utilisation de paquets
Debian, sont traités dans l’annexe « Installation de PostgreSQL depuis
les paquets communautaires ».)
Quelle version est packagée ?
La dernière version stable de PostgreSQL disponible au moment de la
rédaction de ces lignes est la 17.0. Par contre, la dernière version
disponible dans les dépôts dépend de votre distribution. C’est la raison
pour laquelle les dépôts du PGDG sont à
privilégier .
Quels paquets devront également être installés ?
Le paquet libpq
doit également être installé. Il est
aussi nécessaire d’installer les paquets llvmjit
(pour la
compilation à la volée), qui réclame elle-même la présence du dépôt
EPEL, mais c’est une fonctionnalité optionnelle qui ne sera pas traitée
ici.
Installation
Installer le dépôt en vous inspirant des consignes sur :
https://www.postgresql.org/download/linux/redhat
mais en ajoutant les contribs et les sommes de contrôle.
Préciser :
PostgreSQL 17
Red Hat Enterprise, Rocky or Oracle version 8 (ou 9 selon le
cas)
x86_64
Nous allons reprendre ligne à ligne ce script et le compléter.
Se connecter avec l’utilisateur root sur la machine
de formation, et recopier le script proposé par le guide. Dans la
commande ci-dessous, les deux lignes doivent être copiées et
collées ensemble .
# Rocky Linux 8
dnf install -y https://download.postgresql.org\
/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Rocky Linux 9
dnf install -y https://download.postgresql.org\
/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Désactiver le module d’installation pour la version PostgreSQL de la
distribution.
Cette opération est nécessaire pour Rocky Linux 8 ou 9.
dnf -qy module disable postgresql
Installer les paquets de PostgreSQL17 : serveur, client,
contribs.
dnf install -y postgresql17-server postgresql17-contrib
# optionnel
dnf install -y postgresql17-llvmjit
Il s’agit respectivement
des binaires du serveur ;
des « contribs » et extensions optionnelles (mais chaudement
conseillées) ;
et du paquet nécessaire à la compilation à la volée (JIT).
Le paquet postgresql17
(outils client) fait partie des
dépendances et est installé automatiquement.
Quel est le chemin des binaires ?
Ils se trouvent dans /usr/pgsql-17/bin/
(chemin propre à
ces paquets) :
clusterdb
createdb
;
postgres
postgresql-17-check-db-dir
postgresql-17-setup
psql
reindexdb
vacuumdb
vacuumlo
Noter qu’il existe des liens dans /usr/bin
pointant vers
la version la plus récente des outils en cas d’installation de plusieurs
versions :
/usr/bin/psql: symbolic link to /etc/alternatives/pgsql-psql
file /etc/alternatives/pgsql-psql
/etc/alternatives/pgsql-psql: symbolic link to /usr/pgsql-17/bin/psql
Création de la première instance
Créer une première instance avec les outils de la famille Red Hat en
activant les sommes de contrôle (checksums ).
La création d’une instance passe par un outil spécifique à ces paquets.
Cet outil doit être appelé en tant que root (et non
postgres ).
Optionnellement, on peut ajouter des paramètres d’initialisation à
cette étape. La mise en place des sommes de contrôle est généralement
conseillée pour être averti de toute corruption des fichiers.
Toujours en temps que root :
export PGSETUP_INITDB_OPTIONS = "--data-checksums"
/usr/pgsql-17/bin/postgresql-17-setup initdb
Initializing database ... OK
L’export
est nécessaire pour activer les sommes de
contrôle.
Vérifier ce qui a été fait dans le journal
initdb.log
.
La sortie de la commande précédente est redirigée vers le fichier
initdb.log
situé dans le répertoire qui contient celui de
la base (PGDATA
). Il est possible d’y vérifier l’ensemble
des étapes réalisées, notamment l’activation des sommes de contrôle.
$ cat /var/lib/pgsql/17/initdb.log
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.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 enabled.
fixing permissions on existing directory /var/lib/pgsql/17/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default "max_connections" ... 100
selecting default "shared_buffers" ... 128MB
selecting default time zone ... UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
Success. You can now start the database server using:
/usr/pgsql-17/bin/pg_ctl -D /var/lib/pgsql/17/data/ -l logfile start
Ne pas tenir compte de la dernière ligne, qui est une suggestion qui
ne tient pas compte des outils prévus pour cet OS.
Démarrage
Démarrer l’instance.
Attention, si vous avez créé une instance, par exemple à partir des
sources, elle doit impérativement être arrêtée pour pouvoir démarrer la
nouvelle instance ! Elles ne peuvent pas être démarrées en même temps,
sauf à modifier le port dans la configuration de l’une d’entre
elles.
En tant que root :
systemctl start postgresql-17
Si aucune erreur ne s’affiche, tout va bien à priori.
Pour connaître l’état de l’instance :
systemctl status postgresql-17
● postgresql-17.service - PostgreSQL 17 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-17.service; disabled; preset: disabled)
Active: active (running) since Tue 2024-10-15 18:44:08 UTC; 6s ago
Docs: https://www.postgresql.org/docs/17/static/
Process: 72901 ExecStartPre=/usr/pgsql-17/bin/postgresql-17-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 72906 (postgres)
Tasks: 7 (limit: 2676)
Memory: 17.7M
CPU: 37ms
CGroup: /system.slice/postgresql-17.service
├─72906 /usr/pgsql-17/bin/postgres -D /var/lib/pgsql/17/data/
├─72907 "postgres: logger "
├─72908 "postgres: checkpointer "
├─72909 "postgres: background writer "
├─72911 "postgres: walwriter "
├─72912 "postgres: autovacuum launcher "
└─72913 "postgres: logical replication launcher "
Oct 15 18:44:08 rocky9 systemd[1]: Starting PostgreSQL 17 database server...
Oct 15 18:44:08 rocky9 postgres[72906]: 2024-10-15 18:44:08.144 UTC [72906] LOG: redirecting log output to logging collecto>
Oct 15 18:44:08 rocky9 postgres[72906]: 2024-10-15 18:44:08.144 UTC [72906] HINT: Future log output will appear in director>
Oct 15 18:44:08 rocky9 systemd[1]: Started PostgreSQL 17 database server.
Activer le démarrage de l’instance au démarrage de la machine.
Le packaging Red Hat ne prévoie pas l’activation du service au boot,
il faut le demander explicitement :
systemctl enable postgresql-17
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql-17.service → /usr/lib/systemd/system/postgresql-17.service.
Où sont les fichiers de données (PGDATA
), et les traces
de l’instance ?
Les données et fichiers de configuration sont dans
/var/lib/pgsql/17/data/
.
ls -1 /var/lib/pgsql/17/data/
base
current_logfiles
global
log
pg_commit_ts
pg_dynshmem
pg_hba.conf
pg_ident.conf
pg_logical
pg_multixact
pg_notify
pg_replslot
pg_serial
pg_snapshots
pg_stat
pg_stat_tmp
pg_subtrans
pg_tblspc
pg_twophase
PG_VERSION
pg_wal
pg_xact
postgresql.auto.conf
postgresql.conf
postmaster.opts
postmaster.pid
Les traces sont par défaut dans le sous-répertoire log/
du PGDATA.
ls -l /var/lib/pgsql/17/data/log/
total 4
-rw-------. 1 postgres postgres 1092 Oct 15 18:49 postgresql-Tue.log
NB : Dans les paquets RPM, le nom exact du fichier dépend du jour de
la semaine.
Configuration
Vérifier la configuration par défaut de PostgreSQL. Est-ce que le
serveur écoute sur le réseau ?
Il est possible de vérifier dans le fichier
postgresql.conf
que par défaut, le serveur écoute
uniquement l’interface réseau localhost
(la valeur est
commentée car c’est celle par défaut) :
grep listen_addresses /var/lib/pgsql/17/data/postgresql.conf
#listen_addresses = 'localhost' # what IP address(es) to listen on;
Il faudra donc modifier ainsi et rédémarrer pour que des utilisateurs
puissent se connecter depuis d’autres machines :
listen_addresses = '*' # what IP address(es) to listen on;
systemctl restart postgresql-17
Il est aussi possible de vérifier au niveau système en utilisant la
commande netstat
(qui nécessite l’installation du paquet
net-tools
) :
netstat -anp | grep -E '(Active|Proto|postgres)'
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 73049/postgres
tcp6 0 0 :::5432 :::* LISTEN 73049/postgres
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 87790 73049/postgres /run/postgresql/.s.PGSQL.5432
unix 2 [ ACC ] STREAM LISTENING 87791 73049/postgres /tmp/.s.PGSQL.5432
unix 3 [ ] STREAM CONNECTED 88816 73050/postgres: log
…
(La présence de lignes tcp6
dépend de la configuration
de la machine.)
On notera que la socket écoute à deux endroits, dans
/run/postgresql/
et dans /tmp
. C’est un
paramétrage par défaut lié aux paquets RPM.
Quel est l’utilisateur sous lequel tourne l’instance ?
C’est l’utilisateur nommé postgres :
ps -U postgres -f -o pid,user,cmd
PID USER CMD
PID USER CMD
73049 postgres /usr/pgsql-17/bin/postgres -D /var/lib/pgsql/17/data/
73050 postgres \_ postgres: logger
73051 postgres \_ postgres: checkpointer
73052 postgres \_ postgres: background writer
73054 postgres \_ postgres: walwriter
73055 postgres \_ postgres: autovacuum launcher
73056 postgres \_ postgres: logical replication launcher
Il possède aussi le PGDATA :
total 8
drwx------. 2 postgres postgres 6 Sep 26 20:10 backups
drwx------. 20 postgres postgres 4096 Oct 15 19:29 data
-rw-------. 1 postgres postgres 914 Oct 15 18:41 initdb.log
postgres est le nom traditionnel sur la plupart des
distributions, mais il n’est pas obligatoire (par exemple, le TP par
compilation utilise un autre utilisateur).
Connexion
En tant que root , tenter une connexion avec
psql
.
psql: error: connection to server on socket "/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "root" does not exist
Cela échoue car psql
tente de se connecter avec
l’utilisateur système en cours, soit root . Ça ne
marchera pas mieux cependant en essayant de se connecter avec
l’utilisateur postgres :
psql: error: connection to server on socket "/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "postgres"
En effet, le pg_hba.conf
est configuré de telle manière
que l’utilisateur de PostgreSQL et celui du système doivent porter le
même nom (connexion peer
ici).
En tant que postgres , tenter une connexion avec
psql
. Quitter.
psql (17.0)
Type "help" for help.
postgres=# exit
La connexion fonctionne donc indirectement depuis tout utilisateur
pouvant effectuer un sudo
.
À quelle base se connecte-t-on par défaut ?
psql (17.0)
Type "help" for help.
postgres=# \conninfo
You are connected to database "postgres" as user "postgres" via socket in "/run/postgresql" at port "5432".
postgres=#
Là encore, la présence d’une base nommée postgres
est
une tradition et non une obligation.
Première base
Créer une première base de données et y créer des tables.
postgres= # CREATE DATABASE test ;
CREATE DATABASE
Alternativement :
sudo -iu postgres createdb test
Se connecter explicitement à la bonne base :
sudo -iu postgres psql -d test
test= # CREATE TABLE mapremieretable (x int );
CREATE TABLE
test= # \d+
Liste des relations
Schéma | Nom | Type | Propriétaire | Taille | Description
--------+-----------------+-------+--------------+---------+-------------
public | mapremieretable | table | postgres | 0 bytes |
Installation à
partir des sources (optionnel)
Outils de compilation
Installer les outils de compilation suivants, si ce n’est déjà
fait.
Ces actions doivent être effectuées en tant qu’utilisateur privilégié
(soit directement en tant que root , soit en utilisant
la commande sudo
).
NB : Ceci a été testé avec PostgreSQL 17 sur Rocky Linux 9 et Debian
12. Des dépendances un peu différentes pourraient apparaître pour
d’autres versions.
Sous Rocky Linux, il faudra utiliser dnf
:
sudo dnf -y group install "Development Tools"
sudo dnf -y install perl readline-devel openssl-devel wget bzip2
Sous Debian ou Ubuntu :
sudo apt install -y build-essential libreadline-dev zlib1g-dev flex bison \
libxml2-dev libxslt-dev libssl-dev pkg-config
Une fois ces outils installés, tout ce qui suit devrait fonctionner
sur toute version de Linux.
Créer l’utilisateur système srcpostgres avec
/opt/pgsql
pour répertoire HOME
.
sudo useradd --home-dir /opt/pgsql --system --create-home srcpostgres
sudo usermod --shell /bin/bash srcpostgres
Se connecter en tant que l’utilisateur
srcpostgres .
Se connecter en tant qu’utilisateur
srcpostgres :
Téléchargement
Télécharger l’archive des fichiers sources de la
dernière version stable depuis postgresql.org.
(Alternative : récupérer la dernière version stable
dans le dépôt git.)
Les placer dans /opt/pgsql/src
.
En tant qu’utilisateur srcpostgres , créer un
répertoire dédié aux sources :
mkdir ~srcpostgres/src
cd ~/src
Aller sur https://postgresql.org ,
cliquer Download et récupérer le lien vers l’archive des
fichiers sources de la dernière version stable (PostgreSQL 17.0 au
moment où ceci est écrit). Il est possible de le faire en ligne de
commande :
wget https://ftp.postgresql.org/pub/source/v17.0/postgresql-17.0.tar.bz2
Il faut décompresser l’archive :
tar xjvf postgresql-17.0.tar.bz2
cd postgresql-17.0
Alternativement, le dépôt git se récupère ainsi :
git clone --branch REL_17_0 --depth 1 \
https://git.postgresql.org/git/postgresql.git postgresql-17.0
cd postgresql-17.0
ou de manière moins économe :
git clone REL_17_0 https://git.postgresql.org/git/postgresql.git
cd postgresql
git checkout REL_17_0
cd postgresql
(Au besoin git tag
liste les versions disponibles.)
Compilation et installation
L’installation des binaires compilés se fera dans
/opt/pgsql/17/
.
Configurer en conséquence l’environnement de compilation
(./configure
).
Compiler PostgreSQL. Ne pas oublier les contribs.
Configuration :
./configure --prefix /opt/pgsql/17
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking which template to use... linux
checking whether NLS is wanted... no
checking for default port number... 5432
…
…
config.status: linking src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking src/makefiles/Makefile.linux to src/Makefile.port
Des fichiers sont générés, notamment le Makefile .
La compilation se lance de manière classique. Elle peut prendre un
certain temps sur les machines un peu anciennes :
make # make -j3 selon le nombre de coeurs
make -C ./src/backend generated-headers
make[1]: Entering directory '/opt/pgsql/postgresql-17.0/src/backend'
make -C ../include/catalog generated-headers
make[2]: Entering directory '/opt/pgsql/postgresql-17.0/src/include/catalog'
…
make[1]: Leaving directory '/opt/pgsql/postgresql-17.0/src'
make -C config all
make[1]: Entering directory '/opt/pgsql/postgresql-17.0/config'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/opt/pgsql/postgresql-17.0/config'
make -C ../src/backend generated-headers
make[1]: Entering directory '/opt/pgsql/postgresql-17.0/src/backend'
make -C ../include/catalog generated-headers
make[2]: Entering directory '/opt/pgsql/postgresql-17.0/src/include/catalog'
…
make[2]: Entering directory '/opt/pgsql/postgresql-17.0/src/backend/nodes'
make[2]: Nothing to be done for 'generated-header-symlinks'.
make[2]: Leaving directory '/opt/pgsql/postgresql-17.0/src/backend/nodes'
Installer les fichiers obtenus.
L’installation peut se faire en tant que srcpostgres
(et non root ) car nous avons défini comme cible le
répertoire /opt/pgsql/17/
qui lui appartient :
cd ~srcpostgres/postgresql-17.0
make install
cd contrib
make install
Dans ce TP, nous nous sommes attachés à changer le moins possible
d’utilisateur système. Il se peut que vous ayez à installer les fichiers
obtenus en tant qu’utilisateur root dans d’autres
environnements en fonction de la politique de sécurité adoptée.
Où se trouvent les binaires installés de PostgreSQL ?
Les binaires installés sont situés dans le répertoire
/opt/pgsql/17/bin
.
clusterdb
createdb
createuser
…
pg_verifybackup
pg_waldump
pg_walsummary
pgbench
postgres
psql
reindexdb
vacuumdb
vacuumlo
Configurer le système
Ajouter les variables d’environnement PATH
et
LD_LIBRARY_PATH
au ~srcpostgres/.bash_profile
de l’utilisateur srcpostgres pour accéder facilement à
ces binaires.
Ajouter les lignes suivantes à la fin du fichier
~srcpostgres/.bash_profile
(ce fichier peut ne pas exister
préalablement, et un autre fichier peut être nécessaire selon
l’environnement utilisé) :
export PGDATA = /opt/pgsql/17/data
export PATH = /opt/pgsql/17/bin:$PATH
export LD_LIBRARY_PATH = /opt/pgsql/17/lib:$LD_LIBRARY_PATH
Il faut ensuite recharger le fichier à l’aide de la commande suivante
(ne pas oublier le point et l’espace au début de la commande) ; ou se
déconnecter et se reconnecter.
. ~srcpostgres/.bash_profile
Vérifier que les chemins sont bons :
Création d’une instance
Avec initdb
, initialiser une instance dans
/opt/pgsql/17/data
en spécifiant postgres
comme nom de super-utilisateur, et en activant les sommes de
contrôle.
$ initdb -D $PGDATA -U postgres --data-checksums
The files belonging to this database system will be owned by user "srcpostgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.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 enabled.
creating directory /opt/pgsql/17/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default "max_connections" ... 100
selecting default "shared_buffers" ... 128MB
selecting default time zone ... UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
initdb: hint: 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:
pg_ctl -D /opt/pgsql/17/data -l logfile start
Démarrer l’instance.
Attention : s’il y a déjà une autre instance sur cette machine et
qu’elle est démarrée, le port 5432 est occupé et votre nouvelle instance
ne pourra pas fonctionner. Arrêter l’autre instance ou modifier le port
5432 d’une des instances.
pg_ctl -D $PGDATA -l $PGDATA /server.log start
waiting for server to start.... done
server started
2024-10-15 17:56:13.354 UTC [69286] LOG: starting PostgreSQL 17.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.4.1 20231218 (Red Hat 11.4.1-3), 64-bit
2024-10-15 17:56:13.354 UTC [69286] LOG: listening on IPv4 address "127.0.0.1", port 5432
2024-10-15 17:56:13.354 UTC [69286] LOG: could not bind IPv6 address "::1": Cannot assign requested address
2024-10-15 17:56:13.358 UTC [69286] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
2024-10-15 17:56:13.362 UTC [69289] LOG: database system was shut down at 2024-10-15 17:54:39 UTC
2024-10-15 17:56:13.364 UTC [69286] LOG: database system is ready to accept connections
Tenter une première connexion avec
psql
.
Pourquoi cela échoue-t-il ?
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: role "srcpostgres" does not exist
Par défaut, psql
demande à se connecter avec un nom
d’utilisateur (au sens PostgreSQL) identique à l’utilisateur système en
cours, mais la base de données ne connaît pas d’utilisateur
srcpostgres . Par défaut, elle ne connaît que
postgres .
Se connecter en tant qu’utilisateur postgres .
Ressortir.
psql (17.0)
Type "help" for help.
postgres=# exit
Noter que la connexion fonctionne parce que le
pg_hba.conf
livré avec les sources est par défaut très
laxiste (méthode trust
en local et via
localhost
!). (Il y a d’ailleurs eu un avertissement lors
de la création de la base.)
Dans .bash_profile
, configurer la variable
d’environnement PGUSER
pour se connecter toujours en tant
que postgres . Retester la connextion directe avec
psql
.
Ajouter ceci à la fin du fichier
~srcpostgres/.bash_profile
:
Et recharger le fichier à l’aide de la commande suivante (ne pas
oublier le point et l’espace au début de la commande) :
La connexion doit fonctionner sur le champ :
psql (17.0)
Type "help" for help.
postgres=# \conninfo
You are connected to database "postgres" as user "postgres" via socket in "/tmp" at port "5432"
postgres=#
\q
Première base
Créer une première base de donnée nommée test
.
En ligne de commande shell :
SELECT pg_catalog.set_config('search_path', '', false);
CREATE DATABASE test;
Alternativement, depuis psql
:
postgres= # CREATE DATABASE test ;
CREATE DATABASE
Se connecter à la base test
et créer quelques
tables.
test= # CREATE TABLE premieretable (x int ) ;
CREATE TABLE
Arrêt
Arrêter cette instance.
waiting for server to shut down.... done
server stopped
2024-10-15 18:00:33.830 UTC [69286] LOG: received fast shutdown request
2024-10-15 18:00:33.835 UTC [69286] LOG: aborting any active transactions
2024-10-15 18:00:33.836 UTC [69286] LOG: background worker "logical replication launcher" (PID 69292) exited with exit code 1
2024-10-15 18:00:33.837 UTC [69287] LOG: shutting down
2024-10-15 18:00:33.840 UTC [69287] LOG: checkpoint starting: shutdown immediate
2024-10-15 18:00:33.918 UTC [69287] LOG: checkpoint complete: wrote 975 buffers (6.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.036 s, sync=0.032 s, total=0.081 s; sync files=311, longest=0.015 s, average=0.001 s; distance=4585 kB, estimate=4585 kB; lsn=0/1BA9900, redo lsn=0/1BA9900
2024-10-15 18:00:33.924 UTC [69286] LOG: database system is shut down
L’installation est détaillée ici pour Rocky Linux 8 et 9 (similaire à
Red Hat et à d’autres variantes comem Oracle Linux et Fedora), et
Debian/Ubuntu.
Elle ne dure que quelques minutes.
Sur Rocky Linux 8 ou 9
ATTENTION : Red Hat, CentOS, Rocky Linux fournissent
souvent par défaut des versions de PostgreSQL qui ne sont plus
supportées. Ne jamais installer les packages postgresql
,
postgresql-client
et postgresql-server
!
L’utilisation des dépôts du PGDG est fortement conseillée.
Installation du dépôt communautaire :
Les dépôts de la communauté sont sur https://yum.postgresql.org/ . Les
commandes qui suivent sont inspirées de celles générées par l’assistant
sur https://www.postgresql.org/download/linux/redhat/ ,
en précisant :
la version majeure de PostgreSQL (ici la 17) ;
la distribution (ici Rocky Linux 8) ;
l’architecture (ici x86_64, la plus courante).
Les commandes sont à lancer sous root :
# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms\
/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# dnf -qy module disable postgresql
Installation de PostgreSQL 17 (client, serveur, librairies,
extensions) :
# dnf install -y postgresql17-server postgresql17-contrib
Les outils clients et les librairies nécessaires seront
automatiquement installés.
Une fonctionnalité avancée optionnelle, le JIT (Just In Time
compilation ), nécessite un paquet séparé.
# dnf install postgresql17-llvmjit
Création d’une première instance :
Il est conseillé de déclarer PG_SETUP_INITDB_OPTIONS
,
notamment pour mettre en place les sommes de contrôle et forcer les
traces en anglais :
# export PGSETUP_INITDB_OPTIONS='--data-checksums --lc-messages=C'
# /usr/pgsql-17/bin/postgresql-17-setup initdb
# cat /var/lib/pgsql/17/initdb.log
Ce dernier fichier permet de vérifier que tout s’est bien passé et
doit finir par :
Success. You can now start the database server using:
/usr/pgsql-17/bin/pg_ctl -D /var/lib/pgsql/17/data/ -l logfile start
Chemins :
Binaires
/usr/pgsql-17/bin
Répertoire de l’utilisateur
postgres
/var/lib/pgsql
PGDATA
par défaut
/var/lib/pgsql/17/data
Fichiers de configuration
dans PGDATA/
Traces
dans PGDATA/log
Configuration :
Modifier postgresql.conf
est facultatif pour un premier
lancement.
Commandes d’administration habituelles :
Démarrage, arrêt, statut, rechargement à chaud de la configuration,
redémarrage :
# systemctl start postgresql-17
# systemctl stop postgresql-17
# systemctl status postgresql-17
# systemctl reload postgresql-17
# systemctl restart postgresql-17
Test rapide de bon fonctionnement et connexion à
psql :
# systemctl --all |grep postgres
# sudo -iu postgres psql
Démarrage de l’instance au lancement du système
d’exploitation :
# systemctl enable postgresql-17
Ouverture du firewall pour le port 5432
:
Voir si le firewall est actif :
# systemctl status firewalld
Si c’est le cas, autoriser un accès extérieur :
# firewall-cmd --zone=public --add-port=5432/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
(Rappelons que listen_addresses
doit être également
modifié dans postgresql.conf
.)
Création d’autres instances :
Si des instances de versions majeures différentes doivent
être installées, il faut d’abord installer les binaires pour chacune
(adapter le numéro dans dnf install …
) et appeler le script
d’installation de chaque version. l’instance par défaut de chaque
version vivra dans un sous-répertoire numéroté de
/var/lib/pgsql
automatiquement créé à l’installation. Il
faudra juste modifier les ports dans les postgresql.conf
pour que les instances puissent tourner simultanément.
Si plusieurs instances d’une même version majeure (forcément
de la même version mineure) doivent cohabiter sur le même serveur, il
faut les installer dans des PGDATA
différents.
Ne pas utiliser de tiret dans le nom d’une instance (problèmes
potentiels avec systemd).
Respecter les normes et conventions de l’OS : placer les instances
dans un nouveau sous-répertoire de /var/lib/pgsqsl/17/
(ou
l’équivalent pour d’autres versions majeures).
Pour créer une seconde instance, nommée par exemple
infocentre :
Création du fichier service de la deuxième instance :
# cp /lib/systemd/system/postgresql-17.service \
/etc/systemd/system/postgresql-17-infocentre.service
Modification de ce dernier fichier avec le nouveau chemin :
Environment = PGDATA=/var/lib/pgsql/17/infocentre
Option 1 : création d’une nouvelle instance vierge :
# export PGSETUP_INITDB_OPTIONS='--data-checksums --lc-messages=C'
# /usr/pgsql-17/bin/postgresql-17-setup initdb postgresql-17-infocentre
Option 2 : restauration d’une sauvegarde : la procédure dépend de
votre outil.
Adaptation de
/var/lib/pgsql/17/infocentre/postgresql.conf
(port
surtout).
Commandes de maintenance de cette instance :
# systemctl [start|stop|reload|status] postgresql-17-infocentre
# systemctl [enable|disable] postgresql-17-infocentre
Ouvrir le nouveau port dans le firewall au besoin.
Sur Debian / Ubuntu
Sauf précision, tout est à effectuer en tant qu’utilisateur
root .
Référence : https://apt.postgresql.org/
Installation du dépôt communautaire :
L’installation des dépôts du PGDG est prévue dans le paquet Debian
:
# apt update
# apt install -y gnupg2 postgresql-common
# /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
Ce dernier ordre créera le fichier du dépôt
/etc/apt/sources.list.d/pgdg.list
adapté à la distribution
en place.
Installation de PostgreSQL 17 :
La méthode la plus propre consiste à modifier la configuration par
défaut avant l’installation :
Dans /etc/postgresql-common/createcluster.conf
,
paramétrer au moins les sommes de contrôle et les traces en
anglais :
initdb_options = '--data-checksums --lc-messages=C'
Puis installer les paquets serveur et clients et leurs
dépendances :
# apt install postgresql-17 postgresql-client-17
La première instance est automatiquement créée, démarrée et déclarée
comme service à lancer au démarrage du système. Elle porte un nom (par
défaut main
).
Elle est immédiatement accessible par l’utilisateur système
postgres .
Chemins :
Binaires
/usr/lib/postgresql/17/bin/
Répertoire de l’utilisateur
postgres
/var/lib/postgresql
PGDATA de l’instance par défaut
/var/lib/postgresql/17/main
Fichiers de configuration
dans
/etc/postgresql/17/main/
Traces
dans
/var/log/postgresql/
Configuration
Modifier postgresql.conf
est facultatif pour un premier
essai.
Démarrage/arrêt de l’instance, rechargement de
configuration :
Debian fournit ses propres outils, qui demandent en paramètre la
version et le nom de l’instance :
# pg_ctlcluster 17 main [start|stop|reload|status|restart]
Démarrage de l’instance avec le serveur :
C’est en place par défaut, et modifiable dans
/etc/postgresql/17/main/start.conf
.
Ouverture du firewall :
Debian et Ubuntu n’installent pas de firewall par défaut.
Statut des instances du serveur :
Test rapide de bon fonctionnement et connexion à
psql :
# systemctl --all |grep postgres
# sudo -iu postgres psql
Destruction d’une instance :
Création d’autres instances :
Ce qui suit est valable pour remplacer l’instance par défaut par une
autre, par exemple pour mettre les checksums en place :
optionnellement,
/etc/postgresql-common/createcluster.conf
permet de mettre
en place tout d’entrée les checksums , les messages en anglais,
le format des traces ou un emplacement séparé pour les journaux :
initdb_options = '--data-checksums --lc-messages=C'
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
waldir = '/var/lib/postgresql/wal/%v/%c/pg_wal'
# pg_createcluster 17 infocentre
Il est également possible de préciser certains paramètres du fichier
postgresql.conf
, voire les chemins des fichiers (il est
conseillé de conserver les chemins par défaut) :
# pg_createcluster 17 infocentre \
--port=12345 \
--datadir=/PGDATA/17/infocentre \
--pgoption shared_buffers='8GB' --pgoption work_mem='50MB' \
-- --data-checksums --waldir=/ssd/postgresql/17/infocentre/journaux
# pg_ctlcluster 17 infocentre start
Accès
à l’instance depuis le serveur même (toutes distributions)
Par défaut, l’instance n’est accessible que par l’utilisateur système
postgres , qui n’a pas de mot de passe. Un détour par
sudo
est nécessaire :
$ sudo -iu postgres psql
psql (17.0)
Type "help" for help.
postgres=#
Ce qui suit permet la connexion directement depuis un utilisateur du
système :
Pour des tests (pas en production !), il suffit de passer à
trust
le type de la connexion en local dans le
pg_hba.conf
:
local all postgres trust
La connexion en tant qu’utilisateur postgres
(ou tout
autre) n’est alors plus sécurisée :
dalibo:~$ psql -U postgres
psql (17.0)
Type "help" for help.
postgres=#
Une authentification par mot de passe est plus sécurisée :
dans pg_hba.conf
, paramétrer une authentification par
mot de passe pour les accès depuis localhost
(déjà en place
sous Debian) :
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
(Ne pas oublier de recharger la configuration en cas de
modification.)
ajouter un mot de passe à l’utilisateur postgres
de
l’instance :
dalibo:~$ sudo -iu postgres psql
psql (17.0)
Type "help" for help.
postgres=# \password
Enter new password for user "postgres":
Enter it again:
postgres=# quit
dalibo:~$ psql -h localhost -U postgres
Password for user postgres:
psql (17.0)
Type "help" for help.
postgres=#
Pour se connecter sans taper le mot de passe à une instance, un
fichier .pgpass
dans le répertoire personnel doit contenir
les informations sur cette connexion :
localhost:5432:*:postgres:motdepassetrèslong
Ce fichier doit être protégé des autres utilisateurs :
Pour n’avoir à taper que psql
, on peut définir ces
variables d’environnement dans la session voire dans
~/.bashrc
:
export PGUSER = postgres
export PGDATABASE = postgres
export PGHOST = localhost
Rappels :
en cas de problème, consulter les traces (dans
/var/lib/pgsql/17/data/log
ou
/var/log/postgresql/
) ;
toute modification de pg_hba.conf
ou
postgresql.conf
impliquant de recharger la configuration
peut être réalisée par une de ces trois méthodes en fonction du
système :
root:~# systemctl reload postgresql-17
root:~# pg_ctlcluster 17 main reload
postgres:~$ psql -c 'SELECT pg_reload_conf()'