存储结构。数据库一般有逻辑存储结构和物理存储结构。逻辑存储结构包括:表,试图,索引,函数等等。物理存储结构:表示数据库如何存储。
一、逻辑存储结构¶

几个概念:
-
database cluster:实际指的是数据库簇,跟数据库集群不一样
-
库簇相当于是一个数据库的容器,可以在容器中创建很多数据库,所以:PostgreSQL中的database与 MySQL中的Database完全不是一个概念,PostgreSQL的Database是一个多租户的概念
postgresql在Database下,可以有多个模式(Schema)

二、物理存储结构¶
在数据库目录下 ls 可以看到非常多的数据目录
postgresql.conf:此数据库实例的主配置文件,基本上所有的配置参数都在此文件中。
postgresql.auto.conf:使用ALTERSYSTEM修改的配置参数存储在该文件中:比如alter system set
work_mem=327680;
pg_hba.conf:认证配置文件,用于配置允许哪些IP的主机访问数据库、认证的方法是什么等信息。
pg_ident.conf:ident认证方式的用户映射文件。
PG_VERSION:存储PostgreSQL主版本号。
postmaster.opts:记录服务器上次启动的命令行参数。此目录下还会生成如下子目录。
base:默认表空间的目录。
·global:一些共享系统表的目录。
log:程序日志目录,在查询一些系统错误时可查看此目录下的日志文件。在10版本之前此目录是“pg_log”。
pg_commit_ts:视图提交的时间戳数据(PostgreSQL 9.5及更高版本)。
pg_dynshmem:动态共享内存子系统使用的文件(PostgreSQL 9.4及更高版本)。
pg_logical:逻辑复制的状态数据(PostgreSQL 9.4及更高版本)。
pg_multixact:多事务状态数据。
pg_notify:LISTEN/NOTIFY状态数据。
pg_repslot:复制槽数据(PostgreSQL9.4及更高版本)。
pg_serial:已提交的可串行化事务相关信息(PostgreSQL 9.1及更高版本)。
pg_snapshot:PostgreSQL函数“pg_export_snapshot”导出的快照信息文件(PostgreSQL 9.2及更高版本)。
pg_stat:统计子系统的永久文件。
pg_stat_tmp:统计子系统的永久文件。
pg_subtrans:子事务状态数据。
pg_tblsp:存储了指向各个用户自建表空间实际目录的链接文件。
pg_twophase:使用两阶段提交功能时分布式事务的存储目录。
pg_wal:WAL日志的目录,在PostgreSQL10版本之前此目录是“pg_xlog”。
pg_xact:Commit Log的目录,在PostgreSQL 10版本之前此目录是“pg_clog”
三、数据存放默认表空间 base¶
在默认表空间的base目录下有很多子目录,这些子目录的名称与相应数据库的OID相同
select oid, datname from pg_database;
四、查看表空间¶
如何查看表空间对应的数据库
select * from pg_tablespace;
查看数据库对应表空间信息
select oid, datname ,dattablespace from pg_database;
指定表空间创建数据目录进到表空间查看oid对应情况
select * from pg_tablespace;
查看数据库对应表空间信息
select oid, datname ,dattablespace from pg_database;
存放着“test”这个数据库的 表、索引等数据文件。每个表或索引都会分配一个文件号relfilenode,数据文件格式则以“<relfilenode>[.顺序 号]”命名,每个文件最大为1GB,当表或索引的内容大于1GB时,就会从1开始生成顺序号。所以一张表的数据 文件的路径为:
<默认表空间的目录>/<database oid> /<relfilenode>[.顺序号]
一张表或索引的“relfilenode”是记录在系统表pg_lass的relfilenode字段中的
select relnamespace, relname, relfilenode from pg_class where relname='test';
五、表空间的目录¶
用户创建的表空间,相当于一个对应的目录,在创建完一个表空间后,会在表空间的根目录下生成带有 “Catalog version”的子目录, 新建表空间时,可以将表空间的物理存储位置,定义至与默认表空间物理位置不同的磁盘上,以实现IO分布的 效果
示例如下
创建一个表空间:
CREATE TABLESPACE my_tablespace LOCATION '/home/postgresql/test';
生成一个目录:PG_15_202107181
15代表版本,202107181 Catalog version
在“PG_15_202107181”子目录下,又会有一些子目录,这些子目录的名称就是数据库的oid
查询表空间所在的数据目录:
SELECT oid,spcname AS "Name",pg_catalog.pg_get_userbyid(spcowner) AS "Owner",pg_catalog.pg_tablespace_location(oid) AS "Location" FROM pg_catalog.pg_tablespace;
CREATE DATABASE database_test TABLESPACE my_tablespace;
查看数据库所在的表空间
SELECT db.oid dboid,db.datname dbname,db.dattablespace spcoid,spc.spcname spcname
FROM pg_database db,pg_tablespace spc
WHERE db.dattablespace=spc.oid
AND db.datname='database_test';
\c database_test
CREATE TABLE my_table (id int PRIMARY KEY);
查看表对应的relfilenode
select relnamespace, relname, relfilenode from pg_class where relname='my_table';
也可以指定创建表到指定表空间,临时解决一下磁盘空间没法扩容或者,表io比较重不影响其他正常业务的情况下
CREATE TABLE my_table11 (id SERIAL PRIMARY KEY) TABLESPACE my_tablespace;
#查看表空间
SELECT t.relname AS table_name, s.spcname AS tablespace_name
FROM pg_class t
JOIN pg_tablespace s ON t.reltablespace = s.oid where t.relname='my_table11';
#查看表的fileid
##先查询 数据库的oid
SELECT db.oid dboid,db.datname dbname,db.dattablespace spcoid,spc.spcname spcname
FROM pg_database db,pg_tablespace spc
WHERE db.dattablespace=spc.oid
AND db.datname='hhh';
##然后查询文件id
select relnamespace, relname, relfilenode from pg_class where relname='my_table11';
##在独立表空间目录下查找文件id