Pytanie Jak naprawić PostgreSQL, aby zaczął się po nagłym wyłączeniu?


Z powodu nagłej awarii zasilania PostGres serwer uruchomiony na mojej lokalnej maszynie nagle się wyłączył. Po ponownym uruchomieniu starałem się ponownie uruchomić PostgreSQL i otrzymałem ten błąd:

$ pg_ctl -D /usr/local/pgsql/data restart

pg_ctl: PID file "/usr/local/pgsql/data/postmaster.pid" does not exist
Is server running?
starting server anyway
server starting
$:/usr/local/pgsql/data$ LOG:  database system shutdown was interrupted at 2009-02-28 21:06:16 
LOG:  checkpoint record is at 2/8FD6F8D0
LOG:  redo record is at 2/8FD6F8D0; undo record is at 0/0; shutdown FALSE
LOG:  next transaction ID: 0/1888104; next OID: 1711752
LOG:  next MultiXactId: 2; next MultiXactOffset: 3
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  redo starts at 2/8FD6F918
LOG:  record with zero length at 2/8FFD94A8
LOG:  redo done at 2/8FFD9480
LOG:  could not fsync segment 0 of relation 1663/1707047/1707304: No such file or directory
FATAL:  storage sync failed on magnetic disk: No such file or directory
LOG:  startup process (PID 5465) exited with exit code 1
LOG:  aborting startup due to startup process failure

Nie ma postmaster.pid plik w katalogu danych. Co może być przyczyną takiego zachowania i oczywiście, jakie jest wyjście?


14
2018-02-28 15:53


pochodzenie


Jakiej wersji Postgreszu używasz i jaki jest typ systemu plików /usr/local/pgsql/data? - vladr
Tak, jak wiesz, być może będziesz musiał przywrócić z kopii zapasowej. Ale zanim to zrobisz, podziel się z nami swoją wersją PostgreSQL (w wersji 8.1.5 i 8.8.6 IIRC pojawił się błąd powodujący ten błąd podczas odzyskiwania) i typem systemu plików (możesz to zmienić przed następną awarią). - vladr
podpowiedź: "restart", mówisz serwerowi PostgreSQL, że działa i trzeba go zrestartować. Nie działa, dlatego nie ma pliku identyfikatora procesu (.pid). - Kurt


Odpowiedzi:


Musisz pg_resetxlog. Twoja baza danych może być w dalszym ciągu niespójna, więc zrzuć ją pg_dumpall, odtwórz i importuj z powrotem.

Przyczyną tego może być:

  • Nie wyłączyłeś sprzętu napisz cache na dysku, który często uniemożliwia systemowi operacyjnego upewnienie się, że dane są zapisywane, zanim zgłasza pomyślne zapisanie do aplikacji. Sprawdź z

    hdparm -I /dev/sda

    Jeśli wyświetli "*" przed "Write cache", to może tak być. Źródło PostgreSQL ma program src / tools / fsync / test_fsync.c, który testuje prędkość synchronizacji danych z dyskiem. Uruchom - jeśli raport będzie zawsze krótszy niż, powiedzmy, 3 sekundy, niż twój dysk leży na OS - na dyskach 7500rpm test 1000 zapisów do tego samego miejsca będzie potrzebował co najmniej 8 sekund na zakończenie (1000 / (7500rpm / 60s)), ponieważ może pisać tylko raz na trasie. Musisz edytować ten test_fsync.c, jeśli twoja baza danych znajduje się na innym dysku niż partycja / var / tmp - zmiana

    #define FSYNC_FILENAME "/var/tmp/test_fsync.out"

    do

    #define FSYNC_FILENAME "/usr/local/pgsql/data/test_fsync.out"

  • Twój dysk ulega awarii i ma uszkodzony blok, sprawdź z badblocks.

  • Masz złą pamięć RAM, sprawdź z memtest86 + przez co najmniej 8 godzin.


18
2018-03-02 10:58



Dzięki za tonę. Przeniosłem DB, ale postanowiłem spróbować. To zadziałało i db został przywrócony. pg_resetxlog zrobił lewy.
Ten problem może się również zdarzyć, gdy nastąpi uaktualnienie systemu operacyjnego Windows - nie tylko postmaster staje się niedostępny, ale uprawnienia folderu danych i usługi mogą zniknąć. pg_resetxlog rozwiązuje pierwszy problem. - MytyMyky
Może to również nastąpić po niewiarygodnie przeciążonym podsystemie pamięci masowej w systemie Linux. - Florian Heigl
Miał to po (bardzo podły) test przeciążania podsystemu dyskowego na Linuksie. - Florian Heigl


Czytanie kilku podobnych wiadomości w archiwach PostgreSQL lista mailingowa ("synchronizacja pamięci nie powiodła się na dysku magnetycznym: brak takiego pliku lub katalog ") wydaje się wskazywać, że istnieje bardzo poważny sprzęt kłopoty, znacznie gorsze niż zwykła awaria zasilania. Być może będziesz musiał przygotować się do przywrócenia z kopii zapasowych.


6
2018-02-28 17:57



Ant P, Vlad Romascanu i bortzmeyer - Dziękuję za wszystkie wasze commennty. Dowiedziałem się, że dysk twardy został uszkodzony z powodu skoku zasilania. Muszę przenieść postgres na inną maszynę.
Jeśli to prawda, możesz przyjąć dwie odpowiedzi (jeden kretyn zignorował moje, nie zadając sobie trudu, by wyjaśnić dlaczego). - bortzmeyer
@bortzmeyer: przegłosowano z powodu poprawnej odpowiedzi. - X-Istence
@bortzmeyer: fsck powiedział mi, że były błędy na dysku twardym. więc wprowadzono mnie w błąd, że db nie może zostać przywrócony, ale polecenie pg_resetxlog zrobiło lewy. Wielkie dzięki.


Uruchom start zamiast ponownego uruchomienia. Wykonaj poniższe polecenie:

$pg_ctl -D /usr/local/pgsql/data start

0
2017-08-07 05:06



Wciąż mam ten sam błąd, kiedy to robię. - student001


Miałem też korupcję db, moje działania

docker run -it --rm -v /path/to/db:/var/lib/postgresql/data postgres:10.3 bash
su - postgres
/usr/lib/postgresql/10/bin/pg_resetwal -D /var/lib/postgresql/data -f

0
2018-04-30 20:31