PostgreSQL在不同的时区转储和恢复

时间:2013-11-28 15:02:46

标签: postgresql timezone timestamp pg-dump pg-restore

我有两个数据库在不同时区的不同服务器上运行。有几个表包含timestamp with timezone

我需要从一个数据库转储数据,然后使用正确的时间戳和正确的时区将其导入另一个数据库。

我使用以下命令转储数据:

pg_dump -a DB_NAME > dump.sql

我看到数据采用旧时间戳和时区格式: 2013-11-29 14:30:00+02

然后我使用命令到另一台服务器来恢复转储:

psql -d DB_NAME -f dump.sql

我看到时间戳和时区来自旧服务器 - 我认为这是正常的。

然后我尝试将以下命令放在dump.sql的开头

SET timezone ...

但仍然无效。 :(

这是一次性操作。一旦传输数据不需要同步。有没有办法使用pg_dump和pg_restore或类似的方法进行这种转换?

1 个答案:

答案 0 :(得分:6)

Postgres数据类型timstamptz(= timestamp with time zone)在内部存储值为UTC时间戳(自2000年以来计算微秒的整数值),这与显示的值的时区无关 for。 存储任何时区信息,例如某些人可能会想到的,错误判断名称。您可以根据需要进行转储和恢复。

您在客户端中 看到 的内容取决于会话的time zone setting

运行(在同一会话中避免伪像):

SHOW timezone;

如果您看到localtime,则Postgres会使用您服务器操作系统的默认设置。

为您的用户设置一个不同的时区(在SET timezone = ...;的会话中,或在配置文件中设置全局),以查看不同格式的时间戳。请注意转储文件中的时区设置在这种情况下有效,只有当前会话的设置有效。

相关答案中的详细解释:

关于设置环境变量的各种方法: