【问题标题】:Get database creation date on PostgreSQL在 PostgreSQL 上获取数据库创建日期
【发布时间】:2014-09-08 11:27:10
【问题描述】:

我想在 POSTGRESQL 中获取数据库创建日期。 我的版本是在 Ubuntu 14.04 上运行的 9.3.4。 我可以使用select 语句来执行此操作,还是可以访问服务器来执行此操作?

【问题讨论】:

标签: database postgresql


【解决方案1】:

我完全同意 Craig Ringer(出色的答案!)...但就我的目的而言,这已经足够了:

SELECT (pg_stat_file('base/'||oid ||'/PG_VERSION')).modification, datname FROM pg_database;

简单干净(但超级用户)。

【讨论】:

  • 这是数据库的修改日期还是也可以视为创建日期?
  • 根据文档:“pg_stat_file 返回包含文件大小、最后访问时间戳、最后修改时间戳、最后文件状态更改时间戳(仅限 Unix 平台)、文件创建时间戳(Windows仅)和一个布尔值,指示它是否是一个目录。” .... 所以只有在 Windows 环境中,您才能使用“creation”属性。在我的 linux 机器中,“修改”属性足以获得伪创建日期。
【解决方案2】:

系统没有内置PostgreSQL数据库创建时间记录。所有依赖文件系统创建/修改时间的方法都可能产生错误的答案。

例如,如果您pg_basebackup 一个副本节点然后故障转移到它,则创建时间将显示为创建副本的时间。 pg_basebackup 不保留文件创建/修改时间,因为它们通常被认为与数据库系统的操作无关。

获取数据库创建时间的唯一可靠方法是在创建数据库时创建一个包含创建时间的 1 行表,然后设置权限/添加触发器以拒绝更新。

如果您不介意错误答案的风险,即报告的创建时间比实际时间要新得多,您可以查看base/[dboid]/PG_VERSION 文件的时间戳。 @鲍勃showed a useful way to do that

【讨论】:

    【解决方案3】:

    另一种解决方案:

    1. 查找数据库 OID:
    postgres=# select oid,datname from pg_database where datname='bars_paidserv';
    -[ RECORD 1 ]----------
    oid     | 5137290
    datname | bars_paidserv
    
    1. 进入数据库datatfiles(你可以通过执行show data_directory找到你的目录):

    cd /var/lib/postgresql/9.6/main/base

    1. 在您的 OID 中列出 PG_VERSION 文件:
    postgres@test-rp:~/9.6/main/base$ ls -l 5137290/PG_VERSION
    -rw------- 1 postgres postgres 4 Jan 29 12:34 5137290/PG_VERSION
    

    即我的数据库 bars_paidserv 的 OID 5137290 是在 1 月 29 日创建的。

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 2018-02-05
      • 2019-10-17
      • 1970-01-01
      • 2011-08-09
      • 2016-12-28
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多