Agora, eu li o documento sobre "Transaction ID Wraparound", mas há algo que eu realmente não entendo, o documento é o seguinte url http://www.postgresql.org/docs/9.0/static/routine-vacuuming .html#VACUUM-FOR-WRAPAROUND
23.1.4. Prevenção de falhas de contorno de ID de transação
A semântica de transação MVCC do PostgreSQL depende da capacidade de comparar números de ID de transação (XID): uma versão de linha com um XID de inserção maior que o XID da transação atual é "no futuro" e não deve ser visível para a transação atual. Mas, como os IDs de transação têm tamanho limitado (32 bits), um cluster que executa por um longo período (mais de 4 bilhões de transações) sofreria uma quebra de ID de transação: o contador XID volta a zero e, de repente, as transações que estavam no passado parecem estar no futuro - o que significa que sua produção se torna invisível. Resumindo, perda de dados catastrófica. (Na verdade, os dados ainda estão lá, mas isso é um consolo se você não conseguir obtê-los.) Para evitar isso, é necessário limpar todas as tabelas em todos os bancos de dados pelo menos uma vez a cada dois bilhões de transações.
Eu não entendo as declarações "sofreria a volta do ID da transação: o contador XID chega a zero e, de repente, as transações que estavam no passado parecem estar no futuro - o que significa que sua saída se torna invisível"
Alguém pode explicar isso? Por que, depois que o banco de dados sofre um wraparound de ID de transação, as transações que estavam no passado parecem estar no futuro? Resumindo, quero saber se o PostgreSQL entrará na situação de "perda de dados" após o wraparound do ID da transação pelo autovacuum。
Para minhas visões pessoais, podemos obter o ID da transação atual usando a função txid_current () cuja saída é de 64 bits e não será alternada. pela função txid_current(). Exceto que você usará pg_resetxlog reset reset ID da transação após desligar o PostgreSQL Server. Estou certo ? Obrigado
Eles não. O texto citado apenas explica por que o postgres precisa usar o módulo 2 31 aritmático (o que significa que as transações podem ser agrupadas, desde que as transações antigas sejam 'congeladas' com antecedência suficiente):
para ser específico:
ou envolver o XID faria com que as coisas quebrassem. Para evitar isso, o postgres começará a emitir avisos e, eventualmente, desligará e se recusará a iniciar novas transações, se necessário:
Em outras palavras, "transações que estavam no passado parecem estar no futuro" e "perda de dados" são totalmente teóricas e não serão causadas pelo retorno do ID da transação na prática.
O bloco que você colou parece responder à pergunta. Tudo depende da lógica que é usada para ocultar transações 'futuras'.
O contador de ID da transação (XID) é limitado a 32 bits e, se atingir o próximo número, em vez de substituir a antiga transação máxima, ele começa do zero.
Bem, agora é zero, então o PostgreSQL está escondendo todas as transações > 0 dele. Portanto, embora a transação nº 2.147.483.633 tenha ocorrido 20 segundos atrás, o PostgreSQL acredita que isso não acontecerá por mais 2.147.483.633 transações.