====== 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 : [[https://askubuntu.com/questions/1052079/unable-to-install-postgresql-9-6-in-ubuntu-18-04|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 :
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 :
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:sauvegarde_et_restauration_des_bases_de_donnees#procedure_de_restauration|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