我有两个数据库在不同时区的不同服务器上运行。有几个表包含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或类似的方法来进行这种转换?
数据类型为timstamptz
(=timestamp with time zone
)的Postgres内部将值存储为UTC时间戳(自2000年以来以微秒计的整数值),该时间戳与显示这些值的时区无关。它确实而不是像一些人可能认为的那样存储任何时区信息,从而误判名称。您可以随意转储和恢复。
在客户端中看到的 内容取决于会话的时区设置。
运行(在同一会话中以避免工件):
SHOW timezone;
如果您看到localtime
,那么Postgres将使用服务器操作系统的默认设置。
设置不同的时区(在使用SET timezone = ...;
的会话中,为您的用户或在配置文件中全局设置),以查看不同格式的时间戳。请注意,转储文件中的时区设置在这种情况下没有任何效果,只有当前会话的设置有效果。
相关答案中的详细解释:
- 在Rails和PostgreSQL中完全忽略时区
关于设置环境变量的各种方法:
- search_ path如何影响标识符解析和"搜索路径";当前模式"