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

9
我有兴趣获取PostgreSQL表格、视图、函数以及Linux操作系统中表格数据/内容的物理位置。如果PostgreSQL安装在SD卡和硬盘上,假设我有一些表格、视图、函数和数据存储在SD卡中,我希望能够随时将它们合并/复制到我的硬盘上,因此需要获取它们的物理位置。我希望数据库的存储方式是以普通文件的形式进行组织。
此外,是否可能查看这些文件的内容?也就是说,我可以访问它们吗?

3
可能是在Ubuntu中Postgres数据库文件保存的位置?的重复问题。 - Bruno
1
@Bruno:并不是完全相同的问题,显然也不是相同的答案。 - Mike Sherrill 'Cat Recall'
@Catcall 你说得没错。 - Bruno
3个回答

7

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

SELECT pg_relation_filepath('my_table');

如果你不确定自己在做什么,请勿直接操作文件。

PGDATA/base下的子目录代表整个数据库

如果使用表空间,情况会更加复杂。请在手册中的数据库文件布局章节阅读详细信息:

对于集群中的每个数据库pg_database中的OID命名了子目录。该子目录是数据库文件的默认位置;特别是其中存储了系统目录。

...

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

...

pg_relation_filepath()函数显示任何关系的完整路径(相对于PGDATA)。

粗体为强调部分。
有关函数pg_relation_filepath()的手册


+1,因为我不知道那个函数。但是pg_relation_filepath()对于数据库不起作用。对于数据库,我认为你仍然需要查看表空间。 - Mike Sherrill 'Cat Recall'
@Catcall:我在我的回答中添加了一些内容,包括数据库和指向手册的更复杂的涉及表空间的情况。 - Erwin Brandstetter
抱歉,Erwin。我已经给你点赞了一次。如果你想要更多积分,你就得教我一些我不知道的东西。 - Mike Sherrill 'Cat Recall'
1
@Catcall:事实上,情况正好相反:我正在采纳你的建议来改善我的答案。面向大众和OP。没想到今天还能在你对PostgreSQL的广泛知识中找到更多的漏洞。;) - Erwin Brandstetter

5
查询 show data_directory; 可以显示主数据目录。但这并不一定告诉您存储位置。
PostgreSQL 允许您定义新的表空间。表空间是文件系统中的命名目录。PostgreSQL 允许您将单个表、索引和整个数据库存储在任何可允许的表空间中。因此,如果一个数据库在特定的表空间中创建,我相信它的所有对象都不会出现在数据目录中。
要获取有关磁盘上存储位置的实时信息,您可能需要查询系统目录中的pg_databasepg_tablespacepg_tables。表空间信息也可以在 information_schema 视图中找到。
但是,对于合并或复制到硬盘的操作,使用这些文件几乎肯定是错误的。对于这种工作,pg_dump 是您的好朋友。

3
如果你想把磁盘文件复制作为备份形式,你应该阅读这篇文章,特别是关于连续归档和时间点恢复(PITR)的部分:http://www.postgresql.org/docs/current/interactive/backup.html
如果你考虑直接访问并解释磁盘文件中的数据,绕过数据库管理系统,这是一个非常糟糕的想法,原因有很多。首先,存储方案非常复杂。其次,每个新的主要版本(每年发布一次)它都会发生变化。第三,E.F. Codd的鬼魂可能会困扰你;请参见科德的12条规则的规则8、9、11和12。

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