-
PostgreSQL
物理存储介绍
我最初是为自己写这篇文章的,
我想对底层物理存储有足够的了解,
p>
以便能够掌握可能
影响数据库的其他概念。这篇文章可能更多的是针
对有类似兴趣的人,我会尽量保持准确,
但目的是让它更容易理解,所以我可能会忽略一
些细节。
您应该了解
Postgre
s
如何处理物理存储吗
?
也许不是,但
是如果您需要调查一些问题,
了解它是如何工作的是很有用的。
PostgreSQL
有一个关于这个主题的章节,但就我个人
而言,我不得不投入额外的资源
来理解它。
我发现很难浏览文档
的多个部分和外部资源,
所以这是我在一篇文章中收集基本
信息
的尝试。
在这篇文章中,
我没有费心重写所有内容,
所以在某些地方我重用了官方文档
中的段落。
<
/p>
在本文撰写时,
Postgres
的当前
版本是
9.5
,
这篇文章中的信息可能
在将来的版本中被
废弃。
为了演示本
文的例子,
我们假设有一个名为
foo
的数据库,
其中包含一个名为
bar
的
表。
一些术语
一旦你深入到有关存储的文档中,你就会遇到一些不太常见的术语,比如关系、元组、
堆、块、页
……
让我来解释一下它们的意思
< br>:
?
元组(
tuple
)或项(
item
)是行的同义词;
?
关系(
relation
)是表的同义词;
?
文件节点(
p>
filenode
)是表示对表或索引的引用的
id
;
?
块(
bl
ock
)和页(
page
)是相等的,
它们表示存储表的文件的
8kb
段信息;
?
堆(
heap
)是指堆文件(
heap file
< br>)
。堆文件是大小可变的无序记录列表。虽然共
享相似的
名称,但是堆文件与堆数据结构不同;
?
XID:
事务
ID
,也是
32
位的量。在长时间运转的数据库里,它也可能会重叠。重
叠后数据库就有可能出错,所以需要采取措施解决。
只要我们采取一些合适的维
护步骤,这并不是很要命的问题。比如我们定
义做
vaccum
。或者手动重置;
?
CTID
表示行数据在其表中的物理位置。
CTID
也是每个表都可以使
用的特殊列,
但除非特别提到,否则不可见。它由页码(物理块号)和项标识符的索引(
物理行
号)组成;
?
OID
代表对象标识符;
?
数据库集群(
database cluster
)
,我们称数据库集群为磁盘上的存储区域。数据库
集群是由运行中的数据库服务器的单个实例管理的数据库集合;
?
资料移除(
VACCUM
)
,
PostgreS
QL
数据库需要定期维护,称为资料移除。
如果您在本文的其余部分中遇到了这个术语,请不要感到惊讶
。在可能的情况下,
我在少数地方简化了内容。
我的数据库存储在哪里
数据库集群使用的数据文件一起存储在集群的数据目录中,通常称为
PGD
ATA(
在可用
于定义它的环境变量名称之后
< br>)
。根据您的操作系统或安装,
PGDATA
可以有不同的位置。
对于集群中的每个数据库,
PGDATA/base
中都有一个子目录,
< br>以
pg_database
中数据
库的
OID
命名。这个子目录是数据库文件的默认位置。
p>
如果希望列出集群中每个数据库的
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>
中。
现在,
我
们知道在文件系统中何处可以找到数据库,
所以让我们尝试找出在何处可以找
到表。
存储表的地方
每个表都存储在一个单独的文件中。
对于普通关系,
这些文
件是以表或索引的文件名命
名的,可以在表
pg_class<
/p>
的列
relfilenode
中找到。<
/p>
pg_class
是存在于
pg_cat
alog
模式中
的系统表。
当一个表超过
1gb
时,它被分成
GB
大小的段。第一个段的文件名与文件名相同
;<
/p>
随后
的段被命名为
filenode.1
,
filenode.2,
等等。这种
安排避免了在有文件大小限制的平台上出
现问题。
表的文件名通常与其
OID
匹配,但情况不一定如
此。要查找表文件名路径,可以在连
接到数据库时运行以下查询
:
select pg_relation_filepath('bar');
pg_relation_filepath
----------------------
base/17447/27741
如
果
您
不
想
要
路
径
,
p>
而
只
想
要
文
件
名
,
那
么
您
可
< br>以
使
用
具
有
相
同
参
数
的
函
数
pg_
relation_filenode
。对于数据库
OID
p>
,可以使用
oid2name
找到表的文件
名
> oid2name -d foo -t bar
From database
Filenode
Table Name
----------------------
27741 bar
系统表
在前一节中,我们讨论了一些关于系统表的内容,很有趣的是
,我们知道有一个系统
目录模式,其中包含您可能想要查询的表,以查找额外信息。
p>
创建数据库时,
除了公共模式和用户创建的模式外,
每个数据库还包含一个
p
g_catalog
模式,该模式包含系统表和所有内置数据类型、函数和操作符。
p>
pg_catalog
始终是搜索路
径的有
效部分,因此在查询系统表时不需要使用前缀。
一旦通过
psql
连接到您的数据库,您可以通过
以下方式列出系统表
:
dt pg_catalog.*
如何存储行
每个表都存储为固定大小
(
通常为
8Kb)
的页
面数组。在表中,所有页面在逻辑上是等
价的,因此可以在任何页面中存储特定的项
p>
(
行
)
。
用于存储表的结构是堆文件。堆文件是大小
可变的无序记录列表。堆文件的结构是一
组页面
(
或块
)
,每个页面包含一组项。术语
item
指的是存储在页面上的一行。
页面结构如下
:
-
-
-
-
-
-
-
-
-
上一篇:电脑的bios设置【非常全面】
下一篇:工厂常见英语单词