web-dev-qa-db-fra.com

Comment obtenir une sauvegarde et un test de base de données PostgreSQL fonctionnel et complet

J'espérais pouvoir obtenir une réponse claire sur la façon de garantir une sauvegarde Postgres complète comme vous le feriez avec MS SQL Server, puis de prendre soin des utilisateurs orphelins.

D'après ce que j'ai lu, et cela pourrait être faux, trouver un bon blog PostgreSQL a été difficile, alors n'hésitez pas à m'en recommander, j'ai besoin de comprendre comment cette application fonctionne pour que je puisse avoir confiance en mes sauvegardes et Slony réplication. Un développeur a restauré une sauvegarde que j'ai prise de PgadminIII via le format custom, directory et tar tout en sélectionnant OIDs mais il a dit que deux d'entre eux ne l'ont pas fait '' t load, tar l'a fait mais ce n'était que le répertoire, pas les données. Je suis vraiment confus maintenant.

  1. J'utilise PGAdminIII, il a un pg_dump et pg_dumpall option. Je veux sauvegarder tout dont j'ai besoin pour tester restaurer cette base de données quelque part et vérifier que oui, toutes les données dont nous avons besoin et notre sauvegarde est bonne. Finalement, je veux écrire un script de restauration automatique, mais un jour à la fois.

pg_dumpall a apparemment un -globals option censée tout sauvegarder, mais l'aide pour pg_dumpall montre un -g, --globals-only dump only global objects, no databases, pas un --globals option.

J'ai pensé pg_dumpall sauvegarderait au moins les clés étrangères, mais même cela semble être une "option". Selon la documentation , même avec pg_dumpall Je dois utiliser un -o option pour sauvegarder les clés étrangères, je ne peux pas vraiment imaginer quand je ne voudrais pas sauvegarder les clés étrangères et cela aurait plus de sens comme options par défaut.

  1. Comment prendrais-je soin des utilisateurs orphelins et validerais-je tout? Je voudrais réellement restaurer mon fichier de sauvegarde sur un autre serveur et vérifier que tout fonctionne. Si quelqu'un a des suggestions sur la façon d'effectuer une véritable sauvegarde dans PostgreSQL et de la restaurer, je vous en serais très reconnaissant.

J'avais un serveur PostgreSQL mais je n'arrive toujours pas à comprendre pourquoi l'application ne sauvegarderait pas OIDs par défaut! Il semble que 99,9% du temps vous le voudriez.

MISE À JOUR 1:

Postgres documentation mentionne que l'option globals que je cherchais semble être une option par défaut sur cette version, mais elle a toujours besoin de -o option. Si quelqu'un peut vérifier ou me donner un exemple de commande pour restaurer une base de données unique ailleurs avec tout ce dont il a besoin, je l'apprécierais.

Edit: être invité par le site à montrer le caractère unique de cette question en modifiant ma question. Cette question soulève le problème et clarifie les OID dans les sauvegardes, la différence entre les globaux et les non globaux, ainsi que les tests de restauration des recommandations pour s'assurer que la sauvegarde est bonne plutôt que de simplement sauvegarder. En raison des réponses, j'ai pu sauvegarder, comprendre les globaux/oids et commencé un test de restauration tous les soirs sur Postgres à l'aide de tâches cron. Merci pour l'aide!

49
Ali Razeghi

Vous pouvez vider l'intégralité du cluster PostgreSQL avec pg_dumpall. C'est toutes les bases de données et tous les globaux pour un seul cluster. À partir de la ligne de commande sur le serveur, je ferais quelque chose comme ça. (Le mien écoute sur le port 5433, pas sur le port par défaut.) Vous pouvez ou non avoir besoin de l'option --clean.

$ pg_dumpall -U postgres -h localhost -p 5433 --clean --file=dump.sql

Cela inclut les informations globales - informations sur les utilisateurs et les groupes, les espaces disque logiques, etc.

Si je devais sauvegarder une seule base de données et la déplacer vers un serveur de travail , je viderais la base de données avec pg_dump, et viderais les globales avec

  • pg_dumpall --globals-only, Ou
  • pg_dumpall --roles-only (Si vous n'avez besoin que de rôles)

comme ça.

$ pg_dump -U postgres -h localhost -p 5433 --clean --file=sandbox.sql sandbox
$ pg_dumpall -U postgres -h localhost -p 5433 --clean --globals-only --file=globals.sql

Les sorties ne sont que des fichiers texte.

Après avoir déplacé ces fichiers vers un autre serveur, chargez d'abord les globaux, puis le vidage de la base de données.

$ psql -U postgres -h localhost -p 5433 < globals.sql
$ psql -U postgres -h localhost -p 5433 < sandbox.sql

Je pensais que pg_dumpall sauvegarderait au moins les clés étrangères, mais même cela semble être une "option". Selon: http://www.postgresql.org/docs/9.1/static/app-pg-dumpall.html même avec pg_dumpall, je dois utiliser une option -o pour sauvegarder les clés étrangères

Non, cette référence indique "Utilisez cette option si votre application référence les colonnes OID d'une manière ou d'une autre (par exemple, dans une contrainte de clé étrangère) . Sinon, cette option ne doit pas être utilisée. " (Je souligne.) Je pense qu'il est peu probable que votre application fasse référence aux colonnes OID. Vous n'avez pas besoin d'utiliser cette option pour "sauvegarder des clés étrangères". (Lisez le fichier de vidage dans votre éditeur ou visualiseur de fichiers.)