【问题标题】:PostgreSQL dump and restore in different timezonePostgreSQL 在不同时区转储和恢复
【发布时间】:2013-11-28 15:02:46
【问题描述】:

我有两个数据库在不同时区的不同服务器上运行。有几个表包含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 或类似的方法进行这种转换?

【问题讨论】:

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


    【解决方案1】:

    Postgres 的数据类型 timstamptz ( = timestamp with time zone) 在内部将值存储为 UTC 时间戳(自 2000 年以来的整数值计数微秒),这些值与时区无关显示为了。它确实像某些人可能认为的那样存储任何时区信息,从而误判了名称。您可以随意转储和恢复。

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

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

    SHOW timezone;
    

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

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

    此相关答案中的详细说明:

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

    【讨论】:

    • ALTER ROLE ... SET TIMEZONE= 为我解决了角色导入
    猜你喜欢
    • 2012-01-19
    • 2020-12-28
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多