Die PostgreSQL-Zeitzone stimmt nicht mit der Systemzeitzone überein

17

Ich habe mehrere PostgreSQL 9.2-Installationen, bei denen die von PostgreSQL verwendete Zeitzone GMT ist, obwohl das gesamte System "Europa / Wien" ist. Ich doppelt überprüft , dass postgresql.confsie nicht enthält timezoneEinstellung, so nach der Dokumentation es auf das System des Zeitzone Rückfall soll.

Jedoch,

# 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)

Irgendwelche Tipps, woher die GMT-Zeitzone kommen könnte? Der Systembenutzer hat TZund eingestellt /etc/timezoneund /etc/timeinfoscheint richtig konfiguriert zu sein.

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

Alle Hinweise sind dankbar, danke im Voraus!

Martin C.
quelle

Antworten:

24

Der Standardwert für die TimeZoneEinstellung wurde in Release 9.2 geändert:

(..) Wenn nicht explizit festgelegt, initialisiert der Server diese Variable auf die von seiner Systemumgebung angegebene Zeitzone. (...)

(...) Die integrierte Standardeinstellung ist GMT, diese wird jedoch in der Regel in postgresql.conf überschrieben. initdb installiert dort eine Einstellung, die seiner Systemumgebung entspricht. (...)

Was bedeutet, dass vor Version 9.2 der Standardwert bei postgresql.conf während der initdbPhase festgelegt werden sollte. Wenn Sie diesen Wert überschreiben (wahrscheinlich das alte kopieren, postgresql.confwährend Sie ein Upgrade von älteren Versionen durchführen), verwendet PostgreSQL standardmäßig den Wert "GMT".

Die Lösung für Ihren Fall ist ganz einfach, ändern Sie einfach die TimeZoneEinstellung aufpostgresql.conf den gewünschten Wert:

TimeZone = 'Europe/Vienna'

Danach musst du reload Service:

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

Dann werden alle Felder als timestamp with time zone(odertimestamptz werden ab sofort ) korrekt angezeigt. Sie müssen jedoch alle als timestamp without time zone(oder timestamp) gespeicherten Felder manuell korrigieren (aktualisieren ).

Ein Tipp, den ich jedem geben kann, der PostgreSQL aktualisiert, ist, nicht den alten postgresql.confin den neuen Cluster zu kopieren (beachten Sie, dass ich nicht sicher bin, ob es das war, was Sie getan haben, aber ich habe genau dasselbe Problem gesehen). Holen Sie sich einfach die von initdbund fügen Sie die Änderungen hinzu (ein diffTool kann für diese Aufgabe eine Handvoll sein).

MatheusOl
quelle
Vielen Dank, ich habe diese Änderung von 9.1 auf 9.2 nicht bemerkt. Ja, das Hinzufügen der Zeitzoneninformationen zu postgresql.conf ist ein trivialer Fix. Ich konnte nur nicht erklären, warum es auf GMT zurückgreifen würde. Anscheinend bin ich die ganze Zeit nur über die 9.1-Dokumentation gestolpert, da ich eine so radikale Änderung des Standardverhaltens von 9.1 auf 9.2 nicht erwartet hätte.
Martin C.
Ihre Datenbank sollte jedoch immer in UTC (GMT) sein. Macht mal einfacher zu vergleichen. Kann immer die Zeitzone des Clients / der Sitzung ändern. Stellen Sie die Zeitzone x in Seiten ein. stackoverflow.com/questions/2532729/…
Neil McGuigan
Gibt es eine Möglichkeit, in postgresql.confVersion 9.2+ anzugeben, dass die Zeitzone der Systemumgebung weiterhin automatisch erkannt werden soll?
Kyle Strand
0

Ich habe einen Workaround dafür gefunden.

Erstellen Sie einfach einen Symlink in / usr / share / zoneinfo / named localtime (oder einen beliebigen Namen, den Sie möchten), der auf / etc / localtime verweist

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

Auf diese Weise erstellen Sie eine Reihe von Links, die letztendlich auf die Zeitzone Ihres Systems verweisen.

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

Nehmen Sie nun den Namen des von Ihnen erstellten Links ( in meinem Fall localtime ) und verwenden Sie ihn als Wert des Konfigurationselements in postgresql.conf

TimeZone = 'localtime'

starte postgresql neu und überprüfe die Zeit mit "SELECT now ();" und "Zeitzone anzeigen".

MatteoBee
quelle