PostgreSQL saat dilimi sistem saat dilimi ile eşleşmiyor


17

Tüm sistemin "Europe / Vienna" olmasına rağmen PostgreSQL tarafından kullanılan zaman diliminin GMT olduğu birkaç PostgreSQL 9.2 kurulumum var. Bunu iki kere kontrol postgresql.confetmez değil içermez timezonebu nedenle sistemin saat dilimine çare olmalıdır belgelere göre, ayarı.

Ancak,

# 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 saat dilimi nereden gelebilir? Sistem kullanıcı sahip değil TZayarlamak ve /etc/timezoneve /etc/timeinfodoğru yapılandırılmış gibi görünüyor.

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

Herhangi bir ipucu takdir, şimdiden teşekkürler!

Yanıtlar:


24

Ayar için varsayılan değer TimeZonesürüm 9.2'de değişmiştir:

(..) Açık bir şekilde ayarlanmazsa, sunucu bu değişkeni sistem ortamı tarafından belirtilen saat dilimine başlatır. (...)

(...) Yerleşik varsayılan GMT'dir, ancak postgresql.conf dosyasında genellikle geçersiz kılınır; initdb oraya sistem ortamına karşılık gelen bir ayar yükleyecektir. (...)

Bu, 9.2 sürümünden önce adresindeki varsayılan değerin faz postgresql.confsırasında ayarlanması gerektiği anlamına gelir initdb. Bu değeri geçersiz kılarsanız (muhtemelen postgresql.confeski sürümlerden yükseltme yaparken eski kopyalanır ) PostgreSQL varsayılan olarak "GMT" değerini kullanır.

Durumunuzun çözümü oldukça basittir, sadece TimeZoneayarı postgresql.confistediğiniz değere değiştirin :

TimeZone = 'Europe/Vienna'

Bundan sonra reloadservise ihtiyacınız var :

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

Ardından timestamp with time zone(veya timestamptz) olarak kaydedilen tüm alanlar bundan böyle doğru şekilde gösterilecektir. Ancak, timestamp without time zone(veya timestamp) olarak depolanan alanları el ile düzeltmeniz (güncellemeniz) gerekecektir .

PostgreSQL'i yükselten herkese verdiğim bir ipucu, eskiyi postgresql.confyeni kümeye kopyalamak değil (ne yaptığınızdan emin değilim, ancak bu aynı sorunu çok fazla gördüm). Sadece tarafından oluşturulanı alın ve initdbdeğişiklikleri ekleyin (bir diffaraç bu görev için bir avuç olabilir).


Çok teşekkürler, 9.1'den 9.2'ye bu değişikliği fark etmedim. Evet, postgresql.conf saat dilimi bilgilerini eklemek önemsiz bir düzeltme, sadece neden GMT'ye geri düşeceğini açıklayamadım. Görünüşe göre ben sadece 9.1 belgelerini her zaman tökezledi, çünkü varsayılan davranışta 9.1'den 9.2'ye radikal bir değişiklik beklemezdim.
Martin C.

Veritabanınız her zaman UTC (GMT) olmalıdır. Karşılaştırmak için zamanları kolaylaştırır. İstemci / oturumun saat dilimini her zaman değiştirebilir. Saat dilimi x'i pg olarak ayarlayın. stackoverflow.com/questions/2532729/…
Neil McGuigan 04

postgresql.conf9.2 ve sonraki sürümlerde sistem ortamı saat diliminin otomatik olarak algılanması gerektiğini belirtmenin bir yolu var mı ?
Kyle Strand

0

Bunun için bir çözüm buldum.

/ etc / localtime adresini işaret etmek için / usr / share / zoneinfo / adlı localtime (veya istediğiniz herhangi bir ad) içinde bir symlink oluşturun

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

böylece sisteminizin saat dilimini gösteren bir dizi bağlantı oluşturursunuz.

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

Şimdi oluşturduğunuz bağlantının adını alın ( benim durumumda yerel saat ) ve postgresql.conf dosyasındaki yapılandırma öğesinin değeri olarak kullanın

TimeZone = 'localtime'

postgresql'i yeniden başlatın ve zamanı "SELECT now ();" ve "saat dilimini göster"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.