Psqlrc
Tags: postgres, sre, database
Published: 2023-08-07 15:44:04

Je me connecte régulièrement à des serveurs postgresql, soit pour du développement soit pour debug. En effet, l'observabilité manque parfois de détails.

Afin de me simplifier la vie j'utilise le fichier de configuration `.psqlrc` ([source](https://github.com/bdronneau/dotfiles/blob/main/symlinks/psqlrc)). Il permet comme tous les fichiers de configuration dotfiles, celui-ci permet de configurer le client, par exemple le prompt.

```
\set PROMPT1 '%[%033[1m%]%M %n@%/%R%[%033[0m%]%# '
\set PROMPT2 '[more] %R > '
```

La signification des variables est disponible [ici](https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-PROMPTING)).

ou pour activer par défaut le `timing`
```
\timing
```

La directive `\set QUIET 1` au début du fichier réduit les retours des commandes car ces dernières sont exécutées après la connexion.

Après la configuration esthétique, on peut ajouter des alias pour appeler facilement des requêtes de débogage (verrous, activité,...)
_Remarque_: Certaines de ces commandes nécessitent des privilèges SUPERUSER pour afficher les résultats.

```
\set activity 'select datname, pid, usename, application_name,client_addr, client_hostname, client_port, query, state from pg_stat_activity;'
\set locks 'select pg_stat_activity.pid, pg_class.relname, pg_locks.transactionid, pg_locks.granted, substr(pg_stat_activity.query,1,30) as query_snippet, age(now(),pg_stat_activity.query_start) as "age" from pg_stat_activity,pg_locks left outer join pg_class on (pg_locks.relation = pg_class.oid) where pg_stat_activity.query <> ''<insufficient privilege>'' and pg_locks.pid=pg_stat_activity.pid and pg_locks.mode = ''ExclusiveLock'' order by query_start;'
```

Puis on appelle l'alias avec `:activity`

```
127.0.0.1 postgres@postgres=# :activity
┌──────────┬─────┬──────────┬──────────────────┬─────────────┬─────────────────┬─────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┐
│ datname  │ pid │ usename  │ application_name │ client_addr │ client_hostname │ client_port │                                                             query                                                             │ state  │
├──────────┼─────┼──────────┼──────────────────┼─────────────┼─────────────────┼─────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┤
│ (null)   │  28 │ postgres │                  │ (null)      │ (null)          │      (null) │                                                                                                                               │ (null) │
│ (null)   │  27 │ (null)   │                  │ (null)      │ (null)          │      (null) │                                                                                                                               │ (null) │
│ (null)   │  24 │ (null)   │                  │ (null)      │ (null)          │      (null) │                                                                                                                               │ (null) │
│ (null)   │  23 │ (null)   │                  │ (null)      │ (null)          │      (null) │                                                                                                                               │ (null) │
│ (null)   │  26 │ (null)   │                  │ (null)      │ (null)          │      (null) │                                                                                                                               │ (null) │
└──────────┴─────┴──────────┴──────────────────┴─────────────┴─────────────────┴─────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┘
(7 rows)

Time: 3.299 ms
```


Faites toujours attention aux requêtes que vous lancer manuellement sur les instances de **PROD**.


### Plus de lecture / sources:
- Le fichier complet https://github.com/bdronneau/dotfiles/blob/main/symlinks/psqlrc
- https://www.digitalocean.com/community/tutorials/how-to-customize-the-postgresql-prompt-with-psqlrc-on-ubuntu-14-04
- https://www.if-not-true-then-false.com/2009/postgresql-psql-psqlrc-tips-and-tricks/