web-dev-qa-db-fra.com

PostgreSQL - récupération à l'aide de la récupération.conf

J'essaie de récupérer une base de données à l'aide du fichier de récupération.conf pour la copie de point à temps.

Sur le fichier de récupération.conf, j'ai ajouté une cible de récupération comme ci-dessous.

recovery_target_time = '2011-06-16 04:10:00 IST'

Mais dans les journaux, je peux voir s'il avance le temps de 3,5 heures à 07h40 et la récupération réelle est tentée pour cette période, pas le temps que j'ai donné dans Recover_Target_Time.

2011-06-16 12:53:45 IST LOG:  starting archive recovery
2011-06-16 12:53:45 IST LOG:  restore_command = '/app/postgresinstall/bin/pg_standby -l /dbdata/archive %f %p %r'
2011-06-16 12:53:45 IST LOG:  recovery_target_time = '2011-06-16 07:40:00+05:30'
cp: cannot stat `/dbdata/archive/00000001.history': No such file or directory

Pourquoi cette différence de 3,5 heures et j'ai besoin d'aide pour déterminer ce qui se passe pour décider de l'heure de la cible de récupération?

Mise à jour : Voici des détails sur la base de données

postgres=# SELECT EXTRACT(timezone_hour FROM now()),EXTRACT(timezone_minute FROM now());
 date_part | date_part 
-----------+-----------
         5 |        30
(1 row)

postgres=# select now();
               now                
----------------------------------
 2011-08-12 13:08:19.333068+05:30
(1 row)

OS Date/Time:
postgres@xxxxx:~$ date
Fri Aug 12 13:10:19 IST 2011

J'ai fait face au même problème lorsque j'essaie de restaurer des archives WAL sur le même serveur et mon serveur de sauvegarde. De plus, je peux toujours reproduire ce problème sur les deux serveurs.

Donc, si j'ai besoin de créer une sauvegarde de temps proche de la courante, j'utilise une récupération_Target_Time 3,5 heures derrière l'heure actuelle et démarrez la DB avec récupération.conf

3
Jamess

Disclaimer: Je ne suis pas un dba PostgreSQL, bien que je commence beaucoup avec elle.

Vous devez probablement vérifier votre fuseau horaire dans le système d'exploitation et dans PSQL.

Dans le système d'exploitation, courez ceci:

[postgres@radarPG-db1 ~]$ date
Fri Jun 17 12:55:37 EDT 2011

En PSQL, exécutez ce qui suit:

postgres=# SELECT EXTRACT(timezone_hour FROM now()),EXTRACT(timezone_minute FROM now());
 date_part | date_part
-----------+-----------
        -4 |         0

postgres=# select now();
              now
-------------------------------
 2011-06-17 12:54:39.195291-04

Plusieurs fois, certains oublient d'avoir des postgres par défaut le fuseau horaire à celui du système d'exploitation. Si les fichiers WAL contiennent également le fuseau horaire dans son horodatage interne, vous devez aligner le fuseau horaire défini dans Postgres avec celui des fichiers WAL.

Quelque chose d'autre à considérer est ce qui suit:

Le comportement par défaut de la récupération consiste à récupérer le long de la même chronologie actuelle lorsque la sauvegarde de la base a été prise. Si vous souhaitez récupérer dans une chronologie de l'enfant (c'est-à-dire que vous souhaitez revenir à certains états générés après une tentative de récupération), vous devez spécifier l'ID de calendrier cible dans "Recovery.conf". Vous ne pouvez pas récupérer les délais qui sont ramifiés plus tôt que la sauvegarde de la base.

Mise à jour 2011-06-20 15:08 EDT

Ceci est juste à partir de la documentation en ligne. S'il vous plaît regardez cela et voyez si vous avez manqué des fichiers wal en cours de route. Si vous avez trop attendu pour configurer les fichiers WAL du nouveau serveur, les Postgres peuvent les supprimer lors du démarrage. Vous devrez peut-être trouver ces fichiers wal. Voir si elles résident dans le dossier PG_XLOG de l'ancien serveur.

(( récupération à l'aide d'une sauvegarde d'archive continue

  1. Arrêtez le serveur s'il est en cours d'exécution.

  2. Si vous avez l'espace pour le faire, copiez le répertoire de données de cluster entier et les espaces de table à un emplacement temporaire au cas où vous en auriez besoin ultérieurement. Notez que cette précaution nécessitera que vous disposiez de suffisamment d'espace libre sur votre système pour contenir deux copies de votre base de données existante. Si vous n'avez pas assez d'espace, vous avez le moins besoin de copier le contenu du sous-répertoire PG_XLOG du répertoire de données de cluster, car il pourrait contenir des journaux non archivés avant la descente du système.

  3. Nettoyez tous les fichiers existants et sous-répertoires dans le répertoire de données de cluster et sous les répertoires racines de tous les espaces de table que vous utilisez.

  4. Restaurez les fichiers de base de données de votre sauvegarde de base. Soyez prudent qu'ils soient restaurés avec la bonne propriété (l'utilisateur du système de base de données, pas root!) Et avec les bonnes autorisations. Si vous utilisez des espaces de table, vous devez vérifier que les liens symboliques dans pg_tblspc/ont été correctement restaurés.

  5. Supprimer tous les fichiers présents dans pg_xlog /; Celles-ci proviennent de la décharge de sauvegarde et sont donc probablement obsolètes plutôt que de courant. Si vous n'avez pas archivé pg_xlog/du tout, puis de la recréer, faisant attention à ce que vous l'établissiez comme un lien symbolique si vous l'avez présenté de cette façon.

  6. Si vous aviez des fichiers de segment wal non arrêtés que vous avez enregistrés à l'étape 2, copiez-les dans pg_xlog /. (Il est préférable de les copier, ne pas les déplacer, de sorte que vous avez toujours les fichiers non modifiés si un problème se produit et que vous devez recommencer.)

  7. Créez une commande de commande de récupération Recovery.conf dans le répertoire de données de cluster (voir Paramètres de récupération). Vous voudrez peut-être aussi modifier temporairement pg_hba.conf pour empêcher les utilisateurs ordinaires de se connecter jusqu'à ce que vous soyez sûr que la récupération a fonctionné.

  8. Démarrer le serveur. Le serveur passera en mode de récupération et procédera à lire les fichiers WAL archivés dont il a besoin. Si la récupération doit être résiliée en raison d'une erreur externe, le serveur peut simplement être redémarré et continuera à la récupération. À la fin du processus de récupération, le serveur renommera la récupération.conf à la récupération.done (pour éviter de rentrer accidentellement en mode de récupération en cas de crash ultérieurement), puis commence les opérations de base de données normales.

  9. Inspectez le contenu de la base de données pour vous assurer que vous vous êtes retrouvé dans l'endroit où vous souhaitez être. Sinon, retournez à l'étape 1. Si tout va bien, laissez-vous dans vos utilisateurs en restau sur pg_hba.conf à la normale.

4
RolandoMySQLDBA