5.PG的逻辑结构

发布时间 2023-12-19 22:49:50作者: 太白金星有点烦

1.如图

[postgres@iZwz909xeqcc7ouqk8528zZ ~]$ cd $PGDATA
[postgres@iZwz909xeqcc7ouqk8528zZ data]$ ls
base          pg_dynshmem    pg_logical    pg_replslot   pg_stat      pg_tblspc    pg_wal                postgresql.conf  pоstgres
global        pg_hba.conf    pg_multixact  pg_serial     pg_stat_tmp  pg_twophase  pg_xact               postmaster.opts
pg_commit_ts  pg_ident.conf  pg_notify     pg_snapshots  pg_subtrans  PG_VERSION   postgresql.auto.conf  postmaster.pid
[postgres@iZwz909xeqcc7ouqk8528zZ data]$ oid2name 
All databases:
    Oid      Database Name  Tablespace
--------------------------------------
  13892           postgres  pg_default
  16412  readme_to_recover  pg_default
  13891          template0  pg_default
      1          template1  pg_default
  16416              u1_db  pg_default

2.表空间

 Postgresql默认有两个表空间:pg_default和pg_global表空间

 默认表空间:每个cluster默认情况下有2个表空间,分别命名为pg_default用于存放各个数据库私有的数据库对象,pg_global用于存放cluster全局共享的数据库对象信息,例如:cluster中数据库本身的信息,表空间的信息,数据库订阅信息,数据库复制信息,数据库认证授权信息、控制文件等。

 专用表空间:pg_global表空间是专表空间专用的,只能存放全局共享的数据库对象,不能存放用户数据,否则报错

  pg_default,表空间,默认存放cluster下所有数据库的所有数据库对象。这一点儿上,倒是有点儿类似于Oracle数据库的专表空间专用 表空间和数据库的关系:一个表空间可以给多个数据库使用,一个数据库里的不同数据库对象也可以存放在不同的表空间下。表空间和数据库的关系,不严格的讲,可以说是多对多的关系。不像Oracle数据库中,一个数据库可以包含多个表空间,且每个表空间只能属于一个数据库使用

 如何创建表空间?
  
1)OS上路径需提前创建,postgres用户得有读写操作系统文件系统权限,数据库管理员权限。
-- 不要把表空间目录放在data目录下
-bash-4.2$ psql
psql (9.2.24, server 15.3)
WARNING: psql version 9.2, server version 15.0.
         Some psql features might not work.
Type "help" for help.

postgres=# 
postgres=# create tablespace newtbs location '/var/lib/pgsql/15/data/tbs_dir';
WARNING:  tablespace location should not be inside the data directory
CREATE TABLESPACE
postgres=# 

create database newdb tablespace newtbs;
create table test_tbs(id int) tablespace newtbs ;

 修改表空间:
  数据库创建之后,或者数据库对象(表、index等)创建之后,也可以分别通过alter database/table/index来修改表空间信息。

 表空间作用:
 主要用于逻辑上隔离数据库对象,或者用于数据库存储空间规划或迁移存储。想要通过表空间的设置,进而对于数据库性能提升?作用不大,毕竟现在基本上都是直接上SSD(Solid State Drive )存储给数据库使用。
 
3.PG在物理上的结构
  
base                --存放默认数据库的目录
global              --存放的数据库相关的字典视图或者表文件        
pg_commit_ts            --事务存放的提交的时间戳数据
pg_dynshmem     --动态内存分配存放的空间(dynamic share memeory)
pg_hba.conf         --基于主机的配置文件
pg_ident.conf           --基于对等认证的配置文件
pg_logical          --存储数据库内部状态的逻辑解码数据
pg_multixact            --存放多事务状态的数据
pg_notify               --消息通知目录(LISTEN状态目录)
pg_replslot         --存放复制槽的数据
pg_serial               --提交的可串行化事务的状态数据
pg_snapshots            --执行导出快照函数时的状态信息数据
pg_stat                 --统计信息目录
pg_stat_tmp             --临时统计信息目录
pg_subtrans         --子事务目录
pg_tblspc            --表空间映射目录
pg_twophase         --两阶段提交状态的数据
PG_VERSION          --存放主版本编号的文件
pg_wal              --存储 WAL 文件的目录
pg_xact                 --事务提交的状态数据
postgresql.auto.conf --存储通过 ALTER SYSTEM 命令修改的参数文件(可以手动修改)
postgresql.conf       --数据库的参数配置文件
postmaster.opts       --上一次数据库启动状态的命令
postmaster.pid        --存放当前数据库的主进程编号及相关目录及端口的信息
postgres=# select oid,datname from pg_database;
  oid  |      datname      
-------+-------------------
 13892 | postgres
     1 | template1
 13891 | template0
 16412 | readme_to_recover
 16416 | u1_db
(5 rows)

其中oid是唯一标识的,每一个oid代表一个PG数据库物理存储上的一个目录或者文件。