<!--
Les sources pour vacuumdb sont :

* Add vacuumdb option --missing-stats-only to compute only missing optimizer
statistics (Corey Huinker, Nathan Bossart) § §

  - This option can only be used by --analyze-only and --analyze-in-stages. 
  - https://postgr.es/c/edba754f0
  - https://postgr.es/m/Z5O1bpcwDrMgyrYy%40nathan
  - https://postgr.es/c/987910502
  - https://postgr.es/m/aAjyvW5_fRGNr7yF%40msg.df7cb.de

Les sources pour pg_combinebackup sont :

* https://postgr.es/c/99aeb8470

Discussion :

* http://postgr.es/m/CA+TgmoaEFsYHsMefNaNkU=2SnMRufKE3eVJxvAaX=OWgcnPmPg@mail.gmail.com

Les sources pour pg_verifybackup sont :

* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8dfd31290

Discussion :

* https://www.postgresql.org/message-id/flat/CA%2BTgmoZnG5DT1jo%3D9xgFztiLX4tU7%2Bwr3D9HbhH_vPc%2BC5M0iA%40mail.gmail.com#f9ead0ffda7813ebeed623f548ef951c

-->

<div class="slide-content">

  * `vacuumdb`
    + nouvelle option `--missing-stats-only`
  * `pg_combinebackup`
    + Nouvelle option `-k/--link`
  * `pg_verifybackup`
    + vérifier les sauvegardes au format `tar` (compressées ou non)
    + requiert l'option `-n/--no-parse-wal`

</div>

<div class="notes">

**Outil vacuumdb** :

La nouvelle option `--missing-stats-only` de `vacuumdb` permet de calculer
uniquement les statistiques pour les tables pour lesquelles il manquent des
données statistiques sur l'un de ces trois types d'objet : colonne, expressions
d'index ou statistiques étendues. C'est également utile après un `pg_upgrade`
(puisqu'il permet désormais de conserver la plupart des statistiques).

Cette option peut être utilisée avec `--analyze-only` ou `--analyze-in-stages`.

<!-- Probablement pas la peine de détailler mais intéressant :

Presently, --missing-stats-only skips relations with reltuples set
to 0 because empty relations don't get optimizer statistics.
However, before v14, a reltuples value of 0 was ambiguous: it could
either mean the relation is empty, or it could mean that it hadn't
yet been vacuumed or analyzed.  (Commit 3d351d916b taught v14 and
newer to use -1 for the latter case.)  This ambiguity can cause
--missing-stats-only to inadvertently skip relations that need
optimizer statistics after upgrades to v18 and newer (since
reltuples is now transferred from the old cluster).

To fix, simply remove the check for reltuples != 0.  This will
cause --missing-stats-only to analyze some empty tables, but that
doesn't seem too terrible a trade-off.

-->

**Outil pg_combinebackup** :

La commande `pg_combinebackup` permet de combiner les backups
incrémentaux de `pg_basebackup` depuis la version 17.
s'est vu ajouter une nouvelle option `-k` (`--link`)
qui permet de combiner des sauvegardes en effectuant un lien physique avec les
fichiers des sauvegardes. L'avantage de cette méthode est qu'elle permet de
s'affranchir de la copie. Le désavantage est que les sauvegardes seront
altérées lors du démarrage de l'instance cible. Cette méthode est donc utile
lorsque les répertoires sources sont une copie qui sera supprimée après
l'exécution de `pg_combinebackup`.

Pour réaliser une sauvegarde incrémentale sur un serveur avec la configuration
par défaut, les adaptations suivantes doivent être faites.

```ini
summarize_wal = on
archive_mode = on
archive_command = 'rsync -a %p /var/lib/pgsql/18/backups/wal/%f'
```

Une sauvegarde initiale est ensuite réalisée, avant de modifier les données et
réaliser une sauvegarde incrémentale.

```bash
cd /var/lib/pgsql/18/backups/
pg_basebackup --pgdata FULL
psql -c "CREATE TABLE t(i int); INSERT INTO t SELECT generate_series(1, 1000);"
pg_basebackup --pgdata INC --incremental ./FULL/backup_manifest
```

Les deux sauvegardes sont ensuite combinées pour créer le nouveau répertoire de
données.

```bash
pg_combinebackup -o NEW/ --link FULL INC
```

Un message d'avertissement est émis pour nous prévenir du risque d'altération
de la sauvegarde.

```default
pg_combinebackup: warning: --link mode was used; any modifications to the output directory might destructively modify input directories
```

La commande suivante nous montre qu'un certain nombre de fichiers sont en
commun entre les répertoires de sauvegardes (`FULL` et `INC`)  et le répertoire
de données (`NEW`). La seconde colonne affichée ci-dessous permet d'identifier
les fichiers qui ont le même inode (et donc sont des liens physiques).

```bash
find . -type f -printf "%n %p\n" | sed -E "s/(.\/[A-Z]*)\/.*/\1/" \
| sort | uniq -c | grep -v wal
```
```default
    312 1 ./FULL
    670 1 ./INC
      2 1 ./NEW
    668 2 ./FULL
    310 2 ./INC
    978 2 ./NEW
```

**Outil pg_verifybackup** :

`pg_verifybackup` permet désormais de vérifier des sauvegardes au format `tar`.

Commençons par réaliser une sauvegarde au format tar (compressée ou non).

```bash
pg_basebackup --pgdata FULL --format=t --gzip
```

La sauvegarde comprend un fichier manifeste, une archive des fichiers de la
base de données, et une autre pour les archives de journaux de transactions. Si la
base de données contenait des _tablespaces_ utilisateurs, chaque _tablespace_
aurait son archive.

```bash
ls -al FULL/
```
```default
total 3220
drwx------. 2 postgres postgres      69 Jul 22 14:34 .
drwxr-xr-x. 3 postgres postgres      18 Jul 22 14:34 ..
-rw-------. 1 postgres postgres  139391 Jul 22 14:34 backup_manifest
-rw-------. 1 postgres postgres 3129402 Jul 22 14:34 base.tar.gz
-rw-------. 1 postgres postgres   17097 Jul 22 14:34 pg_wal.tar.gz
```

La commande de vérification des sauvegardes utilise `pg_waldump` pour vérifier
les WAL. Malheureusement, elle ne sait pas encore vérifier des WAL qui sont
stockés dans un fichier `tar`. `pg_verifybackup` nous informe de cette limitation
lorsqu'on tente de l'exécuter tel quel :

```bash
/usr/pgsql-18/bin/pg_verifybackup FULL
```
```default
pg_verifybackup: error: pg_waldump cannot read tar files
pg_verifybackup: hint: You must use -n/--no-parse-wal when verifying a tar-format backup.
```

Avec l'option `-n/--no-parse-wal`, la vérification peut être réalisée :

```bash
/usr/pgsql-18/bin/pg_verifybackup --no-parse-wal FULL
```

```default
backup successfully verified
```

</div>
