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.
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)
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