Часовий пояс PostgreSQL не відповідає системному часовому поясу


17

У мене є кілька установок PostgreSQL 9.2, де часовий пояс, який використовує PostgreSQL, є GMT, незважаючи на те, що вся система "Європа / Відень". Я двічі перевірив , що postgresql.confце НЕ містить timezoneнастройки, тому в відповідно до документації вона повинна Відкат до часового поясу системи.

Однак,

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

Будь-які підказки, звідки міг би з’явитися часовий пояс GMT? Користувач системи не TZвстановив /etc/timezoneі, /etc/timeinfoздається, правильно налаштований.

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

Будь-які підказки вдячні, заздалегідь дякую!

Відповіді:


24

Значення за замовчуванням для TimeZoneпараметра змінилось у версії 9.2:

(..) Якщо явно не встановлено, сервер ініціалізує цю змінну до часового поясу, визначеного її системним середовищем. (...)

(...) Вбудований за замовчуванням - GMT, але це зазвичай переосмислюється у postgresql.conf; initdb встановить там налаштування, що відповідає його системному середовищу. (...)

Що означає, що до версії 9.2 значення фактора за замовчуванням postgresql.confслід встановлювати під час initdbфази. Якщо ви перекрили це значення (можливо, копіюючи стару postgresql.confпід час оновлення до старих версій), PostgreSQL використовуватиме значення "GMT" за замовчуванням.

Рішення для вашої справи досить просте, просто змініть TimeZoneналаштування на postgresql.confпотрібне значення:

TimeZone = 'Europe/Vienna'

Після цього вам потрібно reloadскористатися сервісом:

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

Тоді всі поля, збережені як timestamp with time zone(або timestamptz), відтепер будуть показані правильно. Але вам доведеться вручну виправити всі (оновити) поля, збережені як timestamp without time zone(або timestamp).

Порада, яку я даю всім, хто оновлює PostgreSQL, - це не копіювати старий postgresql.confу новий кластер (зауважте, я не впевнений, чи це ви зробили, але через цю проблему я бачив дуже багато цієї проблеми). Просто отримайте таку, яку генерує initdbта додайте модифікації ( diffінструмент може бути корисним для цього завдання).


Велике спасибі, я не помітив цієї зміни з 9,1 до 9,2. Так, додавання інформації про часовий пояс до postgresql.conf є тривіальним виправленням, я просто не міг пояснити, чому він повернеться до GMT. Мабуть, я весь час просто натрапляв на документацію 9.1, тому що я б не очікував такої радикальної зміни з поведінки за замовчуванням від 9,1 до 9,2.
Мартін К.

Ваша база даних завжди повинна бути в UTC (GMT). Спрощує порівняння в рази. Завжди може змінити часовий пояс клієнта / сесії. Встановити часовий пояс x у pg. stackoverflow.com/questions/2532729/…
Ніл МакГуйган

Чи є у postgresql.confверсії 9.2+ спосіб вказати, що часовий пояс системного середовища все ж повинен бути автоматично виявлений?
Кайл Странд

0

Я знайшов вирішення цього питання.

просто створити символічне посилання в / USR / частки / ZoneInfo / імені МестноеВремя (або будь-яке ім'я ви хочете) , щоб вказувати на / та т.д. / МестноеВремя

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

таким чином ви створюєте рядок посилань, який в кінцевому підсумку вказує на часовий пояс вашої системи.

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

Тепер візьміть назву створеного вами посилання ( у моєму випадку місцевий час ) і використовуйте його як значення елемента конфігурації в postgresql.conf

TimeZone = 'localtime'

перезапустіть postgresql і перевірте час за допомогою "SELECT now ();" та "показати часовий пояс;"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.