PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Général » Problème pour restorer une très large DB » 12/04/2013 10:46:16

ebs

Re bonjour,

Je reviens vers vous pour donner des nouvelles suites aux suggestions qui ont été proposées dans ce thread.
Même en désactivant l'autovacuum ma restauration plantait...

J'ai fait un truc un peu naïf mais qui semble faire la blague: j'ai recréé le schéma de ma base sans les contraintes, restauré les données, et en ce moment je reconstruis les contraintes...
Je ne sais pas si c'est la meilleure solution mais semble passer ainsi.

En tout cas j'ai vraiment du mal à croire qu'avec la config, je fasse crasher le PostgreSQL lors de la restauration sad

En tout cas merci pour vos conseils !

#2 Re : Général » Problème pour restorer une très large DB » 04/04/2013 11:11:37

ebs

Bonjour rjuju,

Oui c'est effectivement ce que je viens de faire car ça a de nouveau planté... mais la j'ai du mal à saisir comment j'ai pu exploser mon "quota" de memoire sad
Je vous tiens au courant en esperant qu'avec ce changement cela ira!

Merci pour vos conseils

#3 Re : Général » Problème pour restorer une très large DB » 03/04/2013 09:42:49

ebs

excellente remarque, j'avais totalement zappé le paramètre autovacuum_max_workers!
je l'ai passé à 1 et je vais baisser le maintenance_work_mem... tant pis si c'est plus long.

ca me semble une excellente piste pour la suite, je vous tiens au courant.

merci pour vos conseils

#4 Re : Général » Problème pour restorer une très large DB » 02/04/2013 18:33:42

ebs

Bonjour rjuju,

Merci pour ton retour.
Oui oui j'ai baissé le nombre de jobs à 1 afin d'éviter le soucis.
J'ai 7Go de RAM sur cette machine (qui ne fait server postgresql) et j'ai un shared_buffers de 3Go et une maintenance_work_mem de 1Go (peut être que c'est en effet un peu trop).

#5 Général » Problème pour restorer une très large DB » 02/04/2013 17:33:04

ebs
Réponses : 7

Bonjour,

J'ai un petit problème lorsque j'essaye de restorer une très grosse base de données.
Voici le contexte: le dump de la base est un backup d'une machine de production qui est assez lourd (environ 32Go en format custom) généré avec la commande suivante:

pg_dump -F custom -b myDB -Z 9 > /backup/myDB-`date +%y%m%d`.pg91

Lorsque je souhaite restorer ce dump je lance la commande suivante:

pg_restore -F custom -j 5 -d myDB /backup/myDB-20130331.pg91

J'ai déjà du restorer cette base sans aucun soucis.
Cependant aujourd'hui je souhaite - pour des tests - la restorer sur une nouvelle machine qui est bien moins *costaude* (moins de 2 fois la quantité de RAM, moins de CPU, etc... - je le précise car je crois que ça peut avoir son importance).
Lorsque que je lance une restoration sur cette nouvelle machine, le pg_restore me retourne l'erreur suivante:

pg_restore: [archiver (db)] error returned by PQputCopyData: server closed the connection unexpectedly
This probably means the server terminated abnormally
    before or while processing the request.
pg_restore: [archiver] worker process failed: exit code 1
pg_restore: [archiver (db)] error returned by PQputCopyData: server closed the connection unexpectedly
This probably means the server terminated abnormally
    before or while processing the request.
pg_restore: [archiver (db)] error returned by PQputCopyData: server closed the connection unexpectedly
This probably means the server terminated abnormally
    before or while processing the request.
pg_restore: [archiver (db)] error returned by PQputCopyData: server closed the connection unexpectedly
This probably means the server terminated abnormally
    before or while processing the request.

Et dans le log de mon serveur PostgreSQL:

 HINT:  In a moment you should be able to reconnect to the database and repeat your command.
   LOG:  all server processes terminated; reinitializing
   LOG:  database system was interrupted; last known up at 2013-04-02 11:41:48 UTC
   LOG:  database system was not properly shut down; automatic recovery in progress
   LOG:  redo starts at 86/26F302B0
   LOG:  unexpected pageaddr 85/E3F52000 in log file 134, segment 38, offset 16064512
   LOG:  redo done at 86/26F51FC0
   LOG:  last completed transaction was at log time 2013-04-02 11:50:47.663599+00
   LOG:  database system is ready to accept connections
   LOG:  autovacuum launcher started

edit:
De plus dans le dmesg, j'ai bien un message comme quoi la quantité de mémoire n'est pas suffisante:

[682545.650561] Out of memory: Kill process 53409 (postgres) score 905 or sacrifice child

Donc non seulement le restore plante misérablement mais en plus mon serveur restart tout seul.
Face à ce problème je me suis dit que j'allais baisser le nombre de jobs pour la restoration mais j'ai eu exactement le même problème. Je sais qu'il y a des index vraiment trop lourd dans cette base et je me demande si ce n'est pas l'update de ces derniers qui provoqueraient ça.
Ce qui me surprend c'est que je n'ai jamais eu de soucis à faire cette restoration sur d'autres machines (qui avaient ceci dit de bien meilleures specs).

Si vous avez des pistes sur la question je suis preneur:
* est ce que je m'y prends mal avec le pg_restore?
* est ce vraiment un problème de specs de ma machine?
* y a t'il un autre moyen plus malin de restorer une large base de données?


Merci d'avance ! smile


environnement: PostgreSQL 9.1 installé via les packages Debian

#6 Re : Général » PgPool-II - intérrogation sur le connection pooler » 14/06/2012 18:37:11

ebs

hum ca signifie que pour utiliser le pool il faut qu'au préalable il ouvre le max de connexions que mon pgpool peut gérer ?

donc j'imagine dans ce cas que parfois il est plus intéressant de baisser le ce nombre afin de profiter un maximum du pool ?


merci en tout cas pour ces précisions ! smile

#7 Re : Général » PgPool-II - intérrogation sur le connection pooler » 14/06/2012 17:31:02

ebs

Bonjour rjuju et merci pour cette réponse.

oui oui c'est effectivement pour minimiser les nombres de reconnexions avec la base que je souhaitais utiliser pgpool mais après plusieurs tests j'ai plus l'impression qu'il ne réutilise jamais une connexion déjà ouverte... et c'est ça qui me perturbe car du coup je minime jamais le nombre de reconnexions sad

si vous avez d'autres pistes je suis preneur (ou peut être ai je mal saisi la subtilité de certains paramètres)

#8 Général » PgPool-II - intérrogation sur le connection pooler » 14/06/2012 12:50:29

ebs
Réponses : 6

Bonjour,

Je suis dans le cas suivant:
- deux serveurs postgresql (un maître et un esclave) synchronisé via une réplication hot stand by par wal shipping. - postgresql v9.1 installé via les packages backports Debian Squeeze
- un pgpool a été configuré en front par lequel toutes les lectures passent qui est configuré en failover (le poids du slave est 1000 > à celui du master qui ne sert donc que si le slave n'est plus dispo) et en connection pooler (connection_life_time = 300 afin d'éviter l'overhead de la reconnection) - pgpool 3.0.5 compilé à partir des sources


Reprenons le cas suivant:
- depuis un client j'ouvre une première connexion en passant par pgpool que je laisse ouverte : je vois bien un process au niveau de pgpool et un au niveau de mon serveur slave - OK
- je referme cette connexion : la connexion sur pgpool mais la connexion sur mon serveur slave est toujours présente (cf. connection_life_time) - OK
- depuis le même client sur la même base et avec le même user j'ouvre à nouveau une connexion juste pour faire un "select 1" via pgpool : je vois qu'un nouveau process sur mon serveur slave est créé et donc j'ai 2 connexions - NOK

pourquoi lors de cette dernière connexion, il ne réutilise pas la session idle qui reste ouverte ?

si vous avez des pistes je suis preneur.
merci d'avance !
/Erwan

#9 Re : PHP » pgsnap - Query failed: ERROR: function return row and query-specified » 09/05/2012 16:11:37

ebs

effectivement après une réinstallation de l'extension pg_buffercache tout va mieux. elles avaient bien été installées avant la migration vers la 9.1 d'où le souci.

merci pour vos retours en tout cas smile

#10 Re : PHP » pgsnap - Query failed: ERROR: function return row and query-specified » 09/05/2012 13:58:59

ebs

après vérification il semble que ce soit le cas... la base a été créée sous une 8.3.
du coup cette vue n'a plus de sens.

#11 Re : PHP » pgsnap - Query failed: ERROR: function return row and query-specified » 09/05/2012 11:54:04

ebs

vous avez raison:

# SELECT count(*) FROM pg_buffercache;
ERROR:  function return row and query-specified return row do not match
DÉTAIL : Returned row contains 8 attributes, but query expects 7.

#12 Re : PHP » pgsnap - Query failed: ERROR: function return row and query-specified » 03/05/2012 11:00:36

ebs

bonjour et merci pour ce retour !

donc effectivement la requête qui pose problème est bien la suivante:

$query = "SELECT
  pg_get_userbyid(datdba) AS dba,
  datname,
  pg_database_size(reldatabase) AS size,
  count(*) AS buffers
FROM pg_buffercache, pg_database, pg_tablespace
WHERE reldatabase=pg_database.oid
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3";

mais en retirant la composante avec pg_tablespace j'ai malheureusement le même souci sad

#13 PHP » pgsnap - Query failed: ERROR: function return row and query-specified » 02/05/2012 11:24:46

ebs
Réponses : 8

Bonjour,

Je souhaitais utiliser pgsnap afin d'avoir une vision globale et des stats sur ma base de données.
Cependant lorsque j'ai essayé de l'utiliser, j'ai eu les messages suivants:

$ /home/postgres/tools/pgsnap-0.7.0/pgsnap.php -a -o /tmp/pgsnap
Connecting...
Connecting to template1 database...
Adding some HTML files...
Getting Misc informations...
Getting General informations...
Getting Global Informations...
  pg_buffercache unavailable!
Getting Database Informations...
  pg_buffercache unavailable!
  pgstattuple unavailable!
  pgstattuple on indexes unavailable!
Getting Current Activities Informations...
Getting Statistical Informations...
Getting Tools Informations...
  pgPool unavailable!
Connecting to postgres database...
Adding some HTML files...
Getting Misc informations...
Getting General informations...
Getting Global Informations...
  pg_buffercache unavailable!
Getting Database Informations...
  pg_buffercache unavailable!
  pgstattuple unavailable!
  pgstattuple on indexes unavailable!
Getting Current Activities Informations...
Getting Statistical Informations...
Getting Tools Informations...
  pgPool unavailable!
Connecting to myDB database...
Adding some HTML files...
Getting Misc informations...
Getting General informations...
Getting Global Informations...
PHP Warning:  pg_query(): Query failed: ERROR:  function return row and query-specified return row do not match
DETAIL:  Returned row contains 8 attributes, but query expects 7. in /home/postgres/tools/pgsnap-0.7.0/lib/databasesincache.php on line 35
An error occured.

$ echo $?
0

Malheureusement en regardant un peu le code de databasesincache.php je n'ai pas bien compris ce qui clochait.
De plus c'est dommage que le script sorte avec un exit status 0 alors qu'il y a une erreur qui semble bien catchée.

J'aurai une autre petite question: est ce qu'on peut utiliser pgsnap sur une machine slave dans le cadre d'une réplication hot-standby replication ?

Merci d'avance pour votre aide smile

/Erwan


mon environnement - Debian 6:

$ dpkg -l | grep postgres
ii  postgresql-9.1                      9.1.3-2~bpo60+1              object-relational SQL database, version 9.1 server
ii  postgresql-client-9.1               9.1.3-2~bpo60+1              front-end programs for PostgreSQL 9.1
ii  postgresql-client-common            129~bpo60+1                  manager for multiple PostgreSQL client versions
ii  postgresql-common                   129~bpo60+1                  PostgreSQL database-cluster manager
ii  postgresql-contrib-9.1              9.1.3-2~bpo60+1              additional facilities for PostgreSQL
ii  postgresql-doc-9.1                  9.1.3-2~bpo60+1              documentation for the PostgreSQL database management system

$ dpkg -l | grep php
ii  php5-cli                            5.3.3-7+squeeze8             command-line interpreter for the php5 scripting language
ii  php5-common                         5.3.3-7+squeeze8             Common files for packages built from the php5 source
ii  php5-pgsql                          5.3.3-7+squeeze8             PostgreSQL module for php5
ii  php5-suhosin                        0.9.32.1-1                   advanced protection module for php5

pgsnap v0.7

#14 Re : Réplication » Réplication hotstandby postges 9.1, Erreur transfert de WAL » 24/11/2011 20:20:37

ebs

si si c'est clair !
dommage qu'on ne puisse pas le configurer via une setting dans le fichier de conf... car 1 seconde ça fait un peu "bourrin" quand même big_smile
sinon effectivmement il reste la solution de modifier le code et recompiler le postgres !

merci pour toutes ces précisions en tout cas !

#15 Re : Réplication » Réplication hotstandby postges 9.1, Erreur transfert de WAL » 24/11/2011 19:54:38

ebs

ah si j'ai une dernière question sur le sujet, le master execute l'archive_command lorsque le archive_timeout est passé ou lorsque le wal atteint sa taille max... mais lorsqu'il y a une erreur, le master tente de renvoyer le wal à quelle fréquence ? j'ai l'impression de ne pas trouver de settings répondant à ce cas

#16 Re : Réplication » Réplication hotstandby postges 9.1, Erreur transfert de WAL » 24/11/2011 19:24:22

ebs

désolé d'avoir oublié de préciser que je suis sous une Debian 6.0 avec des postgreSQL 9.0.5.

merci à tous pour vos réponses et ça me rassure et me confirme que j'avais bien suivi ce qu'il se passait.
j'ai effectivement fait un script qui sort avec un status != 0 dès qu'il y a un soucis donc je ne devrais pas être embêté smile !

#17 Re : Réplication » Réplication hotstandby postges 9.1, Erreur transfert de WAL » 24/11/2011 17:16:22

ebs

Je vais profiter de ce thread pour poser plusieurs questions lorsqu'on est dans le cas suivant: un master et 2 standby en hotstandby replication.
Dans la conf du master il y a une archive_command qui est capable de copier sur chacun des standbys les WALs.
Que se passe t'il si la commande arrive à copier le WAL sur seulement un des standbys ?
On peut imaginer que l'archive_command sorte avec un exit status != 0. Du coup le master tentera d'archiver à nouveau ce même WAL tant que l'archive_command ne sortira pas avec un exit status ==0 ?
J'imagine que le standby qui avait bien récupéré le WAL attendra le prochain et ne traitera donc plus jamais le WAL renvoyé ? (ouf je sais pas si j'ai été clair)

#18 Re : Général » [Log] activer et desactiver les logs sans restart ? » 08/11/2011 18:02:06

ebs

oui tu as raison c'est pas malin ce que je voulais faire. Ta porposition est plus sage et ça m'évitera de passer à côté de qqchose
merci pour tout


edit: car le francais que j'ai utilisé m'a piqué les yeux smile

#20 Général » [Log] activer et desactiver les logs sans restart ? » 08/11/2011 16:06:50

ebs
Réponses : 4

Bonjour,

J'ai une question un peu candide sur l'activation/désactivation des logs d'un serveur postgresql v9.1 (installé via les packages backports debian)

Jusqu'à présent j'avais fait deux fichiers de configuration, l'une ou j'active les logs et l'autre ou ces derniers sont disablés. Je jongle entre les deux configurations lorsque je veux faire tourner un pgfouine sur mes logs
Voici les parties qui différent

conf avec activation des logs:

log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d-%H.log'
log_rotation_age = 60
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = on
log_error_verbosity = default
log_hostname = on
log_line_prefix = '%t [%p]: [%l-1] '
log_statement = 'all'

conf avec désactivation des logs:

log_destination = 'stderr'
logging_collector = off
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d-%H.log'
log_rotation_age = 60
log_checkpoints = off
log_connections = off
log_disconnections = off
log_duration = off
log_error_verbosity = default
log_hostname = off
log_line_prefix = '%t [%p]: [%l-1] '
log_statement = 'none'

Tout ceci fonctionne bien sauf que je ne peux activer/désactiver mes logs sans faire un restart alors que j'aimerai juste faire un reload à cause du logging_collector qui nécessite un restart du service.

Je voulais donc savoir s'il y avait un best practice sur ce sujet, car une idée bien moche m'est venue à l'idée à savoir d'avoir une conf avec désactivation des logs comme suit:

log_destination = 'stderr'
logging_collector = on      # on active le logging_collector
log_directory = 'pg_log'
log_filename = 'postgresql-no_log' # et en fait pg_log/postgresql-no_log est un symlink vers /dev/null
log_rotation_age = 0                       # on desactive la rotation des logs
log_checkpoints = off
log_connections = off
log_disconnections = off
log_duration = off
log_error_verbosity = default
log_hostname = off
log_line_prefix = '%t [%p]: [%l-1] '
log_statement = 'none'

Ainsi quand je jongle entre mes confs je ne restart jamais le service vu que logging_collector sera toujours "on" mais dans un cas j'écris dans un vrai fichier alors que dans le second je redirige tout vers /dev/null... ça me paraît trop laid et j'imagine que je suis passé à côté de qqchose, donc si vous avez une piste je suis preneur!

Merci d'avance

#21 Re : Réplication » [Hot Standby Replication] Mise en pause de la replication » 14/10/2011 12:30:27

ebs

merci beaucoup !
je vais donc lancer une petite campagne de creation d'indexes sur mon nouveau tablespace smile

#22 Re : Réplication » [Hot Standby Replication] Mise en pause de la replication » 14/10/2011 11:24:15

ebs

super ! merci pour ces précisions Marc.

j'ai une question un peu bête du coup mais si je décide d'opter pour recréer l'index... à un moment il y aura 2 indexes avec des noms différents mais avec le même contenu, comment se comporte postgres dans ce cas là ?

#23 Re : Réplication » [Hot Standby Replication] Mise en pause de la replication » 13/10/2011 17:30:47

ebs

Merci pour ta réponse arthurr !
En fait je n'ai pas de souci sur les locks en écriture (je peux me permettre de ne pas écrire qqtemps sur mes tables) mais en lecture! Et hier quand j'ai fait mon réindex mes requêtes (uniquement des select) sur mon slave étaient en WAITING (ce que je comprends pas bien car je pensais que c'était au moins accessible en lecture)).
Cependant ta méthode me plait car je pourrai directement créer ce nouvel index dans mon nouveau tablespace, droper l'ancien et renommer le nouveau et hop ! ainsi j'éviterai les différents locks non ?

#24 Réplication » [Hot Standby Replication] Mise en pause de la replication » 13/10/2011 15:28:35

ebs
Réponses : 6

Bonjour,

Je me permets d'ouvrir à nouveau un thread concernant ma réplication dans un contexte master-slave par une réplication hot standby sur des serveurs PostgreSQL 9.0 (installés via les backports Debian Squeeze).

Suite à mon thread précédent, j'ai bien compris que pour réaliser certaines opérations de maintenance (type réindex, alter de tablespace, full vaccum...) ma base allait être inaccessible en écriture mais aussi en lecture le temps de l'opération.
Cependant j'ai un pgpool-II en frontal par lequel toutes mes requêtes en lecture passent. Mon idée était de stopper la réplication et de rediriger toutes les lectures sur le slave le temps de faire mes opérations de maintenance sur mon master. Une fois ces opérations finies, je réactive la synchro (qui va en fait envoyer tous les WAL générés durant la maintenance) tout en redirigeant toute mes requêtes en lecture sur mon master.
Une fois que mon slave a bien tout rattrapé, alors je peux reconfigurer mon pgpool-II comme avant.

Ce que j'ai fait pour cela est de changer mon script archive_command, en ajoutant la condition suivante: si un fichier témoin existe alors le script sort en "exit 1"

#!/bin/bash
# Script to copy WAL archives to slave servers
# Usage:
# archive_command = '/usr/local/sbin/postgres_archive_command %p %f'


FILE_SRC="$1"
FILE_DEST="/var/lib/postgresql/wal_hot_standby/$2"
slave="10.0.1.48"
MAIL="plop@plop.com"
LOG="/var/log/postgresql/archives_log_process.log"
DEBUG_VALUE=1
STOP_FILE="/var/run/postgresql/pg_standby-stopfile"

[ $DEBUG_VALUE -ge 1 ] && echo "$0 2.0 - `date` - INFO - start archive log process" >> $LOG 2>&1


if [ -e "$STOP_FILE" ]
then
        echo "$0 2.0 - `date` - WARN - $STOP_FILE exists, archive process suspended..." >> $LOG 2>&1
        exit 1
fi

[ $DEBUG_VALUE -ge 1 ] && echo "$0 2.0 - `date` - INFO - start transfert for $slave" >> $LOG 2>&1
[ $DEBUG_VALUE -ge 1 ] && echo "$0 2.0 - `date` - INFO - scp $FILE_SRC postgres@$slave:$FILE_DEST" >> $LOG 2>&1
scp $FILE_SRC postgres@$slave:$FILE_DEST  >> $LOG 2>&1
if [ $? -ne 0 ] 
then
                echo "$0 2.0 - `date` - ERROR when trying to scp $FILE_SRC postgres@$slave:$FILE_DEST" >> $LOG 2>&1
                (echo -e "Master: `hostname -f`\nSlave: $slave\nFile: $FILE_SRC\nLog: $LOG\n\n") | mail -s "[Postgresql ALERT] error copying wal file $FILE_SRC" $MAIL
                exit 1
fi

[ $DEBUG_VALUE -ge 1 ] && echo "$0 2.0 - `date` - INFO - archive log process done" >> $LOG 2>&1

Je viens de tester et ça semble bien fonctionner... quand je supprime mon fichier témoin les WAL sont bien tous renvoyés et mon slave rattrape son retard. Mais je doutais de la bonne pratique de cette méthode (en imaginant que je n'ai pas de souci de stockage des WALs durant cette opération)

De plus je n'ai pas bien compris pourquoi mon master essaye toutes les minutes de renvoyer les WALs alors qu'en temps normal s'il n'y a pas d'activité, il envoie le WAL toutes les 5 minutes (== checkpoint_timeout)... Sachant que pour mes tests j'ai mis archive_timeout à 30 secondes. J'imagine qu'il y a d'autres paramètres expliquant le "toutes les minutes" mais je ne vois pas bien lequel, si vous avez des pistes je suis preneur!

D'avance, merci beaucoup !
/Erwan

#25 Re : Réplication » [Hot Standby Replication] Question sur les tablespaces » 12/10/2011 19:12:46

ebs

merci pour ces précisions !

j'ai un pgpool-II en front surlesquel arrive mes requêtes en lecture et qui met tout sur le slave sauf si ce dernier ne répond pas.
j'ai peur que pour réaliser ces opérations sans avoir de problème je sois contraint de:
* stopper ma réplication (la copie des WAL)
* configurer pgpool-II avec un seulement le slave en backend
* réaliser les alter de tablespaces
* configurer pgpool-II avec un seulement le master en backend
* relancer la réplication (la copie des WAL)
* une fois que le slave est à jour, configurer pgpool-II comme avant

mince j'avoue avoir espéré une procédure plus simple!
bizarrement j'ose pas trop stopper la synchro des WAL comme ça (même si je sais que c'est effectivement robuste et que le master retentera les envois si ces derniers échouent // où alors copier les WAL dans un autre espace...)


en tout cas merci encore pour vos précisions!

Pied de page des forums

Propulsé par FluxBB