PostgreSQL数据库中对象的物理位置?

时间:2012-05-03 12:43:36

标签: postgresql database-design data-storage

我有兴趣获取Linux OS中PostgreSQL表中可用的表,视图,函数,数据/内容的物理位置。我有一个场景,PostgreSQL可以安装在SD卡设备和硬盘上。如果我在SD中有表格,视图,功能,数据,我希望获得相同的物理位置,并在我希望更换存储空间时合并/复制到我的硬盘中。我希望数据库的存储应该是普通文件架构。

此外,是否可以查看文件的内容?我的意思是,我可以访问它们吗?

3 个答案:

答案 0 :(得分:6)

Kevin和Mike已经提供了查找数据目录的指针。对于文件系统中的物理位置,请使用:

SELECT pg_relation_filepath('my_table');

除非你确切知道自己在做什么,否则不要直接弄乱文件。

数据库作为一个整体由PGDATA/base中的子目录表示:

如果使用表空间,则会变得更复杂。请阅读Database File Layout in the manual一章中的详细信息:

  

对于群集中的每个数据库,其中都有一个子目录   PGD​​ATA / base,以pg_database中数据库的OID命名。这个   子目录是数据库文件的默认位置;在   特别是,它的系统目录存储在那里。

...

  

每个表和索引都存储在一个单独的文件中。对于平凡   关系,这些文件以表或索引的 filenode 命名   号码,可在pg_class.relfilenode中找到。

...

  

pg_relation_filepath() 函数显示整个路径(相对于   PGD​​ATA)任何关系。

大胆强调我的 The manual about the function pg_relation_filepath()

答案 1 :(得分:5)

查询show data_directory;将显示主数据目录。但这并不一定能告诉你存储的位置。

PostgreSQL允许您定义新的tablespaces。表空间是文件系统中的命名目录。 PostgreSQL允许您在任何允许的表空间中存储单个表,索引和整个数据库。因此,如果在特定的表空间中创建了数据库,我相信它的任何对象都不会出现在数据目录中。

有关磁盘上存储内容的可靠运行时信息,您可能需要从系统目录中查询pg_databasepg_tablespacepg_tables。表空间信息也可能在information_schema视图中可用。

但是对于合并或复制到您的硬盘,使用这些文件几乎肯定是一件坏事。对于那种工作,pg_dump是你的朋友。

答案 2 :(得分:3)

如果您正在讨论将磁盘文件复制为备份形式,您应该阅读此内容,尤其是有关连续存档和时间点恢复(PITR)的部分:

http://www.postgresql.org/docs/current/interactive/backup.html

如果您正在考虑尝试直接访问和解释磁盘文件中的数据,绕过数据库管理系统,出于很多原因,这是一个非常糟糕的主意。首先,存储方案非常复杂。另一方面,它往往会在每个新的主要版本中发生变化(每年发布一次)。第三,E.F. Codd的幽灵可能会困扰你;见Codd's 12 rules的规则8,9,11和12。