web-dev-qa-db-fra.com

Récupérer des bases de données postgreSQL à partir de fichiers physiques bruts

J'ai le problème suivant et j'ai besoin de savoir s'il y a un moyen de le réparer.

J'ai un client assez bon marché pour refuser d'acheter un plan de sauvegarde pour ses bases de données postgreSQL sur le système principal qui dirige son entreprise. Comme je pensais que cela arriverait un jour, certains fichiers du système d'exploitation sont tombés en panne pendant une panne et il faut réinstaller le système . 

Ce client n'avait aucune sauvegarde des bases de données mais j'ai réussi à enregistrer le répertoire principal de PostgreSQL. J'ai lu que les bases de données sont stockées dans le répertoire de données du dossier principal de postgres. 

Ma question est la suivante: existe-t-il un moyen de récupérer les bases de données à partir du dossier de données uniquement? Je travaille dans un environnement Windows (Service Pack 2 XP) avec PostgreSQL 8.2 et je dois réinstaller PostgreSQL sur un nouveau serveur. Il me faudrait recréer les bases de données dans le nouvel environnement et en quelque sorte attacher les anciens fichiers aux nouvelles instances de base de données. Je sais que c'est possible dans SQL Server en raison de la manière dont le moteur stocke les bases de données, mais je n'ai aucune idée de ce qui se passe dans postgres.

Des idées? Ils seraient très appréciés.

22
Alvos

Si vous avez l'intégralité du dossier de données, vous avez tout ce dont vous avez besoin (tant que l'architecture est la même). Essayez simplement de le restaurer sur une autre machine avant de l’effacer au cas où vous n’auriez pas copié quelque chose.

Il suffit de sauvegarder le répertoire de données sur le disque. Lors du lancement de Postgres, définissez le paramètre lui indiquant l'emplacement du répertoire de données (voir: wiki.postgresql.org ). Ou supprimez le répertoire de données d'origine de la nouvelle installation et placez la copie à sa place.

19
Konrad Garus

C'est possible, il vous suffit de copier le dossier "data" (à l'intérieur du dossier d'installation de Postgres) de l'ancien ordinateur vers le nouvel ordinateur, mais il y a quelques points à garder à l'esprit.

Tout d'abord, avant de copier les fichiers, vous devez arrêter le service serveur Postgres. Donc, Panneau de configuration-> Outils d'administration-> Services, recherchez le service Postgres et arrêtez-le. Lorsque vous avez fini de copier les fichiers et de définir les autorisations, redémarrez-le.

Deuxièmement, vous devez définir les autorisations pour les fichiers de données. Comme le serveur postgres s’exécute sur un autre compte d’utilisateur, il ne pourra pas accéder aux fichiers si vous ne les copiez que dans le dossier de données, car il n’est pas autorisé à le faire. Donc, vous devez changer la propriété des fichiers en utilisateur "postgres". Je devais utiliser subinacl pour cela, l’installer d’abord, puis l’utiliser à partir de la commande Invite comme ceci (d’abord, accédez au dossier où vous l’avez installé):

subinacl /subdirectories "C:\Program Files\PostgreSQL\8.2\data\*" /setowner=postgres

(Il est également possible de changer de propriétaire à partir de l’explorateur: d’abord, vous devez désactiver "Utiliser le partage de fichiers simple" dans les options des dossiers, puis un onglet "Sécurité" apparaît dans la boîte de dialogue Propriétés du dossier. changer de propriétaire, mais je n’ai pas pu le faire de cette façon.)

Désormais, si le service serveur ne peut pas démarrer après l'avoir redémarré manuellement, vous pouvez généralement voir le motif dans l'afficheur d'événements (Outils d'administration-> Afficheur d'événements). Postgres lancera un événement d'erreur et son inspection vous donnera un indice sur le problème (parfois, il se plaindra d'un fichier postmaster.pid, il suffira de le supprimer, etc.). 

5
kolufild

Je le fais mais le plus difficile était de changer la permission du propriétaire:

  1. aller aux services depuis les outils d'administration
  2. trouvez le service postgres et double-cliquez dessus
  3. lors de la connexion onglet changer au système local
  4. puis redémarrer
0
user2615084

La question est très ancienne, mais je souhaite partager une méthode efficace que j'ai trouvée.

Si vous n'avez pas de sauvegarde avec "pg_dump" et que vos anciennes données sont dans un dossier, procédez comme suit: Dans la base de données Postgres, ajoutez des enregistrements à la table "pg_database". Avec un programme de gestion ou "insérer dans". Effectuez la vérification nécessaire, modifiez la requête d’insertion suivante et exécutez-la.

La requête retournera un OID après avoir fonctionné. Créez un dossier avec le nom de ce numéro. Une fois que vous avez copié vos anciennes données dans ce dossier, l’utilisation est maintenant prête.



    /*
    ------------------------------------------
    *** Recover From Folder ***
    ------------------------------------------
    Check this table on your own system.
    Change the differences below.
    */
    INSERT INTO
      pg_catalog.pg_catalog(
      datname, datdba, encoding, datcollate, datctype, datistemplate, datallowconn,
      datconnlimit, datlastsysoid, datfrozenxid, datminmxid, dattablespace, datacl)
    VALUES(
                             -- Write Your collation  
      'NewDBname', 10, 6, 'Turkish_Turkey.1254', 'Turkish_Turkey.1254',
      False, True, -1, 12400, '536', '1', 1663, Null);

    /*
    Create a folder in the Data directory under the name below New OID.
    All old backup files in the directory "data\base\Old OID" are the directory with the new OID number
    Copy. The database is now ready for use.
    */
    select oid from pg_database a where a.datname = 'NewDBname';

0
Zeki Gürsoy