О «Оборачивании идентификатора транзакции»

10

Теперь я прочитал документ об «Оберточности идентификатора транзакции», но есть кое-что, чего я действительно не понимаю, это следующий 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. Я прав ? Спасибо

франки
источник
Я думаю, что ваше последнее редактирование, вероятно, должно быть новым вопросом, если это возможно,
говорит Джек, попробуйте topanswers.xyz

Ответы:

10

Почему после переноса базы данных в обход идентификатора транзакции транзакции, которые были в прошлом, окажутся в будущем?

Они не Цитируемый текст просто объясняет, почему Postgres должен использовать арифметику по модулю 2 31 (что означает, что транзакции могут быть обернуты, если старые транзакции «замораживаются» достаточно рано):

Нормальные XID сравниваются с использованием арифметики по модулю 2 ^ 31. Это означает, что для каждого нормального XID существует два миллиарда «старше» и два миллиарда «новее»

чтобы быть конкретным:

старые версии строк должны быть переназначены XID FrozenXID, прежде чем они достигнут отметки в два миллиарда транзакций

или завершение XID может привести к поломке. Чтобы предотвратить это, postgres начнет выдавать предупреждения, и в конце концов отключится и при необходимости откажется запускать новые транзакции:

Если по какой-то причине автоочистке не удастся удалить старые XID из таблицы, система начнет выдавать предупреждающие сообщения, подобные этим, когда самые старые XID базы данных достигнут десяти миллионов транзакций с точки обхода:

WARNING:  database "mydb" must be vacuumed within 177009986 transactions 
HINT:  To avoid a database shutdown, execute a database-wide VACUUM in "mydb". 

(Ручной VACUUM должен решить проблему, как подсказано подсказкой; но учтите, что VACUUM должен выполняться суперпользователем, иначе он не сможет обрабатывать системные каталоги и, следовательно, не сможет продвигать datfrozenxid базы данных.) Если эти предупреждения игнорируются, система будет закрыта и откажется начинать любые новые транзакции, если до завершения процедуры останется менее 1 миллиона транзакций

Другими словами, «транзакции, которые были в прошлом, по-видимому, находятся в будущем» и «потеря данных» являются полностью теоретическими и на практике не будут вызваны оборачиванием идентификатора транзакции.

Джек говорит, попробуйте topanswers.xyz
источник
давайте продолжим это обсуждение в чате
Джек говорит попробуйте topanswers.xyz
5

Блок, который вы вставили, кажется, отвечает на вопрос. Все зависит от логики, которая используется для сокрытия «будущих» транзакций.

Счетчик идентификатора транзакции (XID) ограничен 32 битами, и если он когда-либо достигнет этого следующего числа, вместо замены старой максимальной транзакции, он начинается заново с нуля.

Ну, теперь это ноль, поэтому PostgreSQL скрывает от него все транзакции> 0. Таким образом, хотя транзакция №2,147,483,633 произошла 20 секунд назад, PostgreSQL считает, что этого не произойдет еще с 2,147,483,633 транзакциями.

Дерек Дауни
источник
1
Документы были исправлены в декабре 2013 года. XID рассчитываются по модулю 2 ^ 31.
Эрадман