Теперь я прочитал документ об «Оберточности идентификатора транзакции», но есть кое-что, чего я действительно не понимаю, это следующий 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. Я прав ? Спасибо
источник
Ответы:
Они не Цитируемый текст просто объясняет, почему Postgres должен использовать арифметику по модулю 2 31 (что означает, что транзакции могут быть обернуты, если старые транзакции «замораживаются» достаточно рано):
чтобы быть конкретным:
или завершение XID может привести к поломке. Чтобы предотвратить это, postgres начнет выдавать предупреждения, и в конце концов отключится и при необходимости откажется запускать новые транзакции:
Другими словами, «транзакции, которые были в прошлом, по-видимому, находятся в будущем» и «потеря данных» являются полностью теоретическими и на практике не будут вызваны оборачиванием идентификатора транзакции.
источник
Блок, который вы вставили, кажется, отвечает на вопрос. Все зависит от логики, которая используется для сокрытия «будущих» транзакций.
Счетчик идентификатора транзакции (XID) ограничен 32 битами, и если он когда-либо достигнет этого следующего числа, вместо замены старой максимальной транзакции, он начинается заново с нуля.
Ну, теперь это ноль, поэтому PostgreSQL скрывает от него все транзакции> 0. Таким образом, хотя транзакция №2,147,483,633 произошла 20 секунд назад, PostgreSQL считает, что этого не произойдет еще с 2,147,483,633 транзакциями.
источник