PostgreSQL 시간대가 시스템 시간대와 일치하지 않습니다 불구하고 PostgreSQL에서 사용하는

전체 시스템이 “유럽 / 비엔나”임에도 불구하고 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

어떤 힌트라도 미리 감사드립니다!



답변

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도구 가이 작업에 도움이 될 수 있습니다).


답변

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

/ 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 ();”로 시간을 확인하십시오. “표준 시간대 표시”


답변