PostgreSQL timezone सिस्टम timezone से मेल नहीं खाता है


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)

कोई संकेत, जीएमटी समय क्षेत्र कहां से आ सकता है? सिस्टम उपयोगकर्ता के पास 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पुराने संस्करणों से अपग्रेड करते समय पुराने की नकल करते हैं) तो पोस्टग्रेक्यूएल डिफ़ॉल्ट रूप से "जीएमटी" मूल्य का उपयोग करेगा।

आपके मामले का समाधान काफी सरल है, बस 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 में टाइमजोन की जानकारी जोड़ना एक तुच्छ निर्धारण है, मैं अभी यह नहीं बता सका कि यह जीएमटी में वापस क्यों आएगा। जाहिरा तौर पर मैं सिर्फ 9.1 प्रलेखन पर हर समय ठोकर खाई, क्योंकि मैं डिफ़ॉल्ट व्यवहार में 9.1 से 9.2 तक इस तरह के मौलिक परिवर्तन की उम्मीद नहीं करता था।
मार्टिन सी।

आपका डेटाबेस हमेशा UTC (GMT) में होना चाहिए। तुलना करने में कई बार आसान हो जाता है। हमेशा ग्राहक / सत्र का समय क्षेत्र बदल सकते हैं। Pg में timezone x सेट करें। stackoverflow.com/questions/2532729/…
नील मैकगिगन

क्या postgresql.confसंस्करण 9.2+ के लिए निर्दिष्ट करने का कोई तरीका है कि सिस्टम वातावरण टाइमज़ोन अभी भी स्वचालित रूप से पता लगाया जाना चाहिए?
काइल स्ट्रैंड

0

मुझे इसके लिए वर्कअराउंड मिला।

सिर्फ एक सिमलिंक में बनाते / usr / share / zoneinfo / नामित स्थानीयसमय (या जो भी नाम आप चाहें तो) पर इंगित किए जाने की / etc / स्थानीयसमय

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

इस तरह आप लिंक की एक स्ट्रिंग बना रहे हैं जो अंततः आपके सिस्टम के टाइमज़ोन पर इंगित करता है।

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

अब आपके द्वारा बनाए गए लिंक का नाम लें ( मेरे मामले में स्थानीय समय ) और इसे postgresql.conf में कॉन्फ़िगरेशन आइटम के मूल्य के रूप में उपयोग करें

TimeZone = 'localtime'

Postgresql को पुनरारंभ करें और "अभी चयन करें ();" और "टाइमज़ोन दिखाओ!"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.