有朋友问文章标题为什么都用“从Oracle到PG”,初衷并非是要将Oracle迁移到PostgreSQL,也许是出于Oracle DBA的习惯,总是有意无意地在写作过程中带点O的思想。
但愿通过两者的横向对比,在PostgreSQL的学习上可以找到一个相对容易理解的切入点,期盼可以对PostgreSQL或Oracle有更深刻的理解。
同样,本篇文章在介绍PostgreSQL体系结构之前,还是想先来回顾一下Oracle的体系结构。
下面这个图来自Oracle 19C 官网:
oracle-19C instance and database
Oracle 19C多租户的体系结构图看起来比较复杂,下面这个简单一点的是11g-R2版本比较经典的体系结构图:
Oracle 体系结构
简单介绍一下,Oracle服务由实例+存储两大模块构成,其中实例由内存结构和一组后台进程组成:
对照Oracle的体系结构,PostgreSQL的体系结构可以分为三大部分:
1.进程结构:一堆后台进程。
2.内存结构:共享内存和私有内存区。
3.存储结构:数据文件、Wal日志、配置文件等物理的实体文件。复制
参考Oracle的结构图,我这里将PostgreSQL体系结构画个图对比:
PostgreSQL-11.5 体系结构图-Aken
一、进程结构
PostgreSQL所有进程都由postmaster主进程fork而来。
PostgreSQL 进程结构
postmaster进程是pg启动时产生的第一个进程,之后由该主进程fork出以下的后台进程:
[postgres@akendb01]$ps -ef | grep postgres
postgres 9187 1 0 17:05 ? 00:00:00 aken/dbapp/pgsql/1105/bin/postmaster -D aken/data/pgsql/1105/data
postgres 9264 9187 0 17:05 ? 00:00:00 postgres: logger --后台日志写进程
postgres 9295 9187 0 17:05 ? 00:00:00 postgres: checkpointer --检查点进程,对应oracle的ckpt进程。
postgres 9297 9187 0 17:05 ? 00:00:00 postgres: background writer --后台写进程,对应Oracle的dbwr进程。
postgres 9298 9187 0 17:05 ? 00:00:00 postgres: walwriter --wal日志写进程,对应Oracle的lgwr进程。
postgres 9299 9187 0 17:05 ? 00:00:00 postgres: autovacuum launcher --autovacuum的检测进程,必要时会通知postmaster进程fork产生autovacuum进程。
postgres 9300 9187 0 17:05 ? 00:00:00 postgres: archiver --wal日志归档进程
postgres 9301 9187 0 17:05 ? 00:00:00 postgres: stats collector --统计信息收集进程
postgres 9302 9187 0 17:05 ? 00:00:00 postgres: logical replication launcher --复制同步相关
复制
当客户端连接DB的时候,首先通过和postmaster通信请求建立连接,postmaster主进程检查客户端进程符合连接条件后fork产生对应的“服务进程”backend process和客户端进程建立session。这里的机制和Oracle的监听进程产生server process比较相似。
二、内存结构
Oracle中划分为PGA和SGA,PostgreSQL也可以划分为私有内存区和共享内存区两大区域。
其中:
私有内存区:temp_buffers、work_mem和maintenance_work_mem,属backend process进程私有。
共享内存区:主要包括:shared_buffers、wal_buffers、commit logs、后台进程也会在共享内存区占用一部分内存。
注意:这里的shared_buffers和Oracle的shared_buffers不一样,目前版本的PostgreSQL不像Oracle的shared_buffer一样用来缓存SQL执行计划,而是像Oracle的buffer cache 一样,用来缓存数据页。
三、存储结构
PostgreSQL的存储结构主要包括各个database的数据文件、wal日志的日志文件、wal的归档文件、提交日志clog files、配置文件(postgresql.conf、postgresql.auto.conf、pg_hba.conf、recovery.conf)。
具体的逻辑和物理结构在接下来的文章做总结整理。
以上是对postgresql体系结构的概括,主要包括三大块:进程结构、内存结构、存储结构。有兴趣的同学可进一步深入研究。
系列回顾
【从Oracle到PG】PostgreSQL-11.5源码编译安装
评论
