Teraz czytam dokument o „Podsumowaniu identyfikatora transakcji”, ale jest coś, czego tak naprawdę nie rozumiem, dokument to następujący adres URL http://www.postgresql.org/docs/9.0/static/routine-vacuuming .html # VACUUM-FOR-WRAPAROUND
23.1.4. Zapobieganie błędom podsumowania identyfikatora transakcji
Semantyka transakcji MVCC PostgreSQL zależy od możliwości porównania numerów identyfikatorów transakcji (XID): wersja wiersza z wstawionym XID większym niż XID bieżącej transakcji jest „w przyszłości” i nie powinna być widoczna dla bieżącej transakcji. Ale ponieważ identyfikatory transakcji mają ograniczony rozmiar (32 bity), klaster działający przez długi czas (ponad 4 miliardy transakcji) ucierpiałby na zawinięciu identyfikatora transakcji: licznik XID zawija się do zera, a wszystkie nagłe transakcje, które miały miejsce przeszłość wydaje się być w przyszłości - co oznacza, że ich twórczość staje się niewidoczna. Krótko mówiąc, katastrofalna utrata danych. (Właściwie dane nadal tam są, ale to zimny komfort, jeśli nie możesz się do nich dostać.) Aby tego uniknąć, konieczne jest odkurzanie każdej tabeli w każdej bazie danych przynajmniej raz na dwa miliardy transakcji.
Nie rozumiem stwierdzeń, że „ucierpiałoby to na zawijaniu identyfikatora transakcji: licznik XID zawija się do zera, a wszystkie nagłe transakcje, które miały miejsce w przeszłości, wydają się być w przyszłości - co oznacza, że ich wyniki stają się niewidoczne”
Czy ktoś może to wyjaśnić? Dlaczego po tym, jak baza danych cierpi na zawijanie identyfikatora transakcji, transakcje, które były w przeszłości, wydają się być w przyszłości? Krótko mówiąc, chcę wiedzieć, czy PostgreSQL znajdzie się w sytuacji „utraty danych” po zawinięciu identyfikatora transakcji przez autovacuum。
Dla moich osobistych poglądów możemy uzyskać bieżący identyfikator transakcji za pomocą funkcji txid_current (), która generuje 64 bitów i nie będzie cykliczna, więc myślę, że identyfikator transakcji wstawiania krotek, które znają jako xmin, będzie nerwowy większy niż xid, który otrzyma przez funkcję txid_current (). Tyle że użyjesz pg_resetxlog zresetuj identyfikator transakcji po zamknięciu serwera PostgreSQL. Czy mam rację ? Dzięki