实例与数据库聚簇
实例结构
数据库进程
后台写进程(background writer),负责定期将共享缓冲池(shared buffer pool)中的脏页写入磁盘。
检查点进程(checkpointer),发生检查点时负责将检查点记录写入 WAL 段文件,同时刷新共享缓冲池中的脏页。
自动清理启动进程(autovacuum launcher),定期调用工作进程(autovacuum worker)完成清理工作。
WAL 写进程(wal writer),定期将 WAL 缓冲数据写入 WAL 段文件。
统计收集进程(stats collector),收集数据库系统运行的统计信息,PostgreSQL 15 版本优化删除。
归档进程(archiver),负责 WAL 段文件归档,也就是日志归档。
日志收集进程(logger),记录数据库错误日志。
后台写进程
检查点进程
距离上一次检查点操作的时间间隔到达参数 checkpoint_timeout 的配置,默认为 300 秒。
PostgreSQL 9.4 以及更低版本,上一次检查点操作之后写入的 WAL 段文件数据到达参数 checkpoint_segments 的配置,默认值为 3。
PostgreSQL 9.5 以及更高版本,pg_wal(pg_xlog)目录中 WAL 段文件总大小超过参数 max_wal_size 的配置,默认值为 1 GB。
PostgreSQL 数据库服务以 smart(SIGTERM)或者 fast(SIGINT)模式关闭。
超级用户或者 pg_checkpoint 特权用户手动执行 CHECKPOINT 命令。
自动清理启动进程
WAL 写进程
统计收集进程
归档进程
日志收集进程
内存结构
共享内存区(Shared Memory Area)。
本地内存区(Local Memory Area)。
共享内存区
本地内存区
存储结构
物理存储
SHOW data_directory;
data_directory |
-----------------------------------+
D:/Program Files/PostgreSQL/17/data|
PS D:\Program Files\PostgreSQL\17\data> ls
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2024/6/17 10:44 base
d----- 2024/7/11 14:35 global
d----- 2024/7/22 17:08 log
d----- 2024/6/17 10:44 pg_commit_ts
d----- 2024/6/17 10:44 pg_dynshmem
d----- 2024/7/11 14:39 pg_logical
d----- 2024/6/17 10:44 pg_multixact
d----- 2024/6/17 10:44 pg_notify
d----- 2024/6/17 10:44 pg_replslot
d----- 2024/6/17 10:44 pg_serial
d----- 2024/6/17 10:44 pg_snapshots
d----- 2024/7/11 14:34 pg_stat
d----- 2024/6/17 10:44 pg_stat_tmp
d----- 2024/6/17 10:44 pg_subtrans
d----- 2024/6/17 10:44 pg_tblspc
d----- 2024/6/17 10:44 pg_twophase
d----- 2024/6/17 10:44 pg_wal
d----- 2024/6/17 10:44 pg_xact
-a---- 2024/7/23 17:16 45 current_logfiles
-a---- 2024/6/17 10:44 5639 pg_hba.conf
-a---- 2024/6/17 10:44 2712 pg_ident.conf
-a---- 2024/6/17 10:44 3 PG_VERSION
-a---- 2024/6/17 10:44 90 postgresql.auto.conf
-a---- 2024/6/17 10:44 31602 postgresql.conf
-a---- 2024/7/11 14:34 91 postmaster.opts
-a---- 2024/7/11 14:34 70 postmaster.pid
项目 | 类型 | 描述 |
---|---|---|
base | 目录 | 包含多个子目录,每个目录对应一个数据库。 |
global | 目录 | 存储全局(聚簇)级别的数据表,例如 pg_database 等。控制文件也存储在这个目录中。 |
log | 目录 | 存储服务器日志信息。 |
pg_commit_ts | 目录 | 保存事务提交时间戳数据。 |
pg_dynshmem | 目录 | 存储动态共享内存子系统使用的文件。 |
pg_logical | 目录 | 存储逻辑解码状态数据。 |
pg_multixact | 目录 | 存储用于共享行锁的多事务(multitransaction)状态数据。 |
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 | 目录 | 存储事务提交状态数据。 |
current_logfiles | 文件 | 记录当前写入的服务器日志文件。 |
pg_hba.conf | 文件 | 客户端认证配置文件。 |
pg_ident.conf | 文件 | 用户名映射文件。 |
PG_VERSION | 文件 | 记录 PostgreSQL 主版本号。 |
postgresql.auto.conf | 文件 | 存储使用 ALTER SYSTEM 命令设置的参数信息。 |
postgresql.conf | 文件 | 主配置参数文件。 |
postmaster.opts | 文件 | 记录服务器上次启动时使用的命令行选项。 |
postmaster.pid | 文件 | 记录主服务进程 ID,数据库聚簇根目录,主服务进程启动时间戳,服务端口、Unix 域套接字目录(可空),第一个有效的监听地址以及共享内存段 ID 等信息。该文件在服务启动时创建,服务停止时删除。 |
PS D:\Program Files\PostgreSQL\17\data\base> ls
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2024/6/20 9:09 1
d----- 2024/6/17 10:44 4
d----- 2024/7/11 14:35 5
select oid, datname
from pg_database;
oid|datname |
---+---------+
5|postgres |
1|template1|
4|template0|
SELECT pg_relation_filepath('public.animal');
pg_relation_filepath|
--------------------+
base/5/73734 |
表空间
如果数据库集群所在的初始磁盘分区或磁盘卷的空间不足,又无法进行扩展,可以在其他分区上创建一个新的表空间以供使用。
管理员可以根据数据库对象的使用统计优化系统的性能。例如,可以将访问频繁的索引存放到一个非常快速且可靠的磁盘上,比如昂贵的固态硬盘。与此同时,将很少使用或者对性能要求不高的归档数据表存储到廉价的低速磁盘上。
pg_default, template1 和 template0 默认的表空间,也是创建其他数据库时的默认表空间;对应的目录为 PGDATA/base。
pg_global,用于存储一些集群级别的共享系统表(system catalogs),例如 pg_database、pg_control;对应的目录为 PGDATA/global。
CREATE TABLE ...
TABLESPACE ts_name;
逻辑存储
存储引擎
SHOW default_table_access_method;
default_table_access_method|
---------------------------+
heap |
CREATE TABLE ...
USING method;