学习这个东西,要知道什么东西放在哪儿,哪儿是查什么东西的时候用到。
日志、数据、控制等在哪儿放着
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的整数倍。
转载于:https://blog.51cto.com/aklaus/2085545