学习这个东西,要知道什么东西放在哪儿,哪儿是查什么东西的时候用到。 日志、数据、控制等在哪儿放着
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的整数倍。