Múi giờ PostgreSQL không khớp với múi giờ của hệ thống


17

Tôi có một số cài đặt PostgreQuery 9.2 trong đó múi giờ được PostgreSQL sử dụng là GMT, mặc dù toàn bộ hệ thống là "Châu Âu / Vienna". Tôi kiểm tra lại mà postgresql.confkhông không chứa timezonethiết lập, vì vậy theo các tài liệu cần dự phòng để múi giờ của hệ thống.

Tuy nhiên,

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

Bất kỳ gợi ý, nơi múi giờ GMT có thể đến từ đâu? Người dùng hệ thống không được TZthiết lập /etc/timezone/etc/timeinfodường như được cấu hình đúng.

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

Bất kỳ gợi ý được đánh giá cao, cảm ơn trước!

Câu trả lời:


24

Giá trị mặc định cho TimeZonecài đặt đã thay đổi khi phát hành 9.2:

(..) Nếu không được đặt rõ ràng, máy chủ sẽ khởi tạo biến này theo múi giờ được chỉ định bởi môi trường hệ thống của nó. (...)

(...) Mặc định tích hợp là GMT, nhưng thường được ghi đè trong postgresql.conf; initdb sẽ cài đặt một thiết lập ở đó tương ứng với môi trường hệ thống của nó. (...)

Điều đó có nghĩa là trước phiên bản 9.2, giá trị mặc định postgresql.confphải được đặt trong initdbgiai đoạn. Nếu bạn ghi đè giá trị đó (có thể sao chép giá trị cũ postgresql.conftrong khi nâng cấp từ các phiên bản cũ hơn), PostgreQuery sẽ sử dụng giá trị "GMT" làm mặc định.

Giải pháp cho trường hợp của bạn khá đơn giản, chỉ cần thay đổi TimeZonecài đặt postgresql.confthành giá trị bạn muốn:

TimeZone = 'Europe/Vienna'

Sau đó, bạn cần reloaddịch vụ:

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

Sau đó, tất cả các trường được lưu trữ dưới dạng timestamp with time zone(hoặc timestamptz) sẽ được hiển thị chính xác kể từ bây giờ. Nhưng bạn sẽ phải sửa bằng tay tất cả (cập nhật) các trường được lưu dưới dạng timestamp without time zone(hoặc timestamp).

Một lời khuyên tôi đưa ra cho mọi người khi nâng cấp PostgreSQL là không sao chép cụm cũ postgresql.confsang cụm mới (chú ý tôi không chắc đó là những gì bạn đã làm, nhưng tôi thấy vấn đề này rất giống nhau vì điều đó). Chỉ cần lấy cái được tạo bởi initdbvà thêm các sửa đổi (một diffcông cụ có thể phù hợp với nhiệm vụ này).


Cảm ơn rất nhiều, tôi đã không nhận thấy sự thay đổi này từ 9.1 đến 9.2. Có, việc thêm thông tin múi giờ vào postgresql.conf là một sửa chữa nhỏ, tôi không thể giải thích lý do tại sao nó sẽ quay trở lại GMT. Rõ ràng tôi chỉ vấp phải tài liệu 9.1 mọi lúc, vì tôi không mong đợi một sự thay đổi căn bản như vậy từ 9.1 đến 9.2 trong hành vi mặc định.
Martin C.

Cơ sở dữ liệu của bạn phải luôn ở UTC (GMT). Làm cho thời gian dễ dàng hơn để so sánh. Luôn có thể thay đổi múi giờ của khách hàng / phiên. Đặt múi giờ x tính bằng pg. stackoverflow.com/questions/2532729/
Neil McGuigan

Có cách nào để chỉ định trong postgresql.confphiên bản 9.2+ rằng múi giờ môi trường hệ thống vẫn sẽ được tự động phát hiện không?
Kyle Strand

0

Tôi tìm thấy một cách giải quyết cho việc này.

chỉ cần tạo một liên kết tượng trưng bên trong / usr / share / zoneinfo / tên localtime (hoặc bất kỳ tên bạn muốn) để được chỉ vào / etc / localtime

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

bằng cách này, bạn đang tạo một chuỗi các liên kết cuối cùng trỏ đến múi giờ của hệ thống.

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

Bây giờ, lấy tên của liên kết bạn đã tạo ( localtime trong trường hợp của tôi) và sử dụng nó làm giá trị của mục cấu hình trong postgresql.conf

TimeZone = 'localtime'

khởi động lại postgresql và kiểm tra thời gian với "CHỌN ngay bây giờ ();" và "hiển thị múi giờ;"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.