PG的物理结构
http://ke.sandata.com.cn/course/26/task/379/show
1 数据库的体系架构分解
PostgreSQL体系架构之物理结构
Oracle
mysql
Greenplum
redis
体系架构:
逻辑结构
物理结构
进程结构
内存结构
PG的物理结构:
ORACLE的物理结构:
相关的问题(参数文件 控制文件 密码文件 数据文件|数据 UNDO TEMP REDO)
2 PG的物理结构
本质上都是PG的相关一些文件
- DATABASE CLUSTER 数据库集簇–多个数据库的集合
- BASE目录(包含一系列子目录和文件)
-bash-4.2$ tree -L 1 -d /pgdata/10/data
/pgdata/10/data --数据目录
├── base --表和索引文件存放目录
├── global --影响全局的系统表存放目录
├── pg_commit_ts --事务提交时间戳数据存放目录
├── pg_dynshmem --被动态共享所使用的文件存放目录
├── pg_logical --用于逻辑复制的状态数据
├── pg_multixact --多事务状态的数据
├── pg_notify --LISTEN/NOTIFY状态的数据
├── pg_replslot --复制槽数据存放目录
├── pg_serial --已提交的可序列化信息存放目录
├── pg_snapshots --快照
├── pg_stat --统计信息
├── pg_stat_tmp --统计信息子系统临时文件
├── pg_subtrans --子事务状态数据
├── pg_tblspc --表空间
├── pg_twophase --预备事务状态文件
├── pg_wal --事务日志(预写日志)
└── pg_xact --日志提交状态的数据存放目录
文件和目录相关作用描述
files | description |
---|---|
PG_VERSION | 包含postgresql主版本号的文件 |
pg_hba.conf | 控制postgresql客户端验证的文件 |
pg_ident.conf | 控制postgresql用户名映射的文件 |
postgresql.conf | 配置参数文件 |
postgresql.auto.conf | 用于存储在ALTER SYSTEM(版本9.4或更高版本)中设置的配置参数的文件 |
postmaster.opts | 记录服务端上一次启动的命令行选项 |
subdirectories | description |
base/ | 包含每个数据库子目录的子目录 |
global/ | 包含群集范围表的子目录,例如pg_database和pg_control |
pg_commit_ts/ | 包含事务提交时间戳数据的子目录。 9.5版本以后 |
pg_clog/ (Version 9.6 or earlier) | 包含事务提交状态数据的子目录。它在版本10中重命名为pg_xact. CLOG将在5.4章节中详解。. |
pg_dynshmem/ | 包含动态共享内存子系统使用的文件的子目录。9.4版本以后 |
pg_logical/ | 包含逻辑解码的状态数据的子目录。9.4版本以后 |
pg_multixact/ | 包含多事务状态数据的子目录(用于 shared row locks) |
pg_notify/ | 包含LISTEN / NOTIFY状态数据的子目录 |
pg_repslot/ | 包含复制槽数据的子目录(9.1版本以后) |
pg_serial/ | 包含有关已提交的序列化事务(9.1版本以后)信息的子目录 |
pg_snapshots/ | 包含导出快照的子目录(9.2版本以后)。 PostgreSQL的函数pg_export_snapshot在此子目录中创建快照信息文件 |
pg_stat/ | 包含统计子系统永久文件的子目录 |
pg_stat_tmp/ | 包含统计子系统临时文件的子目录 |
pg_subtrans/ | 包含子事物状态数据的子目录 |
pg_tblspc/ | 表空间符号链接目录 |
pg_twophase/ | 包含prepare事务的状态文件 |
pg_wal/ (Version 10 or later) | 包含WAL(Write Ahead Logging)段文件的子目录。在版本10中从pg_xlog重命名而来. |
pg_xact/ (Version 10 or later) | 包含事务提交状态数据的子目录。在版本10中从pg_clog重命名而来.CLOG将在5.4章节中详解 |
pg_xlog/ (Version 9.6 or earlier) | 包含WAL(Write Ahead Logging)段文件的子目录。在版本10中重命名为pg_ |
重要一些文件
pg_hba.conf 控制PG客户端认证文件
主机 数据库 用户 ip地址 认证方式
pg_ident.conf 控制PG用户名映射的文件
配置操作系统用户和数据库服务器上的用户映射
postgresql.conf 控制PG数据库的参数文件
PG_VERSION 存放PG的主版本号的文件
postgresql.auto.conf 存储使用alter system 修改的配置文件(9.4以后)
postmaster.opts 记录服务器上一次启动的命令行选项
postmaster.pid 伴随数据库服务一起启动,数据数据库进程编号,PGDATA端口等
数据库有两个基础的对象 一个是oid,一个是表空间。
oid是数据库对象的标识。
表空间实际上是文件系统中的一个位置链接,即一个目录,它是一个逻辑上的概念,目录是它的物理存在方式。数据库中创建的对象(表、索引、数据库对象)都保存在表空间中。postgresql初始化完成后,会有两个默认的表空间,一个是pg_default,如果用户建表时没有指定表空间,所有新建的表都会放在pg_default中,另一个是pg_global,存放的是整个实例数据库所共享的系统表。
2.1 base的物理布局设计
每个数据库都会在$PGDATA/base下面生成一个子目录,如下图,都会一一对应。
[root@yanwei base]# ls -ltr
total 48
drwx------. 2 postgre postgre 8192 Jan 28 2019 13211
drwx------. 2 postgre postgre 8192 May 12 23:07 13212
drwx------. 2 postgre postgre 8192 May 12 23:07 1
drwx------ 2 postgre postgre 8192 May 12 23:07 16387
postgre=# select datname,oid from pg_database;
datname | oid
-----------+-------
postgres | 13212
postgre | 16387
template1 | 1
template0 | 13211
(4 rows)
表空间跟数据库关系
在Oracle数据库中;一个表空间只属于一个数据库使用;而一个数据库可以拥有多个表空间。属于"一对多"的关系
在PostgreSQL集群中;一个表空间可以让多个数据库使用;而一个数据库可以使用多个表空间。属于"多对多"的关系。
系统自带表空间
表空间pg_default是用来存储系统目录对象、用户表、用户表index、和临时表、临时表index、内部临时表的默认空间。对应存储目录
P
A
D
A
T
A
/
b
a
s
e
/
表
空
间
p
g
g
l
o
b
a
l
用
来
存
放
系
统
字
典
表
;
对
应
存
储
目
录
PADATA/base/ 表空间pg_global用来存放系统字典表;对应存储目录
PADATA/base/表空间pgglobal用来存放系统字典表;对应存储目录PADATA/global/
2.2 表和索引的物理布局设计
每一个表和索引如果不超过1G大小,都只有一个文件。表和索引也有和数据库一样的OID,另外还有一个relfilenode,这个值不会总是匹配OID,在发生一truncate,reindex,cluster等相关的操作,会发生变化,见如下示例:
可以看到开始oid和relfilenode是一样的,truncate后,relfilenode发生了变化.
[postgre@yanwei 24581]$ psql -U yanwei -d yanwei
psql (10.6)
Type "help" for help.
yanwei=>
yanwei=> create table test (id int,name varchar(10));
CREATE TABLE
SELECT relname, oid, relfilenode FROM pg_class WHERE relname = 'test';
yanwei=> SELECT relname, oid, relfilenode FROM pg_class WHERE relname = 'test';
relname | oid | relfilenode
---------+-------+-------------
test | 24582 | 24582
(1 row)
yanwei=>
[root@yanwei 24581]# ls -l 24582*
-rw------- 1 postgre postgre 0 May 13 00:16 24582
[root@yanwei 24581]# pwd
/mydata/pgdata/yanwei_tbs/PG_10_201707211/24581
[root@yanwei 24581]#
truncate table test
yanwei=> truncate table test;
TRUNCATE TABLE
yanwei=>
SELECT relname, oid, relfilenode FROM pg_class WHERE relname = 'test';
yanwei=> SELECT relname, oid, relfilenode FROM pg_class WHERE relname = 'test';
relname | oid | relfilenode
---------+-------+-------------
test | 24582 | 24585
(1 row)
yanwei=>
yanwei=> SELECT pg_relation_filepath('test');
pg_relation_filepath
---------------------------------------------
pg_tblspc/24580/PG_10_201707211/24581/24585
(1 row)
如果表和索引超过1GB, PostgreSQL对该表或者索引会进行拆分
relfilenode.1形成一个新文件,如果该新文件也被装满(1GB),那么
efilenode2就会是一个新文件
insert into test select id, id||'adfadfasdf'
from generate series(1, 25000000)id
[postgres@sdedu 17306]S ll-h 17310
-rw------1 postgres postgres 1.0G Feb 4 20: 14 17310
-rw------ 1 postgrespostgres 221M Feb 4 20: 14 17310.1
rw-------1 postgrespostgres 336K Feb 4 20: 1317310 fsm
如果想要更改表和索引文件的大小,那么使用编译安装参数
如果想要更改表和索引文件的大小,那么使用编译安装参数
如果数据数据文件超过1GB,那么就会新生成一个文件,如下:
cd $PGDATA
$ ls -la -h base/16384/19427*
-rw------- 1 postgres postgres 1.0G Apr 21 11:16 data/base/16384/19427
-rw------- 1 postgres postgres 45M Apr 21 11:20 data/base/16384/19427.1
注意:表和索引的文件大小的限制可以在编译的时候通过–with-segsize设置。
如果使用 delete删除了部分数据,那么 vacuum表是不会释放
copy数据到新表
drop旧日表
rename新表名称为旧表名称
CTAS Where 1=0
CREATE TABLE tname(like旧表)
注意的一点,空间 vacuum回收了,但是物理文件依然存在,不会被删除
*.fsm *.vm
fsm(free space mapping)
vm(visuable mapping)
空闲空间映射文件表文件每个页面上的空闲空间信息
可见性映射文件表文件每个页面上的可见性信
但是索引没有可见性映射文件,只有fsm
空闲空间映射文件是表和索引数据文件的第一个分支
可见性映射表时数据文件的第二个分支
2.3表空间物理结构
在以下两种典型场景之下,我们可能会创建自定义表空间:
通过创建表空间解决已有表空间磁盘不足并无法逻辑扩展的问题;
将索引、WAL、数据库文件分配在性能不同的磁盘上,使硬件利用率何性能最大化。
用户自定义表空间会在pg_tbsspc目录创建ln软链接到指定表空间目录。表空间创建命令参考:
在PG中,除了base目录,自己新建的tablespace对应的目录都会再pg_tblspc下,如下图
2.3.1 默认表空间
默认表空间
pg_default默认表空间对应数据目录为 base, 上面5个数据库分别以oid方式在base目录下存放。
postgres=# \db+
List of tablespaces
Name | Owner | Location | Access privileges | Options | Size | Description
------------±---------±---------±------------------±--------±-------±------------
pg_default | postgres | | | | 37 MB |
pg_global | postgres | | | | 574 kB |
(2 rows)
2.3.2 postgre对象标识符 OID 查询方法
s=# select oid, datname, datlastsysoid, dattablespace from pg_catalog.pg_database order by 1,2;
oid | datname | datlastsysoid | dattablespace
-------±----------±--------------±--------------
1 | template1 | 13286 | 1663 < 数据库模板
13286 | template0 | 13286 | 1663 < 最精简数据库,不可修改
13287 | postgres | 13286 | 1663 < 默认数据库
16394 | db01 | 13286 | 1663 < 用户数据库
16395 | db02 | 13286 | 1663 < 用户数据库
(5 rows)
[postgres@postgresql01 ~]$ tree -L 1 /pgdata/11.2/data/base/
/pgdata/11.2/data/base/
├── 1
├── 13286
├── 13287
├── 16394
└── 16395
5 directories, 0 files
2.3.3 用户表空间操作
在以下两种典型场景之下,我们可能会创建自定义表空间:
- 通过创建表空间解决已有表空间磁盘不足并无法逻辑扩展的问题;
- 将索引、WAL、数据库文件分配在性能不同的磁盘上,使硬件利用率何性能最大化。
PostgreSQL表空间的布局
表空间概念上逻辑,形式上物理
使用 CREATE TABLESPACE创建表空间
它的命名方式PG主版本号目录的版本号:PG_10201707211
表空间可以存放在服务器上面 Postgres用户可以读写的任意目录
但是在 pg tbsp中会同时创建一个软连接,这个软连接的目录值与
表空间的0D值相同
[root@yanwei pgdata]# cd pg_tblspc/
[root@yanwei pg_tblspc]# ll
total 0
lrwxrwxrwx 1 postgre postgre 25 May 13 00:03 24580 -> /mydata/pgdata/yanwei_tbs
[root@yanwei pg_tblspc]#
1 创建目录和用户
[postgre@yanwei pgdata]$ mkdir yanwei_tbs
[postgre@yanwei pgdata]$ psql
psql (10.6)
Type "help" for help.
postgre=# create user yanwei with encrypted password 'yanwei';
2 创建表空间
postgre=# create tablespace yanwei_tbs owner yanwei
postgre-# location '/mydata/pgdata/yanwei_tbs';
WARNING: tablespace location should not be inside the data directory
3 创建database
postgre=# create database yanwei with owner='yanwei'
postgre-# TEMPLATE=template1
postgre-# TABLESPACE='yanwei^C
postgre=# create database yanwei with owner=yanwei
postgre-# TEMPLATE=template1
postgre-# TABLESPACE=yanwei_tbs
postgre-# ;
CREATE DATABASE
postgre=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+---------+----------+-------------+-------------+-------------------
--
postgre | postgre | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgre | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgre | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgre
+
| | | | | postgre=CTc/postgr
e
template1 | postgre | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgre
+
| | | | | postgre=CTc/postgr
e
yanwei | yanwei | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
(5 rows)
postgre=#
drwx------ 3 postgre postgre 19 May 13 00:09 PG_10_201707211
[postgre@yanwei yanwei_tbs]$ cd PG_10_201707211/
[postgre@yanwei PG_10_201707211]$ ls
24581
[postgre@yanwei PG_10_201707211]$ cd 24581/
[postgre@yanwei 24581]$ ls
[root@yanwei pgdata]# cd pg_tblspc/
[root@yanwei pg_tblspc]# ll
total 0
lrwxrwxrwx 1 postgre postgre 25 May 13 00:03 24580 -> /mydata/pgdata/yanwei_tbs
[root@yanwei pg_tblspc]#
比如新建一个tbs_hank表空间,目录是/data02/pgdata/tbs_hank
create tablespace tbs_hank owner postgres location '/data02/pgdata/tbs_hank';
那么就会再pg_tblspc下面有一个软连接的目录,这里16393就是这个tablespace的OID
postgres@db-192-168-101-115-> pwd
/opt/pgdata9.6/pg_root/pg_tblspc
postgres@db-192-168-101-115-> ll
total 0
lrwxrwxrwx 1 postgres postgres 23 Oct 10 2016 16393 -> /data02/pgdata/tbs_hank
再往下,就可以看到16395,是database的OID
postgres@db-192-168-101-115-> pwd
/opt/pgdata9.6/pg_root/pg_tblspc/16393/PG_9.6_201608131
postgres@db-192-168-101-115-> ls
16395 pgsql_tmp
2.4 数据文件
数据文件
在数据库创建的数据文件对象,如表、索引、视图、函数、序列等都会以文件存储。它们会在创建时被分配一个OID命名,对于大小超过1GB的表数据文件,PostgreSQL会自动将其切分为多个文件来存储,切分出的文件用OID.<顺序号>来命名。不过表文件并不是总是"OID.<顺序号>"命名,实际上真正管理表文件的时pg_class表中的relfilenode字段值,在新创建对象时会在pg_class系统表中插入该表的记录,默认会以OID作为relfilenode值,但经过几次VACUUM、TRUNCATE操作之后,relfilenode值会发生变化。
postgres=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | test | table | postgres
(1 row)
postgres=# select oid,relfilenode from pg_class where relname = 'test';
oid | relfilenode
-------+-------------
16384 | 16384
(1 row)
postgres=# truncate test;
TRUNCATE TABLE
postgres=# checkpoint;
CHECKPOINT
postgres=# select oid,relfilenode from pg_class where relname = 'test';
oid | relfilenode
-------+-------------
16384 | 16399
(1 row)
postgres=# INSERT INTO test(id,name) SELECT n,n || '_francs' from generate_series(1,50000000) n;
INSERT 0 50000000
postgres=# \dt+ test
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+----------+---------+-------------
public | test | table | postgres | 2873 MB |
(1 row)
[postgres@postgresql01 ~]$ ll /pgdata/11.2/data/base/13287/16399*
-rw------- 1 postgres postgres 1073741824 Aug 24 11:11 /pgdata/11.2/data/base/13287/16399
-rw------- 1 postgres postgres 1073741824 Aug 24 11:13 /pgdata/11.2/data/base/13287/16399.1
-rw------- 1 postgres postgres 864206848 Aug 24 11:14 /pgdata/11.2/data/base/13287/16399.2
-rw------- 1 postgres postgres 761856 Aug 24 11:13 /pgdata/11.2/data/base/13287/16399_fsm
-rw------- 1 postgres postgres 8192 Aug 24 11:13 /pgdata/11.2/data/base/13287/16399_vm
上述结果中,后缀为_fsm和_vm的这两个表文件的附属文件是空闲空间映射表文件和可见性映射表文件。空闲空间映射用来映射表文件中可用的空间,可见性映射表文件跟踪哪些页面只包含已知对所有活动事务课件的元组,它也跟踪哪些页面只包含未被冻结的元组。
数据文件和文件结构
2.5 堆表文件的内部结构
在表对应的datafile中,被分离为固定大小的page(or block),默认为8KB,这些page在datafile中从0开始计数,如果一个page被填充满,那么就会生成新的page以添加到文件,所以我们看到的datafile会随着表的增大,也在不断增大。
postgre=# create table heap_t(id int, name varchar(20));
ERROR: syntax error at or near "name"
LINE 1: create table heap_t(id int, name varchar(20));
^
postgre=# create table heap_t(id int,name varchar(20));
CREATE TABLE
postgre=# select pg_relation_size(heap_t);
ERROR: column "heap_t" does not exist
LINE 1: select pg_relation_size(heap_t);
^
postgre=# select pg_relation_size('heap_t')
postgre-# ;
pg_relation_size
------------------
0
(1 row)
postgre=# insert into heap_t values(1);
INSERT 0 1
postgre=#
postgre=# select pg_relation_size('heap_t')
;
pg_relation_size
------------------
8192
(1 row)
postgre=#
一个堆表数据文件的内部结构设计如下图:
一个表的page包括三种类型的数据
1.heap tuple: 存放数据本身,从一个page的末端有序的堆积。
2.line pointer: 一个四字节的行指针,指向每一个heap tuple,也叫item pointer,line pointer是一个简单的数组,索引page的数据文件是从1开始计数,也叫offset number,新的tuple增加到page时,line piniter就在推送到数组中,指向新的tuple.
3.header data: header data是page生成的时候随之产生的,由pageHeaderData定义结构,24个字节长,包含了page的一般信息,主要结构描述如下:
pd_lsn: 存储XLOG最后的改变的这个page的LSN号,是一个8字节的无符号整数,和WAL相关,后续章节会有描述
pd_checksum:存储page的校验和
pd_lower,pd_upper: pd_lower指向line pointer的尾部,pd_upper指向最新heap tuple的开头
pd_special: 此变量用于索引,在表的page中,它指向page的末尾(在索引的page中,它指向特殊空间的开头)
Page Header定义参考:
项 | 定义 |
---|---|
pd_lsn | 它确定和记录了最后更改此页的xlog记录的LSN,把数据页的WAL日志关联,用于恢复数据时校验日志文件和数据文件的一致性 |
pg_flags | 标识页面的数据存储情况 |
pd_special | 指向索引相关数据的开始位置,该项在数据文件中为空,主要是针对不同索引 |
pd_lower | 指向空闲空间的起始位置 |
pd_upper | 指向空闲空间的结束位置 |
pd_pagesize_version | 不同的版本的页的格式可能会不同 |
pd_linp | 行指针数组,它将Item地址指向Tuple的存储位置 |
Special | 如果是索引页,那么根据索引类型的不同存储的数据也不同 |
2.5.1读写tuple的方法
5.1写head tuple
假设我们我们的表只有一个page,这个page里只有一个tuple,如下图,pd_lower指向line pointer尾部,pd_upper指向tuple1的头部,当tuple2插入后,2号line pointer指向tuple2的头部,pd_lower指向了2号line pointer的末尾,pd_upper指向了tuple2的头部,其他的数据(pg_lsn,pg_flags等等)也会适当的被重写。后面章节会详解
5.2 读heap tuple
两种典型的访问方法,顺序扫描和B-tree索引扫描
a. sequential scan:表中的所有page中的所有tuple通过每个page中的所有line pointer依次读取
b. B-tree index can: 每个索引文件都包含index tuple,每个index tuple都是由索引键和一个指向目标heap tuple的point构成的TID所构成,如果索引的键值被找到,那么就从index tuple中获取TID的值去找想要的数据。如以下示例:通过索引的键值Queen,在index tuple中找到对应的TID(block=7,Offset=2),这里的意思就是第七个page的第二个tuple.因此PG不需要在page中进行没有必要的扫描。
索引内部原理
这一章节不介绍索引,为了明白索引工作原理,建议阅读以下帖子:
- Indexes in PostgreSQL — 1
- Indexes in PostgreSQL — 2
- Indexes in PostgreSQL — 3 (Hash)
- Indexes in PostgreSQL — 4 (Btree)
- Indexes in PostgreSQL — 5 (GiST)
- Indexes in PostgreSQL — 6 (SP-GiST)
- Indexes in PostgreSQL — 7 (GIN)
- Indexes in PostgreSQL — 9 (BRIN)
PostgreSQL 同样也支持TID-Scan, Bitmap-Scan, and Index-Only-Scan.
TID-Scan is a method that accesses a tuple directly by using TID of the desired tuple. For example, to find the 1st tuple in the 0-th page within the table, issue the following query:
TID-Scan是一种通过使用所需行的TID直接访问数据的方法。例如,要在表中找到第0个块中的第一个行,请发出以下查询:
sampledb=# SELECT ctid, data FROM sampletbl WHERE ctid = '(0,1)';
ctid | data
-------+-----------
(0,1) | AAAAAAAAA
(1 row)
2.6 软件目录结构
软件安装目录:/usr/local/ppsql
bin:二进制执行文件
include:头文件
lib:动态库文件
share:文档、配置模板、扩展包
2.7 postmaster.pid
[root@yanwei pgdata]# ps -ef|grep postgre
root 2841 2378 0 22:43 pts/0 00:00:00 su - postgre
postgre 2842 2841 0 22:43 pts/0 00:00:00 -bash
postgre 3148 1 0 23:07 pts/0 00:00:00 /usr/local/pgsql10.2/bin/postgrs -D /mydata/pgdata
postgre 3149 3148 0 23:07 ? 00:00:00 postgres: logger process
postgre 3151 3148 0 23:07 ? 00:00:00 postgres: checkpointer process
postgre 3152 3148 0 23:07 ? 00:00:00 postgres: writer process
postgre 3153 3148 0 23:07 ? 00:00:00 postgres: wal writer process
postgre 3154 3148 0 23:07 ? 00:00:00 postgres: autovacuum launcher process
postgre 3155 3148 0 23:07 ? 00:00:00 postgres: stats collector process
postgre 3156 3148 0 23:07 ? 00:00:00 postgres: bgworker: logical replication launcher
postgre 3165 2842 0 23:07 pts/0 00:00:00 psql
postgre 3166 3148 0 23:07 ? 00:00:00 postgres: postgre postgre [local] idle
root 3452 3176 0 23:29 pts/1 00:00:00 grep --color=auto postgre
[root@yanwei pgdata]#
[root@yanwei pgdata]# more postmaster.pid
3148
/mydata/pgdata
1589296057
5432
/tmp
localhost
5432001 65536
ready
3148 | 代表Postgres主进程的PID |
/mydata/pgdata | 代表数据目录 |
1589296057 | 代表postmaster文件的创建时间 |
5432 | 代表数据库监听端口,在postgresql.conf中对应port = 5432 |
/tmp | 代表是unix socket的监听目录,在postgresql.conf中对应 unix_socket_directory = ‘/tmp’ |
*** **: | 代表数据库监听地址,对应postgresql.conf的listen_addresses = '* ’ |
5432001 163840 | 代表的是共享内存的地址(shared memory segments中的key和shmid)。 |
ready | 代表主进程状态 |
[root@yanwei pgdata]# ipcs
------ Message Queues --------
key msqid owner perms used-bytes messages
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x0052e2c1 65536 postgre 600 56 7
------ Semaphore Arrays --------
key semid owner perms nsems
2.8 堆表的内部布局
Heap Table文件的内部布局
表和索引在数据库内部被标记为固定长度的页(数据块)默认大小8K
sdedu@sdedudb=>create table heap t(id int, name varchar(20))
CREATE TABLI
sdedu@sdedudb=>select pg relation size(heap t)
pg relation sIze
(1 row)
sdedu@sdedudb=>insert into heap t values(1)
nserc 1
sdedu@sdedudb=>select pg relation size(heap t)
pg relation size
8192
操作系统块4k