Теперь я прочитал документ об «Оберточности идентификатора транзакции», но есть кое-что, чего я действительно не понимаю, это следующий URL: http://www.postgresql.org/docs/9.0/static/routine-vacuuming .html # ВАКУУМ-FOR-Wraparound
23.1.4. Предотвращение ошибок обхода идентификатора транзакции
Семантика транзакции MVCC в PostgreSQL зависит от возможности сравнения номеров идентификаторов транзакций (XID): версия строки с XID вставки, превышающим XID текущей транзакции, «в будущем» и не должна быть видимой для текущей транзакции. Но поскольку идентификаторы транзакций имеют ограниченный размер (32 бита), кластер, работающий в течение длительного времени (более 4 миллиардов транзакций), будет подвергаться циклическому изменению идентификатора транзакции: счетчик XID обнуляется, и все внезапные транзакции, которые были в прошлое кажется будущим - что означает, что их продукция становится невидимой. Короче, катастрофическая потеря данных. (На самом деле данные все еще там, но это холодное утешение, если вы не можете их получить.) Чтобы избежать этого, необходимо пылесосить каждую таблицу в каждой базе данных как минимум один раз каждые два миллиарда транзакций.
Я не понимаю высказываний «будет происходить перенос идентификатора транзакции: счетчик XID обнуляется, и все внезапные транзакции, которые были в прошлом, оказываются в будущем - что означает, что их вывод станет невидимым»
Может кто-нибудь объяснить это? Почему после переноса базы данных в обход идентификатора транзакции транзакции, которые были в прошлом, окажутся в будущем? Короче говоря, я хочу знать, будет ли PostgreSQL в ситуации «потери данных» после обхода идентификатора транзакции с помощью autovacuum。
Для моих личных представлений мы можем получить текущий идентификатор транзакции, используя функцию txid_current (), выход которой 64-битный и не будет зацикливаться. Так что я думаю, что идентификатор транзакции вставки для кортежей, который знает как xmin, будет больше, чем xid, который получает с помощью функции txid_current (). Кроме того, вы будете использовать идентификатор транзакции сброса сброса pg_resetxlog после завершения работы PostgreSQL Server. Я прав ? Спасибо