web-dev-qa-db-fra.com

Les métriques d'emballage XID ne sont pas claires

Récemment, j'ai eu un problème avec l'une de mes bases de données qui a obtenu une question de XID enveloppant. Donc, j'ai commencé avec single-user Mode et Ran vacuum. Tout était bien. Mais, quand j'ai vérifié datfrozenxid son ~ 1.5Billon où comme mon txid_current est ~ 70billon. J'ai l'impression que c'est énorme différent et quelque chose ne va pas.

La requête ci-dessous, j'ai l'habitude de voir le datfrozenxid de pg_database

select datname, datfrozenxid, age(datfrozenxid) from pg_database order by datname;

J'ai lu un scénario suround XID de http://www.rummandba.com/2014/02/unerstanding-xid-wrap-around.html

Cela me semble logique selon l'exemple donné dans le lien ci-dessus. Mais, j'ai calculé xidWrapLimit, xidStopLimit, xidWarnLimit, xidVacLimit avec mes statistiques.

xidWrapLimit = oldest_datfrozenxid + (MaxTransactionId >> 1);
xidStopLimit = xidWrapLimit - 1000000;
xidWarnLimit = xidStopLimit - 10000000;
(I haven't given all the values here since I am looking only for xidWarnLimit)

Donc, le xidWarnLimit est 3,747 Billon où mon actuel txid_current> 70 milliards. Et étrange chose est txid_current est supérieur à xidWrapLimit qui est de 3,758 Billon.

Comment savoir, quand il augmentera l'avertissement sur la limite de warn de enveloppe.

(en utilisant pg9.5)

1
Spike

Donc, le Xidwarnlimit est de 3,747 Billon où ma txid_current actuelle> 70 milliards. Et une chose étrange est txid_current est supérieure à XidWraplimit, soit 3,758 Billon.

Vous regardez probablement la déclaration brute de txid_current(), qui n'est pas une valeur de 32 bits comme les limites XID que vous regardez. Au lieu de cela, c'est

un format 64 bits étendu avec un compteur "époque" afin qu'il ne s'enroulera pas pendant la durée de vie d'une installation.

(- REF ). Vous pouvez coaxer une valeur 32 bits hors de txid_current() que vous pouvez comparer contre votre xidWrapLimit, xidStopLimit, etc. Comme ceci:

SELECT txid_current() % (2^32)::bigint;

H/t à erwin pour cette pointe . N'oubliez pas que ces valeurs xid s'enroulent à 2 ^ 32.

Pour ce que ça vaut la peine, je pense que le blog post que vous avez lié pour compliquer excessivement ce sujet. Pour faire attention à Xid enveloppant, vous avez vraiment besoin de vérifier:

SELECT max(age(datfrozenxid)) FROM pg_database;

et augmenter une alarme si cela max. L'âge est supérieur à 1 milliard ou plus. Et si cela devient proche de 2 milliards de dollars, vous êtes en danger imminent! Vous pouvez utiliser un outil comme - check_postgres.pl qui va gérer cette vérification pour vous avec des seuils configurables.

3
Josh Kupershmidt