关键词不能为空

当前您在: 主页 > 英语 >

PostgreSQL物理存储

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-13 11:37
tags:

-

2021年2月13日发(作者:pest是什么意思)


PostgreSQL


物理存储介绍



我最初是为自己写这篇文章的,


我想对底层物理存储有足够的了解,


以便能够掌握可能


影响数据库的其他概念。这篇文章可能更多的是针 对有类似兴趣的人,我会尽量保持准确,


但目的是让它更容易理解,所以我可能会忽略一 些细节。



您应该了解


Postgre s


如何处理物理存储吗


?


也许不是,但 是如果您需要调查一些问题,


了解它是如何工作的是很有用的。



PostgreSQL


有一个关于这个主题的章节,但就我个人 而言,我不得不投入额外的资源


来理解它。


我发现很难浏览文档 的多个部分和外部资源,


所以这是我在一篇文章中收集基本


信息 的尝试。


在这篇文章中,


我没有费心重写所有内容,

< p>
所以在某些地方我重用了官方文档


中的段落。


< /p>


在本文撰写时,


Postgres


的当前 版本是


9.5



这篇文章中的信息可能 在将来的版本中被


废弃。



为了演示本 文的例子,


我们假设有一个名为


foo


的数据库,


其中包含一个名为


bar


的 表。



一些术语


一旦你深入到有关存储的文档中,你就会遇到一些不太常见的术语,比如关系、元组、


堆、块、页


……


让我来解释一下它们的意思

< br>:


?



元组(


tuple


)或项(


item


)是行的同义词;



?



关系(


relation


)是表的同义词;



?



文件节点(


filenode


)是表示对表或索引的引用的

id




?



块(


bl ock


)和页(


page


)是相等的, 它们表示存储表的文件的


8kb


段信息;



?



堆(


heap


)是指堆文件(


heap file

< br>)


。堆文件是大小可变的无序记录列表。虽然共


享相似的 名称,但是堆文件与堆数据结构不同;



?



XID:


事务


ID


,也是



32


位的量。在长时间运转的数据库里,它也可能会重叠。重


叠后数据库就有可能出错,所以需要采取措施解决。



只要我们采取一些合适的维


护步骤,这并不是很要命的问题。比如我们定 义做


vaccum


。或者手动重置;



?



CTID


表示行数据在其表中的物理位置。


CTID


也是每个表都可以使 用的特殊列,


但除非特别提到,否则不可见。它由页码(物理块号)和项标识符的索引( 物理行


号)组成;



?



OID


代表对象标识符;



?



数据库集群(


database cluster



,我们称数据库集群为磁盘上的存储区域。数据库


集群是由运行中的数据库服务器的单个实例管理的数据库集合;



?



资料移除(


VACCUM




PostgreS QL


数据库需要定期维护,称为资料移除。




如果您在本文的其余部分中遇到了这个术语,请不要感到惊讶 。在可能的情况下,


我在少数地方简化了内容。




我的数据库存储在哪里


< p>
数据库集群使用的数据文件一起存储在集群的数据目录中,通常称为


PGD ATA(


在可用


于定义它的环境变量名称之后

< br>)


。根据您的操作系统或安装,


PGDATA

< p>
可以有不同的位置。



对于集群中的每个数据库,


PGDATA/base


中都有一个子目录,

< br>以


pg_database


中数据


库的


OID


命名。这个子目录是数据库文件的默认位置。



如果希望列出集群中每个数据库的


OID


,可以运行以下查询。




select oid, datname from pg_database;



oid | datname


-------+-------------


1 | template1


12398 | template0


12403 | postgres


17447 | foo




如果您正在寻找一个特定 数据库的


OID


,那么您可以在查询中添加一个


WHERE


子句


:



select oid, datname from pg_database WHERE datname = 'foo';



另一种查 找数据库


OID


的方法是使用命令行


o id2name


。它是一个实用程序,用于检查


Postgre SQL


使用的文件结构,以获得关于如何使用它的更多信息






$$> oid2name


All databases:


Oid Database Name Tablespace


----------------------------------



17447 foo pg_default



12398 template0 pg_default



1 template1 pg_default



上面的


OID


在您的系统中可能完全不同,但是现在我们知道,与数据库


foo

有关的所


有文件都存储在


PGDATA/base/174 47


中。如果您问自己,作为


pg_database


的表存储在


哪个数据库中,那么它们不是在


PG DATA/base


中,而是在


PGDATA/global< /p>


中。



现在,


我 们知道在文件系统中何处可以找到数据库,


所以让我们尝试找出在何处可以找

< p>
到表。




存储表的地方



每个表都存储在一个单独的文件中。


对于普通关系,


这些文 件是以表或索引的文件名命


名的,可以在表


pg_class< /p>


的列


relfilenode


中找到。< /p>


pg_class


是存在于


pg_cat alog


模式中


的系统表。



当一个表超过


1gb


时,它被分成


GB


大小的段。第一个段的文件名与文件名相同


;< /p>


随后


的段被命名为


filenode.1



filenode.2,


等等。这种 安排避免了在有文件大小限制的平台上出


现问题。


< p>
表的文件名通常与其


OID


匹配,但情况不一定如 此。要查找表文件名路径,可以在连


接到数据库时运行以下查询


:






select pg_relation_filepath('bar');


pg_relation_filepath


----------------------


base/17447/27741























< br>以


使












pg_ relation_filenode


。对于数据库


OID


,可以使用


oid2name


找到表的文件 名










> oid2name -d foo -t bar


From database


Filenode Table Name


----------------------


27741 bar


系统表






在前一节中,我们讨论了一些关于系统表的内容,很有趣的是 ,我们知道有一个系统


目录模式,其中包含您可能想要查询的表,以查找额外信息。




创建数据库时,


除了公共模式和用户创建的模式外,


每个数据库还包含一个


p g_catalog


模式,该模式包含系统表和所有内置数据类型、函数和操作符。


pg_catalog


始终是搜索路


径的有 效部分,因此在查询系统表时不需要使用前缀。



< p>
一旦通过


psql


连接到您的数据库,您可以通过 以下方式列出系统表


:




dt pg_catalog.*


如何存储行






每个表都存储为固定大小


(


通常为


8Kb)


的页 面数组。在表中,所有页面在逻辑上是等


价的,因此可以在任何页面中存储特定的项


(



)





用于存储表的结构是堆文件。堆文件是大小 可变的无序记录列表。堆文件的结构是一


组页面


(


或块


)


,每个页面包含一组项。术语


item


指的是存储在页面上的一行。




页面结构如下


:

-


-


-


-


-


-


-


-



本文更新与2021-02-13 11:37,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/649838.html

PostgreSQL物理存储的相关文章