9

我有兴趣获取 Linux OS 中 PostgreSQL 表中可用的表、视图、函数、数据/内容的物理位置。我有一个场景,PostgreSQL 可以安装在 SD 卡设施和硬盘中。如果我在 SD 中有表、视图、函数、数据,我想获取它们的物理位置,并在我希望替换存储空间时合并/复制到我的硬盘中。我希望数据库的存储应该是纯文件架构。

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

4

3 回答 3

7

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

SELECT pg_relation_filepath('my_table');

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

整个数据库由以下子目录表示PGDATA/base

如果您使用表空间,它会变得更加复杂。阅读手册中数据库文件布局一章的详细信息:

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

...

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

...

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

大胆强调我的。
关于功能的手册pg_relation_filepath()

于 2012-05-03T22:03:24.513 回答
5

该查询show data_directory;将向您显示主要数据目录。但这并不一定能告诉你东西存储在哪里。

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

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

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

于 2012-05-03T12:59:13.363 回答
3

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

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

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

于 2012-05-03T14:18:20.730 回答