Situation

L'ordinateur a planté, et l'on n'a pas pu/ne peut plus faire de sauvegarde depuis l'interface noalyss.

Parce que :

  • un upgrade Linux n'a pas mis à jour la base de postgresql mais à créer une nouvelle version,
  • simplement vous avez un backup de votre disque mais pas de backup de la DB

Néanmoins, on a encore accès aux données sur le disque dur de l'ordinateur qui a planté (et donc à notre base de donnée postgresql).

On prendra un exemple où l'on doit restaurer une base de données construite avec postgresql-9.6 et remise dans une installation à jour avec postgresql-12.

On utilisera la version 9.6 et 12 , adaptez aux versions que vous avez

Préambule : sauvegarder la base de données

Copier/coller l'intégralité du dossier /var/lib/version/main/ (où “version” sera un numéro de version, dans notre exemple /var/lib/postgresql/9.6/main/ ) de l'ordinateur planté sur un support de sauvegarde (disque-dur/clé USB).

À partir de maintenant, on travaillera sur la nouvelle installation (dans l'exemple, postgresql-12).

Installer l'ancienne version de postgresql

Soit en la compilant, soit avec les packages de la distribution.

Dans notre exemple, postgresql-9.6, à partir des conseils que l'on trouvera : ici.

Démarrer l'ancienne version de postgresql en prenant en compte les données "historique"

Copier/coller (nécessite les droits admin) le dossier /var/lib/postgresql/9.6/main (=POSTGRESBASE) que l'on a sauvegardé dans le même dossier sur la nouvelle installation. Si le dossier n'existe pas, c'est que l'installation de postgresql ne s'est pas bien faite.

:IMPORTANT: On peut choisir un autre dossier. En choisissant d'écraser l'installation de postgresql , vous détruisez les données qui y seraient

Modifiez /etc/postgresql/9.6/main/pg_hba.conf ou créez le fichier dans POSTGRESBASE de sorte que :

pg_hba.conf
local   all             all                                     peer
host    all             all             127.0.0.1/32            trust

Modifiez /etc/postgresql/9.6/main/postgresql.conf ou créez le fichier dans POSTGRESBASE de sorte que :

postgresql.conf
listen_addresses = 'localhost'          # what IP address(es) to listen on;
port = 4000                             # (change requires restart)

Copier/coller (nécessite les droits admin) /etc/postgresql/9.6/main/pg_hba.conf et /etc/postgresql/9.6/main/postgresql.conf dans POSTGRESBASE

Vérifier que tout appartient et est fait par l'utilisateur postgres

POSTGRESBASE=/var/lib/postgresql/9.6/main
chown -R postgres $POSTGRESBASE # /var/lib/postgresql/9.6/main
chmod -R o-rwx    $POSTGRESBASE #/var/lib/postgresql/9.6/main

Puis faire :

(attention, il faut avoir le chemin complet vers pg_ctl)

(attention, à partir de postgresql-12, il faut également faire l'étape “Complément (version >=12)” décrite plus loin, juste avant les lignes suivantes) (!) Rappel /var/lib/9.6/main est POSTGRESBASE

/usr/lib/postgresql/9.6/bin/pg_ctl start --pgdata  /var/lib/9.6/main/  -o "--port=4000"

Une fois cela fait, avec la nouvelle version de postgresl (pour rappel, c'est la 12 pour cet exemple), en indiquant le port de la 9.6 faire :

/usr/lib/postgresql/12/bin/pg_dumpall --port=4000 > full-backup.dmp

Il faut se connecter sur le port de la version 9.6 , puis arrêter ce server

/usr/lib/postgresql/9.6/bin/pg_ctl stop --pgdata  /var/lib/9.6/main/  -o "--port=4000"

Restaurer la base de donnée

Restaurez votre backup ,

sudo -i -u postgres
psql <  noalyss_backup.dmp

Les données , les utilisateurs et les mots de passe seront comme à l'origine .

source : tutoriaux:Procédure de restauration

Complément (version >= 12)

:TO-READ: Cette étape est absolument optionnelle et ne fera qu'éviter des warnings, vous pouvez l'ignorer.

À partir de la version 12 , on ne peut plus utiliser “with oids” qui était le défaut jusque là

Il va falloir faire un script pour les modifier, quand la 9.6 tourne, se connecter et faire pour chaque base de données, en tant que postgres :

postgres@dany:~$ psql db1
postgres=#\o /tmp/x.sql
 
postgres=# SELECT 'alter table '||nsp.nspname  ||'.'|| tbl.relname ||'set without oids;'
FROM pg_namespace nsp
  JOIN pg_class tbl ON nsp.oid = tbl.relnamespace
WHERE tbl.relhasoids='t' AND nsp.nspname <> 'pg_catalog';
 
postgres=#\o
postgres=#\i /tmp/x.sql

où db1 est le nom de la base de donnée numéro un, que l'on trouvera de la manière suivante :

postgres@dany:~$ psql
postgres=#\l
  • tutoriaux/restaurer_depuis_les_fichiers_postgresql.txt
  • Dernière modification: 2020/05/29 12:06
  • par dany