postgres物理存储结构

学习这个东西,要知道什么东西放在哪儿,哪儿是查什么东西的时候用到。
日志、数据、控制等在哪儿放着

postgres数据库目录

这个目录应该是在安装完成pg初始化的时候写的、启动的时候需要指定或者需要你配置环境变量有PGDATA

export PGDATA=/opt/postgres/ 这样就可以生效
initdb -D /opt/postgres/ 初始化配置pgdata
pg_ctl -D $PGDATA start 或者 pg_ctl -D /opt/postgres start

当然,有可能你是从客户端连接到数据库的,并不知道数据库开启时的命令, 你可以通过超级用户登陆 postgresql,运行下面语句来获取 PGDATA

show data_directory;

PGDATA 目录结构

首先我们来看一下 PGDATA 文件夹里面都有那些文件:

$ tree -FL 1 /opt/postgres
/opt/postgres/
├── base/
├── global/
├── pg_clog/
├── pg_commit_ts/
├── pg_dynshmem/
├── pg_hba.conf
├── pg_ident.conf
├── pg_logical/
├── pg_multixact/
├── pg_notify/
├── pg_replslot/
├── pg_serial/
├── pg_snapshots/
├── pg_stat/
├── pg_stat_tmp/
├── pg_subtrans/
├── pg_tblspc/
├── pg_twophase/
├── PG_VERSION
├── pg_xlog/
├── postgresql.auto.conf
├── postgresql.conf
├── postmaster.opts
└── postmaster.pid

17 directories, 7 files
说明其中:

base/:存储 database 数据(除了指定其他表空间的)
global/:存储 cluster-wide 表格数据
pg_clog/:存储事务提交的状态数据
pg_commit_ts/:存储事务提交的时间戳数据
pg_dynshmem/:存储动态共享内存子系统的文件
pg_hba.conf:postgresql 配置文件
pg_ident.conf:postgresql 配置文件
pg_logical/:存储 logical decoding 状态数据
pg_multixact/:存储多重事务状态数据的子目录(用于共享的行锁)
pg_notify/:存储 LISTEN/NOTIFY 状态数据
pg_replslot/:存储 replication slot 数据
pg_serial/:存储 committed serializable transactions 信息
pg_snapshots/:存储导出的 snapshots
pg_stat/:存储统计子系统的永久文件
pg_stat_tmp/:存储统计子系统的临时文件
pg_subtrans/:存储子事务状态数据
pg_tblspc/:存储指向表空间的符号链接
pg_twophase/:存储 prepared transactions 的状态文件
PG_VERSION:存储 postgresql 数据库的主版本号
pg_xlog/:存储 WAL (Write Ahead Log) 文件
postgresql.auto.conf:存储由 ALTER SYSTEM 设置的配置
postgresql.conf:postgresql 配置文件
postmaster.opts:存储上一次启动该数据库时用到的命令
postmaster.pid:锁文件,只有在 postgresql 服务运行时存在,存储当前 postmaster 的 PID,PGDATA,postmaster 启动时间,端口号,Unix-domain socket 目录,第一个有效的 listen_address,共享内存的 segment ID

数据文件存储

postgresql 数据库中,每一个对象都对应一个 OID 唯一标识, 而每一个 database 的目录名就存储在与其对应的 OID 目录中: PGDATA/base/oid, 我们可以查询每一个 database 的 OID

postgres=# SELECT OID,DATNAME FROM PG_DATABASE;
oid | datname
-------+-----------
1 | template1
13290 | template0
13295 | postgres
16384 | aoldbs
(4 rows)

postgres=# \c aoldbs 连接到库
You are now connected to database "aoldbs" as user "postgres".
aoldbs=# \dt 这个是我的表
List of relations
Schema | Name | Type | Owner
--------+-----------------------+-------+----------
public | persons | table | postgres
public | sales_detail | table | postgres
public | sales_detail_y2014m01 | table | postgres
public | sales_detail_y2014m02 | table | postgres
public | sales_detail_y2014m03 | table | postgres
public | sales_detail_y2014m04 | table | postgres
public | sales_detail_y2014m05 | table | postgres
public | students | table | postgres
public | test01 | table | postgres
public | testtab01 | table | postgres
这样我就可以看到我的persons表的数据都存放于/opt/postgres/base/16384里边

table 数据存储在哪里?

所有的 table 数据存储在所在数据库的目录里面,table 们是分开存放的, 每一个存储 table 的文件均用 pg_class.relfilenode 命名。两种办法查看具体的位置

aoldbs=# select relfilenode from pg_class where relname ='persons';
AOLDBS
relfilenode
16396
(1 row)
aoldbs=# select pg_relation_filepath('persons');
AOLDBS
pg_relation_filepath
base/16384/16396
(1 row)

为了避免有些文件系统不支持大文件,postgresql 限制标文件大小不能超过 1G, 因此,当表文件超过 1G 时,会另建一有尾缀文件 relfilenode.1,relfilenode.2, 并以此类推。

当你查看 PGDATA/base/16384/ 目录时, 会发现有些文件命名为 relfilenode_fsm、relfilenode_vm、relfilenode_init, 它们是用来存储与表格相关的 free space map 、visibility map 和 unlogged table 的 initialization fork。

在大多数情况下,表中数据的存放是无序的,我们称之为堆表,heap table.
多条数据一起存放在一个page中,多个page形成一个数据文件,pg中最小的io单位为page,所有每个文件的大小一定是page size的整数倍。

another special topic 文件结构
another special topic 控制文件结构

转载于:https://blog.51cto.com/aklaus/2085545

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值