Strefa czasowa PostgreSQL nie odpowiada systemowej strefie czasowej

17

Mam kilka instalacji PostgreSQL 9.2, w których strefą czasową używaną przez PostgreSQL jest GMT, mimo że cały system to „Europa / Wiedeń”. Dokładnie sprawdziłem, postgresql.confczy nie zawiera timezoneustawień, więc zgodnie z dokumentacją powinien wrócić do strefy czasowej systemu.

Jednak,

# su -s /bin/bash postgres -c "psql mydb"

mydb=# show timezone;
 TimeZone 
----------
 GMT
(1 row)

mydb=# select now();
              now              
-------------------------------
 2013-11-12 08:14:21.697622+00
(1 row)

Wszelkie wskazówki, skąd może pochodzić strefa czasowa GMT? Użytkownik systemu nie TZustawił /etc/timezonei /etc/timeinfowydaje się, że jest poprawnie skonfigurowany.

# cat /etc/timezone 
Europe/Vienna
# date
Tue Nov 12 09:15:42 CET 2013

Wszelkie wskazówki są mile widziane, z góry dzięki!

Martin C.
źródło

Odpowiedzi:

24

Domyślna wartość TimeZoneustawienia zmieniła się w wersji 9.2:

(..) Jeśli nie zostanie to wyraźnie ustawione, serwer inicjuje tę zmienną do strefy czasowej określonej przez środowisko systemowe. (...)

(...) Wbudowane ustawienie domyślne to GMT, ale zwykle jest zastępowane w postgresql.conf; initdb zainstaluje tam ustawienie odpowiadające środowisku systemowemu. (...)

Co oznacza, że ​​przed wersją 9.2 wartość domyślną postgresql.confnależy ustawić na initdbetapie. Jeśli przesłonisz tę wartość (prawdopodobnie kopiujesz stary postgresql.confpodczas aktualizacji ze starszych wersji), PostgreSQL użyje domyślnie wartości „GMT”.

Rozwiązanie twojego przypadku jest dość proste, wystarczy zmienić TimeZoneustawienie na żądaną postgresql.confwartość:

TimeZone = 'Europe/Vienna'

Następnie musisz przejść reloaddo usługi:

# su - postgres -c "psql mydb -c 'SELECT pg_reload_conf()'"

Następnie wszystkie pola przechowywane jako timestamp with time zone(lub timestamptz) będą odtąd wyświetlane poprawnie. Ale będziesz musiał ręcznie poprawić wszystkie (zaktualizować) pola przechowywane jako timestamp without time zone(lub timestamp).

Wskazówka, którą daję wszystkim, którzy aktualizują PostgreSQL, nie polega na kopiowaniu starego postgresql.confdo nowego klastra (zauważ, że nie jestem pewien, czy zrobiłeś to, ale często widziałem ten sam problem). Po prostu pobierz ten wygenerowany przez initdbi dodaj modyfikacje ( diffnarzędzie może być przydatne w tym zadaniu).

MatheusOl
źródło
Wielkie dzięki, nie zauważyłem tej zmiany z 9.1 na 9.2. Tak, dodanie informacji o strefie czasowej do postgresql.conf jest trywialną poprawką, po prostu nie mogłem wyjaśnić, dlaczego powróciłoby do GMT. Najwyraźniej cały czas natknąłem się na dokumentację 9.1, ponieważ nie spodziewałbym się tak radykalnej zmiany z 9.1 na 9.2 w zachowaniu domyślnym.
Martin C.
Twoja baza danych powinna jednak zawsze znajdować się w UTC (GMT). Ułatwia porównywanie czasów. Zawsze może zmienić strefę czasową klienta / sesji. Ustaw strefę czasową x na str. stackoverflow.com/questions/2532729/…
Neil McGuigan
Czy w postgresql.confwersji 9.2+ można określić, że strefa czasowa środowiska systemowego powinna być nadal automatycznie wykrywana?
Kyle Strand,
0

Znalazłem obejście tego.

po prostu utwórz dowiązanie symboliczne w / usr / share / zoneinfo / o nazwie czas lokalny (lub jakakolwiek inna nazwa), aby wskazywało na / etc / localtime

/usr/share/zoneinfo/localtime -> /etc/localtime

w ten sposób tworzysz ciąg linków, które ostatecznie wskazują strefę czasową twojego systemu.

/etc/localtime -> /usr/share/zoneinfo/America/Los_Angeles

Teraz weź nazwę utworzonego linku ( w moim przypadku czas lokalny ) i użyj go jako wartości elementu konfiguracji w postgresql.conf

TimeZone = 'localtime'

uruchom ponownie postgresql i sprawdź czas za pomocą „SELECT now ();” i „pokaż strefę czasową”;

MatteoBee
źródło