Installation
depuis les paquets binaires du PGDG
Pré-installation
Quelle commande permet d’installer les paquets binaires de
PostgreSQL ?
Tout dépend de votre distribution. Les systèmes les plus représentés
sont Debian et ses dérivés (notamment Ubuntu), ainsi que Red Hat et
dérivés (CentOS, Rocky Linux).
Le présent TP utilise Rocky Linux 8, basé sur une version
communautaire qui se veut être le successeur du projet CentOS, interrompu
en 2021 . La version 9 fonctionne également. 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 ce module est la version 16.3. 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
devra également être installé. À partir
de la version 11, 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 16
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 PostgreSQL16 : serveur, client,
contribs.
dnf install -y postgresql16-server postgresql16-contrib
Il s’agit respectivement des binaires du serveur et des « contribs »
et extensions (en principe optionnelles, mais chaudement
conseillées).
Le paquet postgresql16
(outils client) fait partie des
dépendances et est installé automatiquement.
On met volontairement de côté le paquet llvmjit
.
Quel est le chemin des binaires ?
Ils se trouvent dans /usr/pgsql-16/bin/
(chemin propre à
ce packaging) :
clusterdb
createdb
...
...
postgres
postgresql-16-check-db-dir
postgresql-16-setup
postmaster
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-16/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-16/bin/postgresql-16-setup initdb
Initializing database ... OK
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/16/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/16/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-16/bin/pg_ctl -D /var/lib/pgsql/16/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 à partir des sources dans
le TP précédent, elle doit impérativement être arrêtée pour pouvoir
démarrer la nouvelle instance !
En effet, comme nous n’avons pas modifié le port par défaut (5432),
les deux instances 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-16
Si aucune erreur ne s’affiche, tout va bien à priori.
Pour connaître l’état de l’instance :
systemctl status postgresql-16
● postgresql-16.service - PostgreSQL 16 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2024-05-14 18:36:33 UTC; 5s ago
Docs: https://www.postgresql.org/docs/16/static/
Process: 68744 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 68749 (postmaster)
Tasks: 7 (limit: 14208)
Memory: 17.5M
CGroup: /system.slice/postgresql-16.service
├─68749 /usr/pgsql-16/bin/postmaster -D /var/lib/pgsql/16/data/
├─68751 postgres: logger
├─68752 postgres: checkpointer
├─68753 postgres: background writer
├─68755 postgres: walwriter
├─68756 postgres: autovacuum launcher
└─68757 postgres: logical replication launcher
Mar 21 18:36:33 vm-formation1 systemd[1]: Starting PostgreSQL 16 database server...
Mar 21 18:36:33 vm-formation1 postmaster[68749]: 2024-05-14 18:36:33.123 UTC [68749] LOG: redirecting log output to logging collector process
Mar 21 18:36:33 vm-formation1 postmaster[68749]: 2024-05-14 18:36:33.123 UTC [68749] HINT: Future log output will appear in directory "log".
Mar 21 18:36:33 vm-formation1 systemd[1]: Started PostgreSQL 16 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-16
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql-16.service → /usr/lib/systemd/system/postgresql-16.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/16/data/
.
ls -1 /var/lib/pgsql/16/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 dans le sous-répertoire log
.
ls -l /var/lib/pgsql/16/data/log/
total 4
-rw-------. 1 postgres postgres 709 Mar 2 10:37 postgresql-Wed.log
NB : Dans les paquets pour Rocky Linux, 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 mais c’est bien celle par défaut) :
$ grep listen_addresses /var/lib/pgsql/16/data/postgresql.conf
#listen_addresses = 'localhost' # what IP address(es) to listen on;
Il faudra donc modifier cela pour que des utilisateurs puissent se
connecter depuis d’autres machines :
listen_addresses = '*' # what IP address(es) to listen on;
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 postmaster
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 28028/postmaster
tcp6 0 0 ::1:5432 :::* LISTEN 28028/postmaster
udp6 0 0 ::1:57123 ::1:57123 ESTABLISHED 28028/postmaster
unix 2 [ ACC ] STREAM LISTENING 301922 28028/postmaster /tmp/.s.PGSQL.5432
unix 2 [ ACC ] STREAM LISTENING 301920 28028/postmaster /var/run/postgresql/.s.PGSQL.5432
(La présence de lignes tcp6
dépend de la configuration
de la machine.)
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
52533 postgres /usr/pgsql-16/bin/postmaster -D /var/lib/pgsql/16/data/
52534 postgres \_ postgres: logger
52535 postgres \_ postgres: checkpointer
52536 postgres \_ postgres: background writer
52538 postgres \_ postgres: walwriter
52539 postgres \_ postgres: autovacuum launcher
52540 postgres \_ postgres: logical replication launcher
Il possède aussi le PGDATA
:
total 8
drwx------. 2 postgres postgres 6 Feb 9 08:13 backups
drwx------. 20 postgres postgres 4096 Mar 4 16:18 data
-rw-------. 1 postgres postgres 910 Mar 2 10:35 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 "/var/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 "/var/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.
En tant que postgres , tenter une connexion avec
psql
. Quitter.
psql (16.3)
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 (16.3)
Type "help" for help.
postgres=# \conninfo
You are connected to database "postgres" as user "postgres" via socket in "/var/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
).
Sous Rocky Linux 8 ou 9, il faudra utiliser dnf
:
sudo dnf -y group install "Development Tools"
sudo dnf -y install 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
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
Consulter le site officiel du projet et relever la
dernière version de PostgreSQL.
Télécharger l’archive des fichiers sources de la
dernière version stable.
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 15.2 au
moment où ceci est écrit). Il est possible de le faire en ligne de
commande :
wget https://ftp.postgresql.org/pub/source/v15.2/postgresql-15.2.tar.bz2
Il faut décompresser l’archive :
tar xjvf postgresql-15.2.tar.bz2
cd postgresql-15.2
Compilation et installation
L’installation des binaires compilés se fera dans
/opt/pgsql/15/
.
Configurer en conséquence l’environnement de compilation
(./configure
).
Compiler PostgreSQL.
Configuration :
./configure --prefix /opt/pgsql/15
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 -C ./src/backend generated-headers
make[1]: Entering directory '/opt/pgsql/postgresql-15.2/src/backend'
make -C catalog distprep generated-header-symlinks
make[2]: Entering directory '/opt/pgsql/postgresql-15.2/src/backend/catalog'
make[2]: Nothing to be done for 'distprep'.
...
...
make[2]: Entering directory '/opt/pgsql/postgresql-15.2/src/test/perl'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/opt/pgsql/postgresql-15.2/src/test/perl'
make[1]: Leaving directory '/opt/pgsql/postgresql-15.2/src'
make -C config all
make[1]: Entering directory '/opt/pgsql/postgresql-15.2/config'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/opt/pgsql/postgresql-15.2/config
Installer les fichiers obtenus.
L’installation peut se faire en tant que srcpostgres
car nous avons défini comme cible le répertoire
/opt/pgsql/15/
qui lui appartient :
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/15/bin
.
clusterdb
createdb
createuser
...
pg_verifybackup
pg_waldump
pgbench
postgres
postmaster
psql
reindexdb
vacuumdb
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/15/data
export PATH = /opt/pgsql/15/bin:$PATH
export LD_LIBRARY_PATH = /opt/pgsql/15/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/15/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/15/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/15/data -l logfile start
Démarrer l’instance.
Attention : si vous avez déjà installé une instance sur cette machine
et qu’elle est démarrée, le port est occupé et votre nouvelle instance
ne pourra pas fonctionner. Arrêter l’autre instance ou modifier le port
5432.
pg_ctl -D $PGDATA -l $PGDATA /server.log start
waiting for server to start.... done
server started
2023-03-21 18:04:22.445 UTC [51123] LOG: starting PostgreSQL 15.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.3.1 20220421 (Red Hat 11.3.1-2), 64-bit
2023-03-21 18:04:22.446 UTC [51123] LOG: listening on IPv4 address "127.0.0.1", port 5432
2023-03-21 18:04:22.446 UTC [51123] LOG: could not bind IPv6 address "::1": Cannot assign requested address
2023-03-21 18:04:22.452 UTC [51123] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
2023-03-21 18:04:22.459 UTC [51126] LOG: database system was shut down at 2023-03-21 18:03:31 UTC
2023-03-21 18:04:22.467 UTC [51123] 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 identique à celui en cours, mais la base de données ne
connaît pas l’utilisateur srcpostgres . Par défaut, elle
ne connaît que postgres .
Se connecter en tant qu’utilisateur postgres .
Ressortir.
psql (15.2)
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) :
. ~srcpostgres/.bash_profile
La connexion doit fonctionner sur le champ :
psql (15.2)
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
2023-03-21 18:06:51.316 UTC [51137] FATAL: role "srcpostgres" does not exist
2023-03-21 18:09:22.559 UTC [51124] LOG: checkpoint starting: time
2023-03-21 18:09:26.696 UTC [51124] LOG: checkpoint complete: wrote 44 buffers (0.3%); 0 WAL file(s) added, 0 removed, 0 recycled; write=4.116 s, sync=0.009 s, total=4.137 s; sync files=11, longest=0.006 s, average=0.001 s; distance=299 kB, estimate=299 kB
2023-03-21 18:14:19.381 UTC [51123] LOG: received fast shutdown request
2023-03-21 18:14:19.400 UTC [51123] LOG: aborting any active transactions
2023-03-21 18:14:19.401 UTC [51123] LOG: background worker "logical replication launcher" (PID 51129) exited with exit code 1
2023-03-21 18:14:19.402 UTC [51124] LOG: shutting down
2023-03-21 18:14:19.404 UTC [51124] LOG: checkpoint starting: shutdown immediate
2023-03-21 18:14:19.496 UTC [51124] LOG: checkpoint complete: wrote 897 buffers (5.5%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.022 s, sync=0.064 s, total=0.095 s; sync files=249, longest=0.049 s, average=0.001 s; distance=4016 kB, estimate=4016 kB
2023-03-21 18:14:19.502 UTC [51123] 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 16) ;
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 16 (client, serveur, librairies,
extensions) :
# dnf install -y postgresql16-server postgresql16-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 postgresql16-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-16/bin/postgresql-16-setup initdb
# cat /var/lib/pgsql/16/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-16/bin/pg_ctl -D /var/lib/pgsql/16/data/ -l logfile start
Chemins :
Binaires
/usr/pgsql-16/bin
Répertoire de l’utilisateur
postgres
/var/lib/pgsql
PGDATA
par défaut
/var/lib/pgsql/16/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-16
# systemctl stop postgresql-16
# systemctl status postgresql-16
# systemctl reload postgresql-16
# systemctl restart postgresql-16
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-16
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/16/
(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-16.service \
/etc/systemd/system/postgresql-16-infocentre.service
Modification de ce dernier fichier avec le nouveau chemin :
Environment = PGDATA=/var/lib/pgsql/16/infocentre
Option 1 : création d’une nouvelle instance vierge :
# export PGSETUP_INITDB_OPTIONS='--data-checksums --lc-messages=C'
# /usr/pgsql-16/bin/postgresql-16-setup initdb postgresql-16-infocentre
Option 2 : restauration d’une sauvegarde : la procédure dépend de
votre outil.
Adaptation de
/var/lib/pgsql/16/infocentre/postgresql.conf
(port
surtout).
Commandes de maintenance de cette instance :
# systemctl [start|stop|reload|status] postgresql-16-infocentre
# systemctl [enable|disable] postgresql-16-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 16 :
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-16 postgresql-client-16
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/16/bin/
Répertoire de l’utilisateur
postgres
/var/lib/postgresql
PGDATA de l’instance par défaut
/var/lib/postgresql/16/main
Fichiers de configuration
dans
/etc/postgresql/16/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 16 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/16/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 16 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 16 infocentre \
--port=12345 \
--datadir=/PGDATA/16/infocentre \
--pgoption shared_buffers='8GB' --pgoption work_mem='50MB' \
-- --data-checksums --waldir=/ssd/postgresql/16/infocentre/journaux
# pg_ctlcluster 16 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 (16.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 (16.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 (16.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 (16.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/16/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-16
root:~# pg_ctlcluster 16 main reload
postgres:~$ psql -c 'SELECT pg_reload_conf()'