postgresql-体系结构
1、体系结构
体系结构主要由实例和存储结构组成,而实例由进程和内存结构组成;存储结构分为逻辑存储结构和物理存储结构。
2、进程结构
查看运行进程信息
$ ps -ef | grep postgre
postgres 1161 1 0 15:10 ? 00:00:00 /opt/postgres/bin/postgres -D /pgdata
postgres 1163 1161 0 15:10 ? 00:00:00 postgres: checkpointer
postgres 1164 1161 0 15:10 ? 00:00:00 postgres: background writer
postgres 1165 1161 0 15:10 ? 00:00:00 postgres: walwriter
postgres 1166 1161 0 15:10 ? 00:00:00 postgres: autovacuum launcher
postgres 1167 1161 0 15:10 ? 00:00:00 postgres: stats collector
postgres 1168 1161 0 15:10 ? 00:00:00 postgres: logical replication launcher
- portmaster 主进程,是整个数据库实例的总控制进程,负责启动和关闭数据库实例。通过运行 postgres 命令加上合适的参数启动数据库。实际上,postmaster 命令是一个指向 postgres 的链接。虽然平时更多的是使用 pg_ctl 启动数据库,实际上也是通过运行 postgres 启动数据库,只是做了一些封装,更容易操作数据库实例。postmaster 会 fork 一些与数据库实例相关的辅助子进程,并管理它们。
查看进行信息
test=# select pid,wait_event,backend_type from pg_stat_activity;
- syslogger 进程,在 postgresql.conf 里启用运行日志 pg_log 后,会有syslogger 进程。syslogger 进程会在日志文件达到指定的大小时关闭当前的日志文件,产生新的日志文件。
postgersql.conf 中配置参数如下:
log_destination : 配置日志输出目标,不同的运行平台对应不同的值,Linux 默认为stderr。
logging_collector : 是否开启日志收集器,设置为 on 时启动日志功能,否则将不产生系统日志辅助进程。
log_directory : 配置日志输出文件夹。
log_filename : 配置日志文件名称命名规则。
log_rotation_size : 配置日志文件大小。达到这个大小,即创建一个日志文件记录日志信息。
-
bgwriter 后台写进程,在后台将脏页刷新到磁盘的辅助进程。
-
walwriter 预写式日志WAL,先记录日志后写数据。
-
pgarch 归档进程,从 postgresql 8.X 开始,有了 PITR(point-in-time-recovery)技术,该技术支持将数据库恢复到其运行历史中任意一个有记录的时间点;PITR 另一个重要的就是对WAL文件进行归档。postgresql 默认是非归档模式,需要启用。
-
autovacuum 自动清理进程,在 PG 数据库中,对数据进行update 或者delete 操作,数据库不会立即删除旧版本的数据,而是标记为删除状态。支持多版本机制,当旧版本数据没有价值了,需要清理垃圾数据腾出空间。
-
pgstat 统计信息收集进程,收集数据库运行期间的统计信息。
-
checkpoint 检查点进程。
3、内存结构
内存结构分为本地内存和共享内存。
本地内存(PGA):每个后端进程自己使用的。
-
work_mem,使用 work_mem 区域用于对元组的排序,比如 order by、distinct 操作。也用于表的 join 操作,比如 merge-join、hash-join 操作,默认是 4MB。
-
maintenance_work_mem 用于一些维护操作。比如 vacuum、reindex、alter table add foreign key。默认64MB。
-
temp_buffers 存放临时表,默认是8MB。该参数设置每个数据库会话使用的临时缓冲区的最大值。
共享内存(SGA),所有进程共同使用。
-
shared buffer PG将表和索引中的页面从持久存储加载到共享缓冲池中进行操作,默认128MB。
-
wal buffer 存放wal数据
-
commit log 提交日志保存所有事物的状态,是并发控制机制的一部分。事务有 in_progress、commited、aborted、sub-commited 四种状态。
4、存储结构
-
逻辑存储结构是内部的组织和管理数据的方式;
-
物理存储结构是操作系统中组织和管理数据的方式。
4.1 逻辑存储结构
所有数据库对象都有各自的oid(object identifiers),oid是一个无符号的四字节整数,数据库的oid和表的oid分别存放在pg_database,pg_class表中。
-
数据库,在PG中,数据库本身也是数据库对象,并且在逻辑上彼此分离,除数据库之外的其他数据库对象,例如表、索引等,都属于他们各自的数据库。
-
表空间, 数据库在逻辑上分成多个存储单元,称作表空间。表空间用作把逻辑上相关的结构放在一起。数据库逻辑上是由一个或多个表空间组成。初始化会自动创建pg_default和pg_global两个表空间。
postgres=# db
List of tablespaces
Name | Owner | Location
------------+----------+------------------------
pg_default | postgres |
pg_global | postgres |
(2 rows)
其中:
pg_global:用于存放系统表。
pg_default:该表空间的物理文件存储在数据目录中的base目录中。
创建自己的表空间
创建自己的表空间,并在该表空间上创建表
create tablespace testdb location '/data/postgres/data/tbs';
create table test_table(tid int primary key,tname text) tablespace testdb;
- 模式,当创建一个数据库时,会为其创建一个名为public的默认schema。schema是数据库中的命名空间,在数据库中创建的所有对象都是在schema中创建。
查看当前数据库的模式
postgres=# dn
List of schemas
Name | Owner
--------+----------
public | postgres
-
段,一个段是分配给一个逻辑结构(一个表、一个索引或其他对象)的一组区,是数据库对象使用的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。
-
区,区是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。第一个段是由一个或多个盘区组成。当一段中间所有空间已完全使用,PostgreSQL为该段分配一个新的范围。
-
块(页),数据块是PostgreSQL 管理数据文件中存储空间的单位,为数据库使用的I/O的最小单位,是最小的逻辑部件。默认值8K。
-
数据库对象,如:表、视图、索引、序列、函数等等。在PostgreSQL中的所有数据库对象都由各自的对象标识符(OID)进行内部的管理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现