网站开发后台 amp,网站怎么怎么做关键字,百度指数下载,罗庄建设局网站存储架构 专栏内容#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页#xff1a;我的主页 座右铭#xff1a;天行健#xff0c;君子以自强不息#xff1b;地势坤#xff0c;君子以厚德载物. 概述 postgresql 数据库服务运行时#xff0c;数据在磁…存储架构 专栏内容 postgresql内核源码分析 手写数据库toadb 并发编程 个人主页我的主页 座右铭天行健君子以自强不息地势坤君子以厚德载物. 概述 postgresql 数据库服务运行时数据在磁盘上是如何存储的呢这就涉及到了存储架构。 在文件系统中我们可以看到以目录和文件为形式的存储单元这是物理存储架构 这些目录和文件实际上有一定的联系和组织形式比如最外层目录就是集群数据目录每个数据库会有一个目录这就是逻辑存储架构。 逻辑存储架构维护着物理磁盘文件的组织形式物理存储架构是具体的磁盘文件的呈现方式。 逻辑存储架构
命名空间 在逻辑上数据库有几层组织管理命名空间 集簇-表空间tablespace-数据库database-模式schema 其中 模式是数据库内核中通过数据字典来区分所以前三项都是通过存储架构的组织来实现物理上的空间独立。 这在前面内核分析文章中也提到表文件的定位也是通过tablespace/database/relation三级来唯一标识。 对于集簇这个概念通过initdb创建的就是集簇也就是数据存入的目录在数据库服务启动时需要指定它通常叫做PGDATA。 数据文件
用户数据文件 有表索引还有对应的vm,fsm文件都是按照命名空间的层级目录来存储 事务相关数据 由集簇级层级的空间管理在集簇目录下有公共目录存放 其它组织文件 如表空间文件数据字典文件模版库运行日志等文件都是集簇层级的空间进行管理在集簇目录下有各自的目录 配置文件
数据库配置文件 postgresql.conf 客户端访问控制配置文件 pg_hba.conf和pg_ident.conf 辅助文件 如版本文件运行信息文件等都在PGDATA根目录下 物理存储架构 通常用PGDATA来引用用的是可以定义它的环境变量的名字。PGDATA的一个常见位置是/var/lib/pgsql/data。由不同数据库实例所管理的多个集簇可以在同一台机器上共存。在表或者索引超过 1GB 之后它就被划分成1G大小的段。 第一个段的文件名和文件节点相同随后的段被命名为 filenode.1、filenode.2等等。这样的安排避免了在某些有文件大小限制的平台上的问题实际上1GB只是默认的段尺寸。段尺寸可以在编译PostgreSQL时使用配置选项–with-segsize进行调整。原则上空闲空间映射和可见性映射分支也可以要求多个段但实际上这很少发生。每个数据库都会有一个单独的目录其中存放该库的表文件。 集簇文件结构 先初始化一个全新的数据库集簇下面初始化并启动数据库 # 初始化postgres数据库集簇
/opt/postgres/bin/initdb -D pgtest -W# 启动数据库监听端口指定为 8888
/opt/postgres/bin/pg_ctl -D pgtest -l logfile -o -p 8888 start# 以命令行客户端登陆数据库指定端口和数据库
/opt/postgres/bin/psql -p 8888 -d postgres下面是initdb完成后新建了一个表空间后的集簇目录结构 然后为了看到一些文件类型建了临时表unlogged表以及索引 中间省略了一些表的文件列表保留了目录层级和关键的文件。 -- 表空间
create tablespace tblspc_test location /mnt/sda1/data/pgdata/pgtblspc;-- 普通表
create table tbl_account(id integer, name varchar, address varchar, tel varchar);-- 临时表 会话退出后就会删除
create temporary table tmptbl_test(id int, c_id int);-- unlogged 表不会记录WAL恢复时数据全部丢失
create unlogged table unlogtbl_test(c_id int ,consumer varchar);
create index on unlogtbl_test (c_id);经过上面的场景构造之后现在来看一下数据库集簇下的文件和目录层次 [senllanghatch pgdata]$ tree pgtest
pgtest
├── base
│ ├── 1
│ │ ├── 112
│ │ ├── 113
│ │ ├── 1247
│ │ ├── 1247_fsm
│ │ ├── 1247_vm
│ │ ├── 1249
......
│ │ ├── 827
│ │ ├── 828
│ │ ├── pg_filenode.map
│ │ ├── pg_internal.init
│ │ └── PG_VERSION
│ ├── 4
│ │ ├── 112
│ │ ├── 113
│ │ ├── 1247
│ │ ├── 1247_fsm
│ │ ├── 1247_vm
......
│ │ ├── 6238
│ │ ├── 6239
│ │ ├── 826
│ │ ├── 827
│ │ ├── 828
│ │ ├── pg_filenode.map
│ │ └── PG_VERSION
│ └── 5
│ ├── 112
│ ├── 113
│ ├── 1247
│ ├── 1247_fsm
│ ├── 1247_vm
│ ├── 16403
│ ├── 16403_init
│ ├── 16406
│ ├── 16406_init
│ ├── 16407
│ ├── 16407_init
│ ├── 16408
│ ├── 16408_init
│ ├── t3_16409
│ └── t3_16412
......
│ ├── 827
│ ├── 828
│ ├── pg_filenode.map
│ ├── pg_internal.init
│ └── PG_VERSION
├── global
│ ├── 1213
│ ├── 1213_fsm
│ ├── 1213_vm
│ ├── 1214
│ ├── 1232
│ ├── 1233
│ ├── 1260
│ ├── 1260_fsm
│ ├── 1260_vm
......
│ ├── pg_control
│ ├── pg_filenode.map
│ └── pg_internal.init
├── pg_commit_ts
├── pg_dynshmem
├── pg_hba.conf
├── pg_ident.conf
├── pg_logical
│ ├── mappings
│ ├── replorigin_checkpoint
│ └── snapshots
├── pg_multixact
│ ├── members
│ │ └── 0000
│ └── offsets
│ └── 0000
├── pg_notify
├── pg_replslot
├── pg_serial
├── pg_snapshots
├── pg_stat
├── pg_stat_tmp
├── pg_subtrans
│ └── 0000
├── pg_tblspc
│ └── 16388 - /mnt/sda1/data/pgdata/pgtblspc
├── pg_twophase
├── PG_VERSION
├── pg_wal
│ ├── 000000010000000000000001
│ └── archive_status
├── pg_xact
│ └── 0000
├── postgresql.auto.conf
├── postgresql.conf
├── postmaster.opts
└── postmaster.pid
详细介绍
文件/目录描述PG_VERSION一个包含PostgreSQL主版本号的文件base包含每个数据库对应的子目录的子目录current_logfiles记录当前被日志收集器写入的日志文件的文件global包含集簇范围的表的子目录比如pg_databasepg_commit_ts包含事务提交时间戳数据的子目录pg_dynshmem包含被动态共享内存子系统所使用的文件的子目录pg_logical包含用于逻辑复制的状态数据的子目录pg_multixact包含多事务multi-transaction状态数据的子目录用于共享的行锁pg_notify包含LISTEN/NOTIFY状态数据的子目录pg_replslot包含复制槽数据的子目录pg_serial包含已提交的可序列化事务信息的子目录pg_snapshots包含导出的快照的子目录pg_stat包含用于统计子系统的永久文件的子目录pg_stat_tmp包含用于统计信息子系统的临时文件的子目录pg_subtrans包含子事务状态数据的子目录pg_tblspc包含指向表空间的符号链接的子目录pg_twophase包含用于预备事务状态文件的子目录pg_wal包含 WAL 预写日志文件的子目录pg_xact包含事务提交状态数据的子目录postgresql.auto.conf一个用于存储由ALTER SYSTEM 设置的配置参数的文件postmaster.opts一个记录服务器最后一次启动时使用的命令行参数的文件postmaster.pid一个锁文件记录着当前的 postmaster 进程IDPID、集簇数据目录路径、postmaster启动时间戳、端口号、Unix域套接字目录路径Windows上为空、第一个可用的listen_addressIP地址或者*或者为空表示不在TCP上监听以及共享内存段ID服务器关闭后该文件不存在
表空间 在表空间中创建了一个临时表一个普通表还有一个数据库 -- 创建数据库指定存储的表空间
create database test tablespace tblspc_test ;-- 在指定表空间创建临时表
create temporary table tmptbl_test1(id int, c_id int) tablespace tblspc_test;-- 在指定表空间创建普通表
create table tbl_salary(id integer, level float, performance float) tablespace tblspc_test;物理结构 查看表空间目录中文件目录层次和文件列表如下 [senllanghatch pgdata]$ tree pgtblspc/
pgtblspc/
└── PG_16_202306141├── 16389│ ├── 112│ ├── 113│ ├── 1247│ ├── 1247_fsm│ ├── 1247_vm│ ├── 1249│ ├── 1249_fsm│ ├── 1249_vm......│ ├── 826│ ├── 827│ ├── 828│ ├── pg_filenode.map│ └── PG_VERSION└── 5├── 16395└── t3_16413可以看到在表空间的目录下是一个目录 PG_16_202306141,命名以PG开头然后是数据库版本再加创建的日期。 用户定义的表空间都在PGDATA/pg_tblspc目录里面有一个符号连接它指向物理的表空间目录就是在CREATE TABLESPACE命令里指定的那个目录。 这个符号连接是用表空间的 OID 命名的。 原理说明 在物理表空间目录中有一个名称取决于PostgreSQL服务器版本的子目录例如PG_16_202306141使用该子目录的原因是后续版本的数据库可以使用CREATE TABLESPACE指定相同的目录位置而不会造成冲突。 在这个版本相关的子目录中为每个在这个表空间里有元素的数据库都有一个子目录 以数据库的OID命名。该目录里的表和索引遵循文件节点命名模式。 初始化集群后有两个默认的表空间pg_default和pg_global,当我们没有指定表空间时创建的数据库表等都是存放在pg_default表空间。 pg_default不需要通过pg_tblspc来访问而是对应于PGDATA/base。类似地pg_global表空间也不通过pg_tblspc访问而是对应于PGDATA/global。 数据库 对于集簇里的每个数据库在PGDATA/base里都有一个子目录对应子目录的名字为该数据库在 pg_database里的 OID。 这个子目录是该数据库文件的缺省位置特别值得一提的是该数据库的系统目录存储在此。 数据文件 pg_relation_filepath()函数显示任何关系的完整路径相对于PGDATA。 它可以作为记住上面这么多规则的替代方法。 但是记住该函数只给出关系的主分支的第一个段的名称 — 你也许需要追加一个段号或_fsm、_vm、_init来找到与该关系相关的所有文件。 表和索引文件 每个表和索引都存储在独立的文件里。 对于普通表这些文件以表或索引的filenode号命名它可以在pg_class.relfilenode中找到。 临时表 对于临时表文件名的形式为tBBB_FFF其中BBB是创建该文件的后台的后台IDFFF是文件节点号。 空闲空间映射fsm 在每种情况下在主文件a/k/a 主分支之外每个表和索引有一个空闲空间映射它存储表中可用空闲空间的信息。 空闲空间映射存储在一个文件中该文件以节点号加上后缀_fsm命名。 可见性映射vm 表还有一个可见性映射存储在一个该文件以节点号加上后缀为_vm的文件中它用于跟踪哪些页面已知含有非死亡元组。 unlogged 表 不被日志记录的表和索引也就是unloged table 还有第三个分支即初始化分支它存储在该文件以节点号加上后缀为_init的分支文件中。 初始化分支是一个适当类型的空表或空索引。 当一个不被日志记录的表由于崩溃必须被重置为空时初始化分支被随着主分支复制而任何其他分支则被擦除它们会在需要时自动被重建。 toast表 如果一个表的列中可能存储相当大的项那么该表就会有个与之相关联的TOAST表 它用于存储无法保留在在表行中的域值的线外存储。 如果表有TOAST表该表的pg_class.reltoastrelid链接到它的TOAST表; 临时文件 临时文件用于如排序不能放在内存中的数据等操作被创建在PGDATA/base/pgsql_tmp中如果临时文件被指定在一个非pg_default表空间中则它们会被创建在该表空间的pgsql_tmp子目录中。临时文件的名称的形式为pgsql_tmpPPP.NNN其中PPP是其所属后端的PID而NNN用于区别该后端的不同临时文件。 结尾 非常感谢大家的支持在浏览的同时别忘了留下您宝贵的评论如果觉得值得鼓励请点赞收藏我会更加努力 作者邮箱studysenllang.onaliyun.com 如有错误或者疏漏欢迎指出互相学习。
注未经同意不得转载