เขตเวลา PostgreSQL ไม่ตรงกับเขตเวลาของระบบ


17

ฉันมีการติดตั้ง PostgreSQL 9.2 หลายตัวซึ่งเขตเวลาที่ใช้โดย PostgreSQL คือ GMT แม้ว่าระบบทั้งหมดจะเป็น "ยุโรป / เวียนนา" ก็ตาม ผมสองตรวจสอบว่าpostgresql.confไม่ได้มีtimezoneการตั้งค่าเพื่อให้เป็นไปตามเอกสารที่มันควร fallback เขตเวลาของระบบ

อย่างไรก็ตาม

# 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 ในพฤติกรรมเริ่มต้น
Martin C.

ฐานข้อมูลของคุณควรอยู่ใน UTC (GMT) เสมอ ทำให้ง่ายต่อการเปรียบเทียบ สามารถเปลี่ยนเขตเวลาของลูกค้า / เซสชันได้ตลอดเวลา ตั้งค่าเขตเวลา x เป็น pg stackoverflow.com/questions/2532729/…
Neil McGuigan

มีวิธีใดที่จะระบุในpostgresql.confเวอร์ชัน 9.2+ ที่ควรตรวจพบเขตเวลาของสภาพแวดล้อมระบบโดยอัตโนมัติ
Kyle Strand

0

ฉันพบวิธีแก้ปัญหาสำหรับสิ่งนี้

เพียงสร้าง symlink ภายใน/ usr / share / zoneinfo / named localtime (หรือชื่ออะไรก็ได้ที่คุณต้องการ) เพื่อชี้ไปที่/ etc / localtime

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

วิธีนี้คุณจะสร้างชุดของลิงก์ที่ชี้ไปที่เขตเวลาของระบบในที่สุด

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

ตอนนี้ใช้ชื่อของลิงก์ที่คุณสร้าง ( localtimeในกรณีของฉัน) และใช้เป็นค่าของรายการการกำหนดค่าใน postgresql.conf

TimeZone = 'localtime'

รีสตาร์ท postgresql และตรวจสอบเวลาด้วย "SELECT now ();" และ "แสดงเขตเวลา"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.