PostgreSQL 시간대가 시스템 시간대와 일치하지 않습니다


17

전체 시스템이 "유럽 / 비엔나"임에도 불구하고 PostgreSQL에서 사용하는 시간대가 GMT 인 여러 PostgreSQL 9.2 설치가 있습니다. 설정이 포함되어 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.2로 급격한 변화를 기대하지 않았기 때문에 항상 9.1 설명서를 우연히 발견했습니다.
Martin C.

데이터베이스는 항상 UTC (GMT) 여야합니다. 시간을 쉽게 비교할 수 있습니다. 클라이언트 / 세션의 시간대를 항상 변경할 수 있습니다. 시간대 x를 pg로 설정하십시오. stackoverflow.com/questions/2532729/…
닐 맥기 건

postgresql.conf버전 9.2 이상에서 시스템 환경 시간대를 자동으로 감지 하도록 지정할 방법이 있습니까?
Kyle Strand

0

이에 대한 해결 방법을 찾았습니다.

/ usr / share / zoneinfo / 안에 localtime (또는 원하는 이름) 이라는 심볼릭 링크를 만들어 / etc / localtime을 가리 킵니다.

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

이렇게하면 궁극적으로 시스템 시간대를 가리키는 링크 문자열을 만들 수 있습니다.

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

이제 생성 한 링크 이름 ( 필자의 경우 현지 시간 )을 postgresql.conf의 구성 항목 값으로 사용하십시오.

TimeZone = 'localtime'

postgresql을 다시 시작하고 "SELECT now ();"로 시간을 확인하십시오. "표준 시간대 표시"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.