PostgreSQL ERREUR: l'annulation de la déclaration en conflit avec la récupération
J'obtiens l'erreur suivante lors de l'exécution d'une requête sur un PostgreSQL db en mode veille. La requête qui provoque l'erreur fonctionne très bien pendant 1 mois, mais lorsque vous interrogez pour plus de 1 mois il en résulte une erreur.
ERROR: canceling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed
Des suggestions sur la façon de résoudre? Grâce
Vous devez vous connecter pour publier un commentaire.
Exécution de requêtes sur des hot-serveur de secours est un peu difficile, il peut échouer, parce que lors de l'interrogation de certains besoin de lignes pouvant être mis à jour ou supprimé sur le primaire. En tant que principal ne sait pas qu'une requête est lancée sur l'enseignement secondaire, il pense qu'il peut nettoyer (à vide) les anciennes versions de ses lignes. Alors secondaire a relire ce nettoyage, et a force d'annuler toutes les requêtes qui peuvent utiliser ces lignes.
Plus de requêtes sera annulée plus souvent.
Vous pouvez contourner ce problème en commençant par une transaction repeatable read primaire qui ne un mannequin requête, puis assis inactif alors qu'une requête est exécutée sur l'enseignement secondaire. Sa présence permettra d'éviter de passer l'aspirateur de vieilles versions de ligne primaire.
Plus sur ce sujet et d'autres solutions de contournement sont expliquées dans Hot Standby — La Manipulation De La Requête Conflits section de la documentation.
Il n'y a pas besoin de commencer ralenti les opérations sur le maître. Dans postgresql-9.1 l'
la plus directe pour résoudre ce problème par la mise en
Cela rendra le maître conscient des requêtes de longue durée. À partir de la docs:
Pourquoi n'est-ce pas le défaut? Ce paramètre a été ajouté après la première
la mise en œuvre et c'est la seule façon qu'une veille peut affecter un maître.
Pas besoin de toucher
hot_standby_feedback
. Comme d'autres l'ont mentionné, la valeuron
peuvent augmenter maître. Imaginez l'ouverture de la transaction sur un esclave, et pas de fermeture.Au lieu de cela, définir
max_standby_archive_delay
etmax_standby_streaming_delay
certaine valeur saine:De cette façon, les requêtes sur les esclaves, avec une durée de moins de 900 secondes ne sera pas annulée. Si votre charge de travail nécessite plus de requêtes, il suffit de définir ces options pour une valeur plus élevée.
max_standby_archive_delay
peut-être besoin d'être plus petit que l'autre.ms
, c'est à dire 900s = 16 minutes = 900000ms.ms
cloud.google.com/sql/docs/postgres/...Comme indiqué ici sur
hot_standby_feedback = on
:Et ici:
J'ai donc ajouté
Et pas plus
pg_dump
erreur pour nous, ni maître météorisation 🙂Pour AWS RDS exemple, vérifier http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html
Les données de la table sur le serveur de secours esclave est modifié pendant une longue exécution d'une requête est en cours d'exécution. Une solution (PostgreSQL 9.1+) pour s'assurer que les données de la table n'est pas modifié, est de suspendre la réplication et de la reprendre après la requête:
xlog
a été remplacé parwal
, de sorte que vous voulez l'appelerpg_wal_replay_pause()
etpg_wal_replay_resume()
.