PostgreSQL Installation

Posted on sam. 07 mars 2020 in admin

Dans cet article nous allons travailler sur Fedora. L'essentiel sera compatible avec d'autre distribution, seuls les installations de paquets seront à adapter.

Installation

Serveur

L'installation du serveur se fera avec l'outil dnf en utilisant la commande suivante:

sudo dnf install postgresql-server

Afin d'administrer et manager plus facilement le serveur il est recommandé d'installer un certain nombre de module complémentaire.

pg_stat_statements

Afin de pouvoir comprendre ce qui se passe sur le serveur en cas de problème je propose d'installer le module pg_stat_statements. Celui-ci nous permettra d'avoir des statistiques d'exécution des requêtes. Installons d'abord les paquets des modules supplémentaires :

sudo dnf install postgresql-contrib

Ensuite éditons le fichier postgres.conf avec le contenu suivant :

shared_preload_libraries = 'pg_stat_statements'

Pour que l'extension soit chargé il faut redémarrer le serveur

systemctl restart postgresql

Ensuite il faut activer l'extension dans le serveur avec la commande suivant sous psql

create extension pg_stat_statements;

Client

Pour les personnes voulant se connecter au serveur il est recommandé d'installer le client psql

sudo dnf install postgresql client

Afin d'améliorer l'affichage des tables dans psql il est recommandé d'installer pspg avec la commande suivante :

sudo dnf install pspg

Il est possible d'éditer le fichier .psqlrc afin de personnaliser psql

\set QUIET 1

\setenv PAGER 'pspg -s 11 --no-mouse'

-- choisir d'afficher les résultats NULL avec la syntaxe [NULL]
\pset null '[NULL]'

-- utiliser un fichier d'historique different par serveur et par base
-- l'historique sera limité a 2000 entrées
\set HISTFILE ~/.psql_history- :HOST - :DBNAME
\set HISTSIZE 2000

-- compute the execution time of each request
-- affiche le temps d'execution des requetes
\timing

-- garde une entrée une seule fois dans l'historique
\set HISTCONTROL ignoredups

\unset QUIET

-- la section ci-dessous affichera un message lors de la connexion
-- et donnera une liste de raccourcis utiles.
\echo '\nCurrent Host Server Date Time : '`date` '\n'

\echo 'Administrative queries:\n'
\echo '\t\t\t:settings\t-- Server Settings'
\echo '\t\t\t:conninfo\t-- Server connections'
\echo '\t\t\t:activity\t-- Server activity'
\echo '\t\t\t:locks\t\t-- Lock info'
\echo '\t\t\t:waits\t\t-- Waiting queires'
\echo '\t\t\t:dbsize\t\t-- Database Size'
\echo '\t\t\t:tablesize\t-- Tables Size'
\echo '\t\t\t:uselesscol\t-- Useless columns'
\echo '\t\t\t:uptime\t\t-- Server uptime'
\echo '\t\t\t:menu\t\t-- Help Menu'
\echo '\t\t\t\\h\t\t-- Help with SQL commands'
\echo '\t\t\t\\?\t\t-- Help with psql commands\n'

\echo 'Development queries:\n'
\echo '\t\t\t:sp\t\t-- Current Search Path'
\echo '\t\t\t:clear\t\t-- Clear screen'
\echo '\t\t\t:ll\t\t-- List\n'

-- Administration queries

\set menu '\\i ~/.psqlrc'

\set settings 'select name, setting,unit,context from pg_settings;'

\set locks  'SELECT bl.pid AS blocked_pid, a.usename AS blocked_user, kl.pid AS blocking_pid, ka.usename AS blocking_user, a.query AS blocked_statement FROM pg_catalog.pg_locks bl JOIN pg_catalog.pg_stat_activity a ON bl.pid = a.pid JOIN pg_catalog.pg_locks kl JOIN pg_catalog.pg_stat_activity ka ON kl.pid = ka.pid ON bl.transactionid = kl.transactionid AND bl.pid != kl.pid WHERE NOT bl.granted;'

\set conninfo 'select usename, count(*) from pg_stat_activity group by usename;'

\set activity 'select datname, pid, usename, application_name,client_addr, client_hostname, client_port, query, state from pg_stat_activity;'

\set waits 'SELECT pg_stat_activity.pid, pg_stat_activity.query, pg_stat_activity.waiting, now() - pg_stat_activity.query_start AS \"totaltime\", pg_stat_activity.backend_start FROM pg_stat_activity WHERE pg_stat_activity.query !~ \'%IDLE%\'::text AND pg_stat_activity.waiting = true;'

\set dbsize 'SELECT datname, pg_size_pretty(pg_database_size(datname)) db_size FROM pg_database ORDER BY db_size;'

\set tablesize 'SELECT nspname || \'.\' || relname AS \"relation\", pg_size_pretty(pg_relation_size(C.oid)) AS "size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN (\'pg_catalog\', \'information_schema\') ORDER BY pg_relation_size(C.oid) DESC LIMIT 40;'

\set uselesscol 'SELECT nspname, relname, attname, typname, (stanullfrac*100)::int AS null_percent, case when stadistinct >= 0 then stadistinct else abs(stadistinct)*reltuples end AS \"distinct\", case 1 when stakind1 then stavalues1 when stakind2 then stavalues2 end AS \"values\" FROM pg_class c JOIN pg_namespace ns ON (ns.oid=relnamespace) JOIN pg_attribute ON (c.oid=attrelid) JOIN pg_type t ON (t.oid=atttypid) JOIN pg_statistic ON (c.oid=starelid AND staattnum=attnum) WHERE nspname NOT LIKE E\'pg\\\\_%\' AND nspname != \'information_schema\' AND relkind=\'r\' AND NOT attisdropped AND attstattarget != 0 AND reltuples >= 100 AND stadistinct BETWEEN 0 AND 1 ORDER BY nspname, relname, attname;'

\set uptime 'select now() - pg_postmaster_start_time() AS uptime;'

-- Development queries:

\set sp 'SHOW search_path;'
\set clear '\\! clear;'
\set ll '\\! ls -lrt;'

Si aucun pager n'est installé et qu'il n'est pas possible d'en installer un tout n'est pas perdu il est possible d'améliorer le paging des requêtes. Lorsque le résultat s'affiche il faut faire la combinaison de touche suivante "-" suivi de "shift+S". Un paging simplifié va se mettre en place pour quitter ce mode il suffit d'appuyer sur "q".

Commande de base

Après l'installation il est nécessaire de connaitre les commandes permettant de créer des groupes et utilisateurs.

Créer un groupe permet d'améliorer la gestion des permissions utilisateur

CREATE ROLES name;

Ensuite il est possible d'attribuer des permissions a ce groupe:

ALTER ROLE name WITH CREATEDB;

Tous les utilisateurs de ce groupe pourront créer une base, il est possible de remplacer CREATEDB par d'autres permissions.

Dans PostgreSQL un utilisateur n'est rien d'autre qu'un groupe avec la permission de se logger. Pour le créer nous pouvons utiliser la commande suivante:

CREATE ROLE name WITH LOGIN;

ou

CREATE USER name;

Conclusion

Voici le minimum vital pour pouvoir utiliser un serveur PostgreSQL. Nous n'avons pas configuré la sécurité, les stratégies de sauvegarde ou réplication.