在不同时区下进行 PostgreSQL 数据库备份和恢复

6

我有两个运行在不同时区的不同服务器上的数据库。其中有几个表包含 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个回答

7
Postgres的数据类型timstamptz(= timestamp with time zone)将值作为UTC时间戳内部存储(计算自2000年以来的微秒整数值),这与显示这些值的时区无关。它不像一些人所认为的那样存储任何时区信息,误判了名称。您可以随意转储和还原。
您在客户端中看到的内容取决于会话的时区设置
运行(在同一会话中避免产生伪像):
SHOW timezone;

如果您看到localtime,那么Postgres将使用您的服务器操作系统的默认设置。在您的会话中设置不同的时区(使用SET timezone = ...;),或者为您的用户或全局配置文件设置不同的时区,以查看您的时间戳格式不同。请注意,在这种情况下,转储文件中的时区设置没有任何影响,只有当前会话的设置才有效。关于设置环境变量的各种方法的详细说明,请参见以下相关答案:忽略Rails和PostgreSQL中的所有时区。关于设置环境变量的各种方法的详细说明,请参见以下相关答案:搜索路径如何影响标识符解析和“当前模式”

1
ALTER ROLE ... SET TIMEZONE= 用于导入角色,这个方法解决了我的问题。 - cske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接